From a7387b127d642de93634160fb796a2c9ec332bd4 Mon Sep 17 00:00:00 2001 From: Matt Carroll Date: Wed, 24 Jul 2019 13:44:13 -0700 Subject: [PATCH] Added demo projects for splash screen support on Android. (#35728) --- dev/automated_tests/pubspec.yaml | 4 +- dev/benchmarks/complex_layout/pubspec.yaml | 4 +- dev/benchmarks/macrobenchmarks/pubspec.yaml | 4 +- dev/benchmarks/microbenchmarks/pubspec.yaml | 4 +- dev/bots/pubspec.yaml | 4 +- dev/devicelab/README.md | 13 ++ ...ndroid_splash_screen_integration_test.dart | 12 ++ .../lib/tasks/integration_tests.dart | 7 + dev/devicelab/manifest.yaml | 6 + dev/devicelab/pubspec.yaml | 4 +- .../android_semantics_testing/pubspec.yaml | 4 +- .../splash_screen_kitchen_sink/.gitignore | 72 +++++++ .../splash_screen_kitchen_sink/.metadata | 10 + .../splash_screen_kitchen_sink/README.md | 23 +++ .../android/app/build.gradle | 65 ++++++ .../android/app/src/debug/AndroidManifest.xml | 7 + .../android/app/src/main/AndroidManifest.xml | 33 +++ .../FlutterZoomSplashScreen.java | 64 ++++++ .../FlutterZoomSplashView.java | 156 ++++++++++++++ .../MainActivity.java | 190 ++++++++++++++++++ .../res/drawable-land/launch_background.xml | 13 ++ .../main/res/drawable/launch_background.xml | 13 ++ .../main/res/drawable/normal_background.xml | 4 + .../src/main/res/drawable/splash_screen.xml | 11 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 544 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 442 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 721 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 1031 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 1443 bytes .../app/src/main/res/values/styles.xml | 10 + .../app/src/profile/AndroidManifest.xml | 7 + .../android/build.gradle | 29 +++ .../android/gradle.properties | 3 + .../gradle/wrapper/gradle-wrapper.properties | 6 + .../android/settings.gradle | 15 ++ .../splash_screen_kitchen_sink/lib/main.dart | 114 +++++++++++ .../splash_screen_kitchen_sink/pubspec.yaml | 132 ++++++++++++ .../test/widget_test.dart | 30 +++ .../test_driver/main.dart | 54 +++++ .../test_driver/main_test.dart | 77 +++++++ .../splash_screen_load_rotate/.gitignore | 72 +++++++ .../splash_screen_load_rotate/.metadata | 10 + .../splash_screen_load_rotate/README.md | 7 + .../android/app/build.gradle | 65 ++++++ .../android/app/src/debug/AndroidManifest.xml | 7 + .../android/app/src/main/AndroidManifest.xml | 28 +++ .../MainActivity.java | 38 ++++ .../NeverEndingSplashView.java | 110 ++++++++++ .../SplashScreenThatNeverEnds.java | 55 +++++ .../main/res/drawable/launch_background.xml | 9 + .../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 .../android/app/src/main/res/values/ids.xml | 4 + .../app/src/main/res/values/styles.xml | 8 + .../app/src/profile/AndroidManifest.xml | 7 + .../android/build.gradle | 29 +++ .../android/gradle.properties | 3 + .../gradle/wrapper/gradle-wrapper.properties | 6 + .../android/settings.gradle | 15 ++ .../splash_screen_load_rotate/lib/main.dart | 111 ++++++++++ .../splash_screen_load_rotate/pubspec.yaml | 93 +++++++++ .../test/widget_test.dart | 30 +++ .../splash_screen_trans_rotate/.gitignore | 72 +++++++ .../splash_screen_trans_rotate/.metadata | 10 + .../splash_screen_trans_rotate/README.md | 7 + .../android/app/build.gradle | 65 ++++++ .../android/app/src/debug/AndroidManifest.xml | 7 + .../android/app/src/main/AndroidManifest.xml | 33 +++ .../MainActivity.java | 47 +++++ .../VeryLongTransitionSplashScreen.java | 64 ++++++ .../VeryLongTransitionSplashView.java | 125 ++++++++++++ .../main/res/drawable/launch_background.xml | 12 ++ .../main/res/drawable/normal_background.xml | 4 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 544 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 442 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 721 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 1031 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 1443 bytes .../app/src/main/res/values/colors.xml | 4 + .../android/app/src/main/res/values/ids.xml | 4 + .../app/src/main/res/values/styles.xml | 12 ++ .../app/src/profile/AndroidManifest.xml | 7 + .../android/build.gradle | 29 +++ .../android/gradle.properties | 3 + .../gradle/wrapper/gradle-wrapper.properties | 6 + .../android/settings.gradle | 15 ++ .../splash_screen_trans_rotate/lib/main.dart | 111 ++++++++++ .../splash_screen_trans_rotate/pubspec.yaml | 132 ++++++++++++ .../test/widget_test.dart | 30 +++ .../test_driver/main.dart | 7 + .../test_driver/main_test.dart | 28 +++ .../android_views/pubspec.yaml | 4 +- dev/integration_tests/channels/pubspec.yaml | 4 +- dev/integration_tests/codegen/pubspec.yaml | 4 +- .../external_ui/pubspec.yaml | 4 +- dev/integration_tests/flavors/pubspec.yaml | 4 +- .../image_loading/pubspec.yaml | 4 +- .../platform_interaction/pubspec.yaml | 4 +- dev/integration_tests/ui/pubspec.yaml | 4 +- dev/snippets/pubspec.yaml | 4 +- examples/catalog/pubspec.yaml | 4 +- examples/flutter_gallery/pubspec.yaml | 4 +- examples/platform_channel/pubspec.yaml | 4 +- examples/platform_channel_swift/pubspec.yaml | 4 +- .../lib/src/commands/update_packages.dart | 3 +- packages/flutter_tools/pubspec.yaml | 10 +- 109 files changed, 2764 insertions(+), 46 deletions(-) create mode 100644 dev/devicelab/bin/tasks/android_splash_screen_integration_test.dart create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/.gitignore create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/.metadata create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/README.md create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/app/build.gradle create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/app/src/debug/AndroidManifest.xml create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/app/src/main/AndroidManifest.xml create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/app/src/main/java/io/flutter/splash_screen_kitchen_sink/FlutterZoomSplashScreen.java create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/app/src/main/java/io/flutter/splash_screen_kitchen_sink/FlutterZoomSplashView.java create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/app/src/main/java/io/flutter/splash_screen_kitchen_sink/MainActivity.java create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/app/src/main/res/drawable-land/launch_background.xml create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/app/src/main/res/drawable/launch_background.xml create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/app/src/main/res/drawable/normal_background.xml create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/app/src/main/res/drawable/splash_screen.xml create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/app/src/main/res/values/styles.xml create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/app/src/profile/AndroidManifest.xml create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/build.gradle create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/gradle.properties create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/settings.gradle create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/lib/main.dart create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/pubspec.yaml create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/test/widget_test.dart create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/test_driver/main.dart create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/test_driver/main_test.dart create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_load_rotate/.gitignore create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_load_rotate/.metadata create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_load_rotate/README.md create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/app/build.gradle create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/app/src/debug/AndroidManifest.xml create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/app/src/main/AndroidManifest.xml create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/app/src/main/java/io/flutter/splash_screen_load_rotate/MainActivity.java create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/app/src/main/java/io/flutter/splash_screen_load_rotate/NeverEndingSplashView.java create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/app/src/main/java/io/flutter/splash_screen_load_rotate/SplashScreenThatNeverEnds.java create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/app/src/main/res/drawable/launch_background.xml create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/app/src/main/res/values/ids.xml create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/app/src/main/res/values/styles.xml create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/app/src/profile/AndroidManifest.xml create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/build.gradle create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/gradle.properties create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/settings.gradle create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_load_rotate/lib/main.dart create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_load_rotate/pubspec.yaml create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_load_rotate/test/widget_test.dart create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/.gitignore create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/.metadata create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/README.md create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/app/build.gradle create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/app/src/debug/AndroidManifest.xml create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/app/src/main/AndroidManifest.xml create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/app/src/main/java/io/flutter/splash_screen_trans_rotate/MainActivity.java create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/app/src/main/java/io/flutter/splash_screen_trans_rotate/VeryLongTransitionSplashScreen.java create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/app/src/main/java/io/flutter/splash_screen_trans_rotate/VeryLongTransitionSplashView.java create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/app/src/main/res/drawable/launch_background.xml create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/app/src/main/res/drawable/normal_background.xml create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/app/src/main/res/values/colors.xml create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/app/src/main/res/values/ids.xml create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/app/src/main/res/values/styles.xml create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/app/src/profile/AndroidManifest.xml create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/build.gradle create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/gradle.properties create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/settings.gradle create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/lib/main.dart create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/pubspec.yaml create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/test/widget_test.dart create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/test_driver/main.dart create mode 100644 dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/test_driver/main_test.dart diff --git a/dev/automated_tests/pubspec.yaml b/dev/automated_tests/pubspec.yaml index 394f362cc9..219092e34d 100644 --- a/dev/automated_tests/pubspec.yaml +++ b/dev/automated_tests/pubspec.yaml @@ -34,7 +34,7 @@ dependencies: meta: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" mime: 0.9.6+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" multi_server_socket: 1.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - node_preamble: 1.4.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + node_preamble: 1.4.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" package_config: 1.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" package_resolver: 1.0.10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" path: 1.6.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -67,4 +67,4 @@ flutter: assets: - icon/ -# PUBSPEC CHECKSUM: c729 +# PUBSPEC CHECKSUM: b02a diff --git a/dev/benchmarks/complex_layout/pubspec.yaml b/dev/benchmarks/complex_layout/pubspec.yaml index 7aa11fb381..632ded5bf1 100644 --- a/dev/benchmarks/complex_layout/pubspec.yaml +++ b/dev/benchmarks/complex_layout/pubspec.yaml @@ -58,7 +58,7 @@ dev_dependencies: matcher: 0.12.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" mime: 0.9.6+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" multi_server_socket: 1.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - node_preamble: 1.4.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + node_preamble: 1.4.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" package_config: 1.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" package_resolver: 1.0.10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" pedantic: 1.8.0+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -82,4 +82,4 @@ flutter: - packages/flutter_gallery_assets/people/square/ali.png - packages/flutter_gallery_assets/places/india_chettinad_silk_maker.png -# PUBSPEC CHECKSUM: 78b8 +# PUBSPEC CHECKSUM: 61b9 diff --git a/dev/benchmarks/macrobenchmarks/pubspec.yaml b/dev/benchmarks/macrobenchmarks/pubspec.yaml index dba376c3c3..f82755a597 100644 --- a/dev/benchmarks/macrobenchmarks/pubspec.yaml +++ b/dev/benchmarks/macrobenchmarks/pubspec.yaml @@ -58,7 +58,7 @@ dev_dependencies: matcher: 0.12.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" mime: 0.9.6+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" multi_server_socket: 1.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - node_preamble: 1.4.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + node_preamble: 1.4.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" package_config: 1.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" package_resolver: 1.0.10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" pedantic: 1.8.0+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -79,4 +79,4 @@ dev_dependencies: flutter: uses-material-design: true -# PUBSPEC CHECKSUM: 78b8 +# PUBSPEC CHECKSUM: 61b9 diff --git a/dev/benchmarks/microbenchmarks/pubspec.yaml b/dev/benchmarks/microbenchmarks/pubspec.yaml index 7415529944..4b77a0375f 100644 --- a/dev/benchmarks/microbenchmarks/pubspec.yaml +++ b/dev/benchmarks/microbenchmarks/pubspec.yaml @@ -41,7 +41,7 @@ dependencies: matcher: 0.12.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" mime: 0.9.6+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" multi_server_socket: 1.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - node_preamble: 1.4.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + node_preamble: 1.4.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" package_config: 1.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" package_resolver: 1.0.10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" path: 1.6.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -73,4 +73,4 @@ dependencies: flutter: uses-material-design: true -# PUBSPEC CHECKSUM: 398e +# PUBSPEC CHECKSUM: 468f diff --git a/dev/bots/pubspec.yaml b/dev/bots/pubspec.yaml index 2710a88a17..b00955df18 100644 --- a/dev/bots/pubspec.yaml +++ b/dev/bots/pubspec.yaml @@ -39,7 +39,7 @@ dependencies: matcher: 0.12.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" mime: 0.9.6+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" multi_server_socket: 1.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - node_preamble: 1.4.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + node_preamble: 1.4.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" package_config: 1.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" package_resolver: 1.0.10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" pedantic: 1.8.0+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -67,4 +67,4 @@ dev_dependencies: mockito: 4.1.0 test_api: 0.2.5 -# PUBSPEC CHECKSUM: 058a +# PUBSPEC CHECKSUM: e98b diff --git a/dev/devicelab/README.md b/dev/devicelab/README.md index 6bc1d7a52a..882726d2a4 100644 --- a/dev/devicelab/README.md +++ b/dev/devicelab/README.md @@ -154,6 +154,19 @@ Currently there are only three stages defined, `devicelab`, ../../bin/cache/dart-sdk/bin/dart bin/run.dart -s {NAME_OF_STAGE} ``` +## Running tests against a local engine build + +To run device lab tests against a local engine build, pass the appropriate +flags to `bin/run.dart`: + +```sh +../../bin/cache/dart-sdk/bin/dart bin/run.dart --task=[some_task] \ + --local-engine-src-path=[path_to_local]/engine/src \ + --local-engine=[local_engine_architecture] +``` + +An example of of a local engine architecture is `android_debug_unopt_x86`. + # Reproducing broken builds locally To reproduce the breakage locally `git checkout` the corresponding Flutter diff --git a/dev/devicelab/bin/tasks/android_splash_screen_integration_test.dart b/dev/devicelab/bin/tasks/android_splash_screen_integration_test.dart new file mode 100644 index 0000000000..0cbe7e0e18 --- /dev/null +++ b/dev/devicelab/bin/tasks/android_splash_screen_integration_test.dart @@ -0,0 +1,12 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter_devicelab/framework/adb.dart'; +import 'package:flutter_devicelab/framework/framework.dart'; +import 'package:flutter_devicelab/tasks/integration_tests.dart'; + +Future main() async { + deviceOperatingSystem = DeviceOperatingSystem.android; + await task(createAndroidSplashScreenKitchenSinkTest()); +} diff --git a/dev/devicelab/lib/tasks/integration_tests.dart b/dev/devicelab/lib/tasks/integration_tests.dart index a940a24c8a..f53f5cf13d 100644 --- a/dev/devicelab/lib/tasks/integration_tests.dart +++ b/dev/devicelab/lib/tasks/integration_tests.dart @@ -101,6 +101,13 @@ TaskFunction createFlutterCreateOfflineTest() { }; } +TaskFunction createAndroidSplashScreenKitchenSinkTest() { + return DriverTest( + '${flutterDirectory.path}/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink', + 'test_driver/main.dart', + ); +} + class DriverTest { DriverTest( diff --git a/dev/devicelab/manifest.yaml b/dev/devicelab/manifest.yaml index bb8ea8eb1c..5cc35733cb 100644 --- a/dev/devicelab/manifest.yaml +++ b/dev/devicelab/manifest.yaml @@ -632,3 +632,9 @@ tasks: stage: devicelab required_agent_capabilities: ["mac/android"] flaky: true + + android_splash_screen_integration_test: + description: > + Runs end-to-end test of Flutter's Android splash behavior. + stage: devicelab + required_agent_capabilities: ["linux/android"] diff --git a/dev/devicelab/pubspec.yaml b/dev/devicelab/pubspec.yaml index 233dd3ec34..210141b0f3 100644 --- a/dev/devicelab/pubspec.yaml +++ b/dev/devicelab/pubspec.yaml @@ -56,7 +56,7 @@ dev_dependencies: matcher: 0.12.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" mime: 0.9.6+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" multi_server_socket: 1.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - node_preamble: 1.4.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + node_preamble: 1.4.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" package_config: 1.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" package_resolver: 1.0.10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" pedantic: 1.8.0+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -73,4 +73,4 @@ dev_dependencies: watcher: 0.9.7+12 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" yaml: 2.1.16 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" -# PUBSPEC CHECKSUM: aa03 +# PUBSPEC CHECKSUM: c704 diff --git a/dev/integration_tests/android_semantics_testing/pubspec.yaml b/dev/integration_tests/android_semantics_testing/pubspec.yaml index b0854e0e17..22974acd4e 100644 --- a/dev/integration_tests/android_semantics_testing/pubspec.yaml +++ b/dev/integration_tests/android_semantics_testing/pubspec.yaml @@ -33,7 +33,7 @@ dependencies: meta: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" mime: 0.9.6+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" multi_server_socket: 1.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - node_preamble: 1.4.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + node_preamble: 1.4.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" package_config: 1.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" package_resolver: 1.0.10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" path: 1.6.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -63,4 +63,4 @@ dependencies: flutter: uses-material-design: true -# PUBSPEC CHECKSUM: b1ce +# PUBSPEC CHECKSUM: 80cf diff --git a/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/.gitignore b/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/.gitignore new file mode 100644 index 0000000000..ac4a90645c --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/.gitignore @@ -0,0 +1,72 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +.dart_tool/ +.flutter-plugins +.packages +.pub-cache/ +.pub/ +/build/ + +# Android related +**/android/**/gradle-wrapper.jar +**/android/.gradle +**/android/captures/ +**/android/gradlew +**/android/gradlew.bat +**/android/local.properties +**/android/**/GeneratedPluginRegistrant.java + +# iOS/XCode related +**/ios/**/*.mode1v3 +**/ios/**/*.mode2v3 +**/ios/**/*.moved-aside +**/ios/**/*.pbxuser +**/ios/**/*.perspectivev3 +**/ios/**/*sync/ +**/ios/**/.sconsign.dblite +**/ios/**/.tags* +**/ios/**/.vagrant/ +**/ios/**/DerivedData/ +**/ios/**/Icon? +**/ios/**/Pods/ +**/ios/**/.symlinks/ +**/ios/**/profile +**/ios/**/xcuserdata +**/ios/.generated/ +**/ios/Flutter/App.framework +**/ios/Flutter/Flutter.framework +**/ios/Flutter/Generated.xcconfig +**/ios/Flutter/app.flx +**/ios/Flutter/app.zip +**/ios/Flutter/flutter_assets/ +**/ios/ServiceDefinitions.json +**/ios/Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!**/ios/**/default.mode1v3 +!**/ios/**/default.mode2v3 +!**/ios/**/default.pbxuser +!**/ios/**/default.perspectivev3 +!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages diff --git a/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/.metadata b/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/.metadata new file mode 100644 index 0000000000..693ab4f015 --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: 87a4fb567bcd3db87eb49f80d13e8ef95cfaa21e + channel: unknown + +project_type: app diff --git a/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/README.md b/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/README.md new file mode 100644 index 0000000000..49c2cf009d --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/README.md @@ -0,0 +1,23 @@ +# Splash Demo: Kitchen Sink + +This project is an example of a splash screen that shows a logo for a launch screen and then +zooms that logo towards the screen while fading content beneath it, masked by the logo. + +The purpose of this example project is to push the limits of what Flutter's splash system affords. + +This project is also run as a device lab test via Flutter Driver. + +The files that are relevant to test execution are: + + - /test_driver/main.dart + - /test_driver/main_test.dart + - /android/app/src/main/java/io/flutter/splash_screen_kitchen_sink/MainActivity.java + + The files that should be inspected to learn about splash behavior are: + + - /android/app/src/main/java/io/flutter/splash_screen_kitchen_sink/FlutterZoomSplashScreen.java + - /android/app/src/main/java/io/flutter/splash_screen_kitchen_sink/FlutterZoomSplashView.java + + Communication takes place from Android to Flutter to Driver to communicate splash screen events. + This communication takes place over a channel called "testChannel", whose definition can be + found in `MainActivity.java` and `test_driver/main.dart`. \ No newline at end of file diff --git a/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/app/build.gradle b/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/app/build.gradle new file mode 100644 index 0000000000..6f6f4f001b --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/app/build.gradle @@ -0,0 +1,65 @@ +def localProperties = new Properties() +def localPropertiesFile = rootProject.file('local.properties') +if (localPropertiesFile.exists()) { + localPropertiesFile.withReader('UTF-8') { reader -> + localProperties.load(reader) + } +} + +def flutterRoot = localProperties.getProperty('flutter.sdk') +if (flutterRoot == null) { + throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") +} + +def flutterVersionCode = localProperties.getProperty('flutter.versionCode') +if (flutterVersionCode == null) { + flutterVersionCode = '1' +} + +def flutterVersionName = localProperties.getProperty('flutter.versionName') +if (flutterVersionName == null) { + flutterVersionName = '1.0' +} + +apply plugin: 'com.android.application' +apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" + +android { + compileSdkVersion 28 + + lintOptions { + disable 'InvalidPackage' + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "io.flutter.splash_screen_kitchen_sink" + minSdkVersion 16 + targetSdkVersion 28 + versionCode flutterVersionCode.toInteger() + versionName flutterVersionName + 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 { + implementation 'androidx.fragment:fragment:1.1.0-beta01' + implementation 'androidx.lifecycle:lifecycle-runtime:2.2.0-alpha01' + implementation 'androidx.lifecycle:lifecycle-common-java8:2.2.0-alpha01' + + testImplementation 'junit:junit:4.12' + androidTestImplementation 'com.android.support.test:runner:1.0.2' + androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' +} diff --git a/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/app/src/debug/AndroidManifest.xml b/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 0000000000..3c723cc6d3 --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/app/src/main/AndroidManifest.xml b/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..7b4f097580 --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + diff --git a/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/app/src/main/java/io/flutter/splash_screen_kitchen_sink/FlutterZoomSplashScreen.java b/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/app/src/main/java/io/flutter/splash_screen_kitchen_sink/FlutterZoomSplashScreen.java new file mode 100644 index 0000000000..e53a7e32af --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/app/src/main/java/io/flutter/splash_screen_kitchen_sink/FlutterZoomSplashScreen.java @@ -0,0 +1,64 @@ +package io.flutter.splash_screen_kitchen_sink; + +import android.content.Context; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import io.flutter.embedding.android.SplashScreen; + +/** + * {@code SplashScreen} that displays a yellow splash screen {@code View}, which slowly fades + * out when Flutter is ready. + *

+ * See {@link VeryLongTransitionSplashView} for visual details. + */ +public class FlutterZoomSplashScreen implements SplashScreen { + private FlutterZoomSplashView splashView; + + @Override + public View createSplashView(@NonNull Context context, @Nullable Bundle savedInstanceState) { + splashView = new FlutterZoomSplashView(context); + splashView.restoreSplashState(savedInstanceState); + return splashView; + } + + @Override + public void transitionToFlutter(@NonNull Runnable onTransitionComplete) { + if (splashView != null) { + splashView.transitionToFlutter(onTransitionComplete); + } else { + onTransitionComplete.run(); + } + } + + /** + * Informs Flutter that we are capable of restoring a transition that was previously + * in progress. + *

+ * A splash transition can be interrupted by configuration changes or other OS operations. + *

+ * If we were to return false here, then an orientation change would skip the rest of + * the transition and jump directly to the Flutter UI. + */ + @Override + public boolean doesSplashViewRememberItsTransition() { + return true; + } + + /** + * Saves the state of our {@code splashView} so that we can restore the long fade transition + * when we are recreated after a config change or other recreation event. + */ + @Override + @Nullable + public Bundle saveSplashScreenState() { + if (splashView != null) { + return splashView.saveSplashState(); + } else { + return null; + } + } +} \ No newline at end of file diff --git a/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/app/src/main/java/io/flutter/splash_screen_kitchen_sink/FlutterZoomSplashView.java b/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/app/src/main/java/io/flutter/splash_screen_kitchen_sink/FlutterZoomSplashView.java new file mode 100644 index 0000000000..e1270a87cd --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/app/src/main/java/io/flutter/splash_screen_kitchen_sink/FlutterZoomSplashView.java @@ -0,0 +1,156 @@ +package io.flutter.splash_screen_kitchen_sink; + +import android.animation.TimeAnimator; +import android.annotation.SuppressLint; +import android.content.Context; +import android.graphics.Color; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import android.view.ViewGroup; +import android.view.animation.AccelerateInterpolator; +import android.view.animation.AlphaAnimation; +import android.view.animation.Animation; +import android.view.animation.AnimationSet; +import android.view.animation.ScaleAnimation; +import android.widget.FrameLayout; +import android.widget.ImageView; + +import androidx.annotation.Nullable; + +public class FlutterZoomSplashView extends FrameLayout { + private static final String TAG = "FlutterZoomSplashView"; + + private float transitionPercentWhenAnimationStarted = 0.0f; + private float totalTransitionPercent = 0.0f; + private Runnable onTransitionComplete; + private View whiteUnderlay; + private ImageView imageView; + private AnimationSet transitionAnimation; + private TimeAnimator timeAnimator; + + private final TimeAnimator.TimeListener timeListener = new TimeAnimator.TimeListener() { + @Override + public void onTimeUpdate(TimeAnimator animation, long totalTime, long deltaTime) { + // We have to represent transition percent as a starting value + the fraction of the + // running animation. This is because there is no way to start an Animator and inform + // it that it should already be X percent complete. + totalTransitionPercent = transitionPercentWhenAnimationStarted + + (animation.getAnimatedFraction() * (1.0f - transitionPercentWhenAnimationStarted)); + } + }; + + private final Animation.AnimationListener animationListener = new Animation.AnimationListener() { + @Override + public void onAnimationStart(Animation animation) {} + + @Override + public void onAnimationEnd(Animation animation) { + Log.d(TAG, "Animation ended."); + transitionAnimation = null; + animation.setAnimationListener(null); + + timeAnimator.cancel(); + timeAnimator.setTimeListener(null); + + onTransitionComplete.run(); + } + + @Override + public void onAnimationRepeat(Animation animation) {} + }; + + public FlutterZoomSplashView(Context context) { + super(context); + Log.d(TAG, "Creating FlutterZoomSplashView"); + + whiteUnderlay = new View(getContext()); + whiteUnderlay.setBackgroundColor(Color.WHITE); + addView(whiteUnderlay); + + imageView = new ImageView(getContext()); + imageView.setImageDrawable(getResources().getDrawable(R.drawable.splash_screen, getContext().getTheme())); + imageView.setScaleType(ImageView.ScaleType.FIT_XY); + addView(imageView, new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); + } + + public void transitionToFlutter(Runnable onTransitionComplete) { + Log.d(TAG, "Animating transition."); + this.onTransitionComplete = onTransitionComplete; + animateWhiteUnderlay(); + animateLogoOverlay(); + } + + private void animateWhiteUnderlay() { + AlphaAnimation fadeOut = new AlphaAnimation(1f, 0f); + fadeOut.setStartOffset(0); + fadeOut.setDuration(500); + + whiteUnderlay.startAnimation(fadeOut); + } + + @SuppressLint("NewApi") + private void animateLogoOverlay() { + // Notice that each animation might begin part way through the animation based on + // a previous transition amount that we need to restore. + float startAlpha = 1f - totalTransitionPercent; + long fadeStartDelay = Math.round(400 * (1.0 - (Math.min(totalTransitionPercent, 0.8) / 0.8))); + long fadeDuration = Math.round(100 * (1.0 - Math.max(0, (totalTransitionPercent - 0.8)) / 0.2)); + + float startScale = 1f + (7f * totalTransitionPercent); + long scaleDuration = Math.round(500 * (1.0 - totalTransitionPercent)); + + long globalTimerLength = Math.round(500 * (1.0 - totalTransitionPercent)); + + Animation scaleUp = new ScaleAnimation( + startScale, 8f, + startScale, 8f, + Animation.RELATIVE_TO_SELF, 0.5f, + Animation.RELATIVE_TO_SELF, 0.5f + ); + scaleUp.setFillAfter(true); + scaleUp.setDuration(scaleDuration); + scaleUp.setInterpolator(new AccelerateInterpolator()); + + AlphaAnimation fadeOut = new AlphaAnimation(startAlpha, 0f); + fadeOut.setStartOffset(fadeStartDelay); + fadeOut.setDuration(fadeDuration); + + transitionAnimation = new AnimationSet(false); + transitionAnimation.addAnimation(scaleUp); + transitionAnimation.addAnimation(fadeOut); + transitionAnimation.setFillAfter(true); + transitionAnimation.setAnimationListener(animationListener); + + timeAnimator = new TimeAnimator(); + timeAnimator.setDuration(globalTimerLength); + timeAnimator.setTimeListener(timeListener); + + imageView.startAnimation(transitionAnimation); + timeAnimator.start(); + } + + @Nullable + public Bundle saveSplashState() { + Log.d(TAG, "Saving splash state."); + if (totalTransitionPercent > 0.0f && totalTransitionPercent < 1.0f) { + Bundle state = new Bundle(); + state.putFloat("totalTransitionPercent", totalTransitionPercent); + Log.d(TAG, String.format("Transition percent: %.2f", totalTransitionPercent)); + return state; + } else { + Log.d(TAG, "No transition to save."); + return null; + } + } + + public void restoreSplashState(@Nullable Bundle bundle) { + Log.d(TAG, "Restoring splash state: " + bundle); + if (bundle != null) { + transitionPercentWhenAnimationStarted = bundle.getFloat("totalTransitionPercent"); + Log.d(TAG, String.format("State restored with transition percent: %.2f", transitionPercentWhenAnimationStarted)); + } else { + Log.d(TAG, "No state provided."); + } + } +} diff --git a/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/app/src/main/java/io/flutter/splash_screen_kitchen_sink/MainActivity.java b/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/app/src/main/java/io/flutter/splash_screen_kitchen_sink/MainActivity.java new file mode 100644 index 0000000000..8892ea9547 --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/app/src/main/java/io/flutter/splash_screen_kitchen_sink/MainActivity.java @@ -0,0 +1,190 @@ +package io.flutter.splash_screen_kitchen_sink; + +import android.content.Context; +import android.util.Log; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewTreeObserver; + +import androidx.annotation.Nullable; + +import java.util.ArrayList; +import java.util.List; + +import io.flutter.embedding.android.FlutterActivity; +import io.flutter.embedding.android.FlutterView; +import io.flutter.embedding.android.SplashScreen; +import io.flutter.embedding.engine.FlutterEngine; +import io.flutter.embedding.engine.dart.DartExecutor; +import io.flutter.plugin.common.BasicMessageChannel; +import io.flutter.plugin.common.StringCodec; +import io.flutter.view.FlutterMain; + +public class MainActivity extends FlutterActivity { + private static final String TAG = "MainActivity"; + + private static FlutterEngine flutterEngine; + + static { + // Explicitly activates Debug logging for the Flutter Android embedding. + io.flutter.Log.setLogLevel(Log.DEBUG); + } + + // Sends a JSON-serialized log of test events from Android to Flutter. + private BasicMessageChannel testChannel; + // Log of splash events that is updated, serialized, and sent to Flutter. + private SplashTestLog splashTestLog; + + /** + * We explicitly provide a {@code FlutterEngine} so that every rotation does not create a + * new FlutterEngine. Creating a new FlutterEngine on every orientation would cause the + * splash experience to restart upon every orientation change, which is not what we're + * interested in verifying in this example app. + */ + @Override + public FlutterEngine provideFlutterEngine(Context context) { + if (flutterEngine == null) { + flutterEngine = new FlutterEngine(context); + + flutterEngine.getDartExecutor().executeDartEntrypoint(new DartExecutor.DartEntrypoint( + getAssets(), + FlutterMain.findAppBundlePath(context), + "main" + )); + + // Setup the channel that sends splash test log updates from Android to Flutter. + testChannel = new BasicMessageChannel<>( + flutterEngine.getDartExecutor(), + "testChannel", + StringCodec.INSTANCE + ); + + // Initialize the splash test log that accumulates events. + splashTestLog = new SplashTestLog(); + + // Send initial splash test log. + updateLogAndSendToFlutter(); + + // List for any layout change, look for splash test updates, and if + // there are any, add them to the log and send them to Flutter. + getWindow().getDecorView().getRootView().getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + updateLogAndSendToFlutter(); + } + }); + } + return flutterEngine; + } + + private void updateLogAndSendToFlutter() { + // Look for the existence of a FlutterView and the existence of a + // splash screen View on top of it. + View flutterView = findViewByType(FlutterView.class); + boolean isSplashAvailable = false; + if (flutterView != null) { + ViewGroup flutterViewParent = (ViewGroup) flutterView.getParent(); + isSplashAvailable = flutterViewParent.getChildCount() > 1; + } + + // Update the splash test log. + splashTestLog.update(flutterView != null, isSplashAvailable); + + // Send the latest version of the splash test log to Flutter. + testChannel.send(splashTestLog.serialize()); + } + + /** + * Finds an Android {@code View} in this {@code Activity}'s {@code View} hierarchy + * that matches the given {@code viewType}. + * + * This method searches the {@code View} hierarchy breadth-first. + */ + private View findViewByType(Class viewType) { + View selectedView = getWindow().getDecorView().getRootView();//findViewById(0x01020002); + List viewQueue = new ArrayList<>(); + + while (selectedView != null && !selectedView.getClass().equals(viewType)) { + if (selectedView instanceof ViewGroup) { + ViewGroup selectedViewGroup = (ViewGroup) selectedView; + for (int i = 0; i < selectedViewGroup.getChildCount(); ++i) { + viewQueue.add(selectedViewGroup.getChildAt(i)); + } + } + + if (!viewQueue.isEmpty()) { + selectedView = viewQueue.remove(0); + } else { + selectedView = null; + } + } + + return selectedView; + } + + @Override + @Nullable + public SplashScreen provideSplashScreen() { + return new FlutterZoomSplashScreen(); + } + + /** + * Log of splash UI changes that is used to verify the correctness of + * splash behavior. + */ + private static class SplashTestLog { + private List eventLog = new ArrayList<>(); + + SplashTestLog() { + eventLog.add(TestState.WAITING_FOR_LAYOUT); + } + + void update(boolean isFlutterViewAvailable, boolean isSplashAvailable) { + TestState newTestState = TestState.WAITING_FOR_LAYOUT; + if (isFlutterViewAvailable) { + newTestState = isSplashAvailable ? TestState.SPLASH_SHOWING : TestState.SPLASH_NOT_SHOWING; + } + + if (newTestState != eventLog.get(eventLog.size() - 1)) { + eventLog.add(newTestState); + } + } + + String serialize() { + return "{\"events\":[" + serializeEvents() + "]}"; + } + + private String serializeEvents() { + StringBuilder stringBuilder = new StringBuilder(); + for (int i = 0; i < eventLog.size(); ++i) { + stringBuilder.append(serializeEvent(eventLog.get(i))); + if (i < (eventLog.size() - 1)) { + stringBuilder.append(","); + } + } + return stringBuilder.toString(); + } + + private String serializeEvent(TestState event) { + switch (event) { + case WAITING_FOR_LAYOUT: + return "\"waiting_for_layout\""; + case SPLASH_SHOWING: + return "\"splash_showing\""; + case SPLASH_NOT_SHOWING: + return "\"splash_not_showing\""; + default: + throw new IllegalStateException("Received non-existent TestState."); + } + } + } + + /** + * States of splash display in this test project. + */ + private enum TestState { + WAITING_FOR_LAYOUT, + SPLASH_SHOWING, + SPLASH_NOT_SHOWING; + } +} diff --git a/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/app/src/main/res/drawable-land/launch_background.xml b/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/app/src/main/res/drawable-land/launch_background.xml new file mode 100644 index 0000000000..884d00ca91 --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/app/src/main/res/drawable-land/launch_background.xml @@ -0,0 +1,13 @@ + + + + + + + + + + diff --git a/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/app/src/main/res/drawable/launch_background.xml b/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 0000000000..975922da79 --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,13 @@ + + + + + + + + + + diff --git a/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/app/src/main/res/drawable/normal_background.xml b/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/app/src/main/res/drawable/normal_background.xml new file mode 100644 index 0000000000..5782842b81 --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/app/src/main/res/drawable/normal_background.xml @@ -0,0 +1,4 @@ + + + + diff --git a/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/app/src/main/res/drawable/splash_screen.xml b/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/app/src/main/res/drawable/splash_screen.xml new file mode 100644 index 0000000000..f71b51c3a8 --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/app/src/main/res/drawable/splash_screen.xml @@ -0,0 +1,11 @@ + + + + + + + + diff --git a/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/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/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/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/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/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 + + + + + diff --git a/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/app/src/profile/AndroidManifest.xml b/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 0000000000..3c723cc6d3 --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/build.gradle b/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/build.gradle new file mode 100644 index 0000000000..bb8a303898 --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/build.gradle @@ -0,0 +1,29 @@ +buildscript { + repositories { + google() + jcenter() + } + + dependencies { + classpath 'com.android.tools.build:gradle:3.2.1' + } +} + +allprojects { + repositories { + google() + jcenter() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(':app') +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/gradle.properties b/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/gradle.properties new file mode 100644 index 0000000000..94adc3a3f9 --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx1536M +android.useAndroidX=true +android.enableJetifier=true diff --git a/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/gradle/wrapper/gradle-wrapper.properties b/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000..2819f022f1 --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Fri Jun 23 08:50:38 CEST 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip diff --git a/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/settings.gradle b/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/settings.gradle new file mode 100644 index 0000000000..5a2f14fb18 --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/android/settings.gradle @@ -0,0 +1,15 @@ +include ':app' + +def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() + +def plugins = new Properties() +def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') +if (pluginsFile.exists()) { + pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } +} + +plugins.each { name, path -> + def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() + include ":$name" + project(":$name").projectDir = pluginDirectory +} diff --git a/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/lib/main.dart b/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/lib/main.dart new file mode 100644 index 0000000000..5c6edd393d --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/lib/main.dart @@ -0,0 +1,114 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +import 'package:flutter/material.dart'; + +void main() => runApp(MyApp()); + +class MyApp extends StatelessWidget { + // This widget is the root of your application. + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Flutter Demo', + theme: ThemeData( + // This is the theme of your application. + // + // Try running your application with "flutter run". You'll see the + // application has a blue toolbar. Then, without quitting the app, try + // changing the primarySwatch below to Colors.green and then invoke + // "hot reload" (press "r" in the console where you ran "flutter run", + // or simply save your changes to "hot reload" in a Flutter IDE). + // Notice that the counter didn't reset back to zero; the application + // is not restarted. + primarySwatch: Colors.blue, + ), + home: const MyHomePage(title: 'Flutter Demo Home Page'), + ); + } +} + +class MyHomePage extends StatefulWidget { + const MyHomePage({Key key, this.title}) : super(key: key); + + // This widget is the home page of your application. It is stateful, meaning + // that it has a State object (defined below) that contains fields that affect + // how it looks. + + // This class is the configuration for the state. It holds the values (in this + // case the title) provided by the parent (in this case the App widget) and + // used by the build method of the State. Fields in a Widget subclass are + // always marked "final". + + final String title; + + @override + _MyHomePageState createState() => _MyHomePageState(); +} + +class _MyHomePageState extends State { + int _counter = 0; + + void _incrementCounter() { + setState(() { + // This call to setState tells the Flutter framework that something has + // changed in this State, which causes it to rerun the build method below + // so that the display can reflect the updated values. If we changed + // _counter without calling setState(), then the build method would not be + // called again, and so nothing would appear to happen. + _counter++; + }); + } + + @override + Widget build(BuildContext context) { + // This method is rerun every time setState is called, for instance as done + // by the _incrementCounter method above. + // + // The Flutter framework has been optimized to make rerunning build methods + // fast, so that you can just rebuild anything that needs updating rather + // than having to individually change instances of widgets. + return Scaffold( + appBar: AppBar( + // Here we take the value from the MyHomePage object that was created by + // the App.build method, and use it to set our appbar title. + title: Text(widget.title), + ), + body: Center( + // Center is a layout widget. It takes a single child and positions it + // in the middle of the parent. + child: Column( + // Column is also layout widget. It takes a list of children and + // arranges them vertically. By default, it sizes itself to fit its + // children horizontally, and tries to be as tall as its parent. + // + // Invoke "debug painting" (press "p" in the console, choose the + // "Toggle Debug Paint" action from the Flutter Inspector in Android + // Studio, or the "Toggle Debug Paint" command in Visual Studio Code) + // to see the wireframe for each widget. + // + // Column has various properties to control how it sizes itself and + // how it positions its children. Here we use mainAxisAlignment to + // center the children vertically; the main axis here is the vertical + // axis because Columns are vertical (the cross axis would be + // horizontal). + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Text( + 'You have pushed the button this many times:', + ), + Text( + '$_counter', + style: Theme.of(context).textTheme.display1, + ), + ], + ), + ), + floatingActionButton: FloatingActionButton( + onPressed: _incrementCounter, + tooltip: 'Increment', + child: Icon(Icons.add), + ), // This trailing comma makes auto-formatting nicer for build methods. + ); + } +} diff --git a/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/pubspec.yaml b/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/pubspec.yaml new file mode 100644 index 0000000000..ec3cb22da5 --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/pubspec.yaml @@ -0,0 +1,132 @@ +name: splash_screen_kitchen_sink +description: A new Flutter application. + +# The following defines the version and build number for your application. +# A version number is three numbers separated by dots, like 1.2.43 +# followed by an optional build number separated by a +. +# Both the version and the builder number may be overridden in flutter +# build by specifying --build-name and --build-number, respectively. +# In Android, build-name is used as versionName while build-number used as versionCode. +# Read more about Android versioning at https://developer.android.com/studio/publish/versioning +# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. +# Read more about iOS versioning at +# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html +version: 1.0.0+1 + +environment: + sdk: ">=2.1.0 <3.0.0" + +dependencies: + flutter: + sdk: flutter + + # The following adds the Cupertino Icons font to your application. + # Use with the CupertinoIcons class for iOS style icons. + cupertino_icons: 0.1.2 + + collection: 1.14.11 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + meta: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + typed_data: 1.1.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + vector_math: 2.0.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + +dev_dependencies: + flutter_test: + sdk: flutter + + flutter_driver: + sdk: flutter + test: 1.6.3 + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter. + + analyzer: 0.36.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + args: 1.5.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + async: 2.3.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + boolean_selector: 1.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + charcode: 1.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + convert: 2.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + crypto: 2.0.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + csslib: 0.16.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + file: 5.0.8+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + front_end: 0.1.19 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + html: 0.14.0+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + http: 0.12.0+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + http_multi_server: 2.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + http_parser: 3.1.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + intl: 0.15.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + io: 0.3.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + js: 0.6.1+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + json_rpc_2: 2.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + kernel: 0.3.19 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + matcher: 0.12.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + mime: 0.9.6+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + multi_server_socket: 1.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + node_preamble: 1.4.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + package_config: 1.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + package_resolver: 1.0.10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + path: 1.6.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + pedantic: 1.8.0+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + pool: 1.4.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + pub_semver: 1.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + quiver: 2.0.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + shelf: 0.7.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + shelf_packages_handler: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + shelf_static: 0.2.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + shelf_web_socket: 0.2.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + source_map_stack_trace: 1.1.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + source_maps: 0.10.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + source_span: 1.5.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + stack_trace: 1.9.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + stream_channel: 2.0.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + string_scanner: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + term_glyph: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + test_api: 0.2.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + test_core: 0.2.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + vm_service_client: 0.2.6+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + watcher: 0.9.7+12 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + web_socket_channel: 1.0.14 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + yaml: 2.1.16 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + +flutter: + + # The following line ensures that the Material Icons font is + # included with your application, so that you can use the icons in + # the material Icons class. + uses-material-design: true + + # To add assets to your application, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware. + + # For details regarding adding assets from package dependencies, see + # https://flutter.dev/assets-and-images/#from-packages + + # To add custom fonts to your application, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts from package dependencies, + # see https://flutter.dev/custom-fonts/#from-packages + +# PUBSPEC CHECKSUM: e85f diff --git a/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/test/widget_test.dart b/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/test/widget_test.dart new file mode 100644 index 0000000000..7b135251ee --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/test/widget_test.dart @@ -0,0 +1,30 @@ +// This is a basic Flutter widget test. +// +// To perform an interaction with a widget in your test, use the WidgetTester +// utility that Flutter provides. For example, you can send tap and scroll +// gestures. You can also use WidgetTester to find child widgets in the widget +// tree, read text, and verify that the values of widget properties are correct. + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'package:splash_screen_kitchen_sink/main.dart'; + +void main() { + testWidgets('Counter increments smoke test', (WidgetTester tester) async { + // Build our app and trigger a frame. + await tester.pumpWidget(MyApp()); + + // Verify that our counter starts at 0. + expect(find.text('0'), findsOneWidget); + expect(find.text('1'), findsNothing); + + // Tap the '+' icon and trigger a frame. + await tester.tap(find.byIcon(Icons.add)); + await tester.pump(); + + // Verify that our counter has incremented. + expect(find.text('0'), findsNothing); + expect(find.text('1'), findsOneWidget); + }); +} diff --git a/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/test_driver/main.dart b/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/test_driver/main.dart new file mode 100644 index 0000000000..b939220f81 --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/test_driver/main.dart @@ -0,0 +1,54 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +import 'dart:async'; + +import 'package:flutter_driver/driver_extension.dart'; +import 'package:flutter/services.dart'; +import 'package:splash_screen_kitchen_sink/main.dart' as app; + +Completer dataHandlerCompleter; +final List appToHostMessageQueue = []; + +/// How this test works: +/// 1. Android's UI changes as the app starts up. +/// 2. Android sends messages to this Flutter app about those UI changes. +/// 3. This Flutter app forwards those messages from the app to the host +/// machine running the driver test. +/// 4. The driver test evaluates the UI change events to determine if the +/// behavior is expected or unexpected and then passes or fails the test. +void main() { + enableFlutterDriverExtension(handler: respondToHostRequestForSplashLog); + + createTestChannelBetweenAndroidAndFlutter(); + + app.main(); +} + +Future respondToHostRequestForSplashLog(String _) { + if (appToHostMessageQueue.isNotEmpty) { + return Future.value(appToHostMessageQueue.removeAt(0)); + } else { + dataHandlerCompleter = Completer(); + return dataHandlerCompleter.future; + } +} + +void createTestChannelBetweenAndroidAndFlutter() { + // Channel used for Android to send Flutter changes to the splash display. + final BasicMessageChannel testChannel = BasicMessageChannel( + 'testChannel', + const StringCodec() + ); + + // Every splash display change message that we receive from Android is either + // immediately sent to the host driver test, or queued up to be sent to the + // host driver test at the next opportunity. + testChannel.setMessageHandler((String message) async { + appToHostMessageQueue.add(message); + if (dataHandlerCompleter != null) { + dataHandlerCompleter.complete(appToHostMessageQueue.removeAt(0)); + } + return ''; + }); +} \ No newline at end of file diff --git a/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/test_driver/main_test.dart b/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/test_driver/main_test.dart new file mode 100644 index 0000000000..c97b12b115 --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_kitchen_sink/test_driver/main_test.dart @@ -0,0 +1,77 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:async'; +import 'dart:convert'; + +import 'package:flutter_driver/flutter_driver.dart'; +import 'package:test/test.dart' hide TypeMatcher, isInstanceOf; + +void main() { + group('end-to-end test', () { + FlutterDriver driver; + + setUpAll(() async { + driver = await FlutterDriver.connect(); + }); + + tearDownAll(() async { + await driver?.close(); + }); + + test('Flutter experience eventually appears', () async { + final SerializableFinder fabFinder = find.byTooltip('Increment'); + + // Ensure that the Flutter experience eventually becomes visible. + // We combined two verifications for this purpose: + // + // 1. We verify that we can find the expected FAB, and + // + // 2. We verify that Android thinks the splash screen has been removed. + await driver.waitFor(fabFinder); + + await _waitForSplashToDisappear(driver).timeout( + const Duration(seconds: 10), + onTimeout: () { + throw Exception('Splash screen never disappeared.'); + }, + ); + }); + }); +} + +Future _waitForSplashToDisappear(FlutterDriver driver) async { + bool waitingForSplashToDisappear = true; + + while (waitingForSplashToDisappear) { + final String response = await driver.requestData('splash_test_log',); + + final Map splashTestLog = jsonDecode(response); + final List events = splashTestLog['events']; + if (events.length == 3) { + expect( + events[0], + equals('waiting_for_layout'), + reason: 'Expected first splash event to be ' + '"waiting_for_layout" but it was "${events[0]}"', + ); + expect( + events[1], + equals('splash_showing'), + reason: 'Expected second splash event to be ' + '"splash_showing" but it was "${events[1]}"', + ); + expect( + events[2], + equals('splash_not_showing'), + reason: 'Expected third splash event to be ' + '"splash_not_showing" but it was "${events[2]}"', + ); + waitingForSplashToDisappear = false; + } else if (events.length > 3) { + throw Exception('Expected 3 splash test events but received ' + '${events.length} events: $events'); + } + } +} diff --git a/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/.gitignore b/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/.gitignore new file mode 100644 index 0000000000..ac4a90645c --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/.gitignore @@ -0,0 +1,72 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +.dart_tool/ +.flutter-plugins +.packages +.pub-cache/ +.pub/ +/build/ + +# Android related +**/android/**/gradle-wrapper.jar +**/android/.gradle +**/android/captures/ +**/android/gradlew +**/android/gradlew.bat +**/android/local.properties +**/android/**/GeneratedPluginRegistrant.java + +# iOS/XCode related +**/ios/**/*.mode1v3 +**/ios/**/*.mode2v3 +**/ios/**/*.moved-aside +**/ios/**/*.pbxuser +**/ios/**/*.perspectivev3 +**/ios/**/*sync/ +**/ios/**/.sconsign.dblite +**/ios/**/.tags* +**/ios/**/.vagrant/ +**/ios/**/DerivedData/ +**/ios/**/Icon? +**/ios/**/Pods/ +**/ios/**/.symlinks/ +**/ios/**/profile +**/ios/**/xcuserdata +**/ios/.generated/ +**/ios/Flutter/App.framework +**/ios/Flutter/Flutter.framework +**/ios/Flutter/Generated.xcconfig +**/ios/Flutter/app.flx +**/ios/Flutter/app.zip +**/ios/Flutter/flutter_assets/ +**/ios/ServiceDefinitions.json +**/ios/Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!**/ios/**/default.mode1v3 +!**/ios/**/default.mode2v3 +!**/ios/**/default.pbxuser +!**/ios/**/default.perspectivev3 +!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages diff --git a/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/.metadata b/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/.metadata new file mode 100644 index 0000000000..693ab4f015 --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: 87a4fb567bcd3db87eb49f80d13e8ef95cfaa21e + channel: unknown + +project_type: app diff --git a/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/README.md b/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/README.md new file mode 100644 index 0000000000..bd7b494e76 --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/README.md @@ -0,0 +1,7 @@ +# Splash Demo: Never ending splash animation + +This project is an example of a splash screen that displays an animation indefinitely. + +A never ending animation is provided as a demo so that developers can manually verify that +orientation changes and other UI destruction processes do not cause issues with Flutter's splash +system for Android. diff --git a/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/app/build.gradle b/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/app/build.gradle new file mode 100644 index 0000000000..c50db1372f --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/app/build.gradle @@ -0,0 +1,65 @@ +def localProperties = new Properties() +def localPropertiesFile = rootProject.file('local.properties') +if (localPropertiesFile.exists()) { + localPropertiesFile.withReader('UTF-8') { reader -> + localProperties.load(reader) + } +} + +def flutterRoot = localProperties.getProperty('flutter.sdk') +if (flutterRoot == null) { + throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") +} + +def flutterVersionCode = localProperties.getProperty('flutter.versionCode') +if (flutterVersionCode == null) { + flutterVersionCode = '1' +} + +def flutterVersionName = localProperties.getProperty('flutter.versionName') +if (flutterVersionName == null) { + flutterVersionName = '1.0' +} + +apply plugin: 'com.android.application' +apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" + +android { + compileSdkVersion 28 + + lintOptions { + disable 'InvalidPackage' + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "io.flutter.splash_screen_load_rotate" + minSdkVersion 16 + targetSdkVersion 28 + versionCode flutterVersionCode.toInteger() + versionName flutterVersionName + 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 { + implementation 'androidx.fragment:fragment:1.1.0-beta01' + implementation 'androidx.lifecycle:lifecycle-runtime:2.2.0-alpha01' + implementation 'androidx.lifecycle:lifecycle-common-java8:2.2.0-alpha01' + + testImplementation 'junit:junit:4.12' + androidTestImplementation 'com.android.support.test:runner:1.0.2' + androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' +} diff --git a/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/app/src/debug/AndroidManifest.xml b/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 0000000000..75b88d6caf --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/app/src/main/AndroidManifest.xml b/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..f42bdad734 --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + diff --git a/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/app/src/main/java/io/flutter/splash_screen_load_rotate/MainActivity.java b/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/app/src/main/java/io/flutter/splash_screen_load_rotate/MainActivity.java new file mode 100644 index 0000000000..bf9548928f --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/app/src/main/java/io/flutter/splash_screen_load_rotate/MainActivity.java @@ -0,0 +1,38 @@ +package io.flutter.splash_screen_load_rotate; + +import android.content.Context; + +import io.flutter.embedding.android.FlutterActivity; +import io.flutter.embedding.android.SplashScreen; +import io.flutter.embedding.engine.FlutterEngine; +import io.flutter.embedding.engine.dart.DartExecutor; +import io.flutter.view.FlutterMain; + +public class MainActivity extends FlutterActivity { + private static FlutterEngine flutterEngine; + + /** + * We explicitly provide a {@code FlutterEngine} so that every rotation does not create a + * new FlutterEngine. Creating a new FlutterEngine on every orientation would cause the + * splash experience to restart upon every orientation change, which is not what we're + * interested in verifying in this example app. + */ + @Override + public FlutterEngine provideFlutterEngine(Context context) { + if (flutterEngine == null) { + flutterEngine = new FlutterEngine(context); + + flutterEngine.getDartExecutor().executeDartEntrypoint(new DartExecutor.DartEntrypoint( + getAssets(), + FlutterMain.findAppBundlePath(context), + "main" + )); + } + return flutterEngine; + } + + @Override + public SplashScreen provideSplashScreen() { + return new SplashScreenThatNeverEnds(); + } +} diff --git a/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/app/src/main/java/io/flutter/splash_screen_load_rotate/NeverEndingSplashView.java b/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/app/src/main/java/io/flutter/splash_screen_load_rotate/NeverEndingSplashView.java new file mode 100644 index 0000000000..487d51deab --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/app/src/main/java/io/flutter/splash_screen_load_rotate/NeverEndingSplashView.java @@ -0,0 +1,110 @@ +package io.flutter.splash_screen_load_rotate; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.annotation.SuppressLint; +import android.content.Context; +import android.graphics.Color; +import android.os.Bundle; +import android.util.Log; +import android.view.Gravity; +import android.view.View; +import android.view.ViewPropertyAnimator; +import android.view.animation.AccelerateDecelerateInterpolator; +import android.widget.FrameLayout; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +public class NeverEndingSplashView extends FrameLayout { + private static final String TAG = "NeverEndingSplashView"; + + private static final float ANIMATION_SLIDE_DISTANCE = 800; + private static final int ANIMATION_TIME_IN_MILLIS = 5000; + + private final View animatedThing; + private float destinationTranslationY = 0; + private ViewPropertyAnimator animator; + + private final Animator.AnimatorListener animatorListener = new AnimatorListenerAdapter() { + @SuppressLint("NewApi") + @Override + public void onAnimationEnd(Animator animation) { + // Remove all animation listeners to avoid memory leaks. + animation.removeAllListeners(); + + // Start the next animation by reversing direction. + if (destinationTranslationY < 0) { + animateTheThing(ANIMATION_SLIDE_DISTANCE / 2); + } else { + animateTheThing(-ANIMATION_SLIDE_DISTANCE / 2); + } + } + + @SuppressLint("NewApi") + @Override + public void onAnimationCancel(Animator animation) { + // Remove all animation listeners to avoid memory leaks. + animation.removeAllListeners(); + } + }; + + @SuppressLint("NewApi") + public NeverEndingSplashView(Context context) { + super(context); + // Give the UI a yellow background to prove that this splash screen view takes up + // all available space. + setBackgroundColor(Color.YELLOW); + + // Create and display a little square that slides up and down. + animatedThing = new View(context); + animatedThing.setBackgroundColor(Color.BLACK); + addView(animatedThing, new FrameLayout.LayoutParams(100, 100, Gravity.CENTER)); + + // Start the animation immediately. + animateTheThing(ANIMATION_SLIDE_DISTANCE / 2); + } + + @SuppressLint("NewApi") + private void animateTheThing(float destinationTranslationY) { + // Save the destination translation Y so that we can save our state, if needed. + this.destinationTranslationY = destinationTranslationY; + + animator = animatedThing + .animate() + .translationY(destinationTranslationY) + .setDuration(Math.round(ANIMATION_TIME_IN_MILLIS * Math.abs((destinationTranslationY - animatedThing.getTranslationY()) / ANIMATION_SLIDE_DISTANCE))) + .setInterpolator(new AccelerateDecelerateInterpolator()) + .setListener(animatorListener); + animator.start(); + } + + @SuppressLint("NewApi") + @Override + protected void onDetachedFromWindow() { + if (animator != null) { + // Cancel our animation to avoid leaks. + animator.cancel(); + } + super.onDetachedFromWindow(); + } + + @Nullable + public Bundle saveSplashState() { + Log.d(TAG, "Saving splash state."); + Bundle state = new Bundle(); + state.putFloat("currentTranslationY", animatedThing.getTranslationY()); + state.putFloat("destinationTranslationY", destinationTranslationY); + return state; + } + + public void restoreSplashState(@Nullable Bundle bundle) { + Log.d(TAG, "Restoring splash state: " + bundle); + if (bundle != null) { + this.destinationTranslationY = bundle.getFloat("destinationTranslationY"); + this.animatedThing.setTranslationY(bundle.getFloat("currentTranslationY")); + animateTheThing(destinationTranslationY); + } else { + Log.d(TAG, "No state provided."); + } + } +} \ No newline at end of file diff --git a/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/app/src/main/java/io/flutter/splash_screen_load_rotate/SplashScreenThatNeverEnds.java b/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/app/src/main/java/io/flutter/splash_screen_load_rotate/SplashScreenThatNeverEnds.java new file mode 100644 index 0000000000..35e34cca2f --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/app/src/main/java/io/flutter/splash_screen_load_rotate/SplashScreenThatNeverEnds.java @@ -0,0 +1,55 @@ +package io.flutter.splash_screen_load_rotate; + +import android.content.Context; +import android.os.Bundle; +import android.view.View; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import io.flutter.embedding.android.SplashScreen; + +public class SplashScreenThatNeverEnds implements SplashScreen { + private NeverEndingSplashView splashView; + + @Nullable + public View createSplashView(@NonNull Context context, @Nullable Bundle bundle) { + if (splashView == null) { + splashView = new NeverEndingSplashView(context); + splashView.restoreSplashState(bundle); + } + return splashView; + } + + public void transitionToFlutter(Runnable onTransitionComplete) { + // Do nothing. Never ends. + } + + /** + * Informs Flutter that we are capable of restoring a transition that was previously + * in progress. + *

+ * A splash transition can be interrupted by configuration changes or other OS operations. + *

+ * If we were to return false here, then an orientation change would skip the rest of + * the transition and jump directly to the Flutter UI. + */ + @Override + public boolean doesSplashViewRememberItsTransition() { + return true; + } + + /** + * Saves the state of our {@code splashView} so that we can restore the animation + * state when we are recreated after a config change or other recreation event. + */ + @Override + @Nullable + public Bundle saveSplashScreenState() { + if (splashView != null) { + return splashView.saveSplashState(); + } else { + return null; + } + } + +} \ No newline at end of file diff --git a/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/app/src/main/res/drawable/launch_background.xml b/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 0000000000..af1c53eb9a --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/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/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/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/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/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 + + + \ No newline at end of file diff --git a/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/app/src/main/res/values/styles.xml b/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000000..00fa4417cf --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/app/src/main/res/values/styles.xml @@ -0,0 +1,8 @@ + + + + diff --git a/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/app/src/profile/AndroidManifest.xml b/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 0000000000..75b88d6caf --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/build.gradle b/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/build.gradle new file mode 100644 index 0000000000..bb8a303898 --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/build.gradle @@ -0,0 +1,29 @@ +buildscript { + repositories { + google() + jcenter() + } + + dependencies { + classpath 'com.android.tools.build:gradle:3.2.1' + } +} + +allprojects { + repositories { + google() + jcenter() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(':app') +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/gradle.properties b/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/gradle.properties new file mode 100644 index 0000000000..94adc3a3f9 --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx1536M +android.useAndroidX=true +android.enableJetifier=true diff --git a/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/gradle/wrapper/gradle-wrapper.properties b/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000..2819f022f1 --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Fri Jun 23 08:50:38 CEST 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip diff --git a/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/settings.gradle b/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/settings.gradle new file mode 100644 index 0000000000..5a2f14fb18 --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/android/settings.gradle @@ -0,0 +1,15 @@ +include ':app' + +def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() + +def plugins = new Properties() +def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') +if (pluginsFile.exists()) { + pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } +} + +plugins.each { name, path -> + def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() + include ":$name" + project(":$name").projectDir = pluginDirectory +} diff --git a/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/lib/main.dart b/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/lib/main.dart new file mode 100644 index 0000000000..7342a11e85 --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/lib/main.dart @@ -0,0 +1,111 @@ +import 'package:flutter/material.dart'; + +void main() => runApp(MyApp()); + +class MyApp extends StatelessWidget { + // This widget is the root of your application. + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Flutter Demo', + theme: ThemeData( + // This is the theme of your application. + // + // Try running your application with "flutter run". You'll see the + // application has a blue toolbar. Then, without quitting the app, try + // changing the primarySwatch below to Colors.green and then invoke + // "hot reload" (press "r" in the console where you ran "flutter run", + // or simply save your changes to "hot reload" in a Flutter IDE). + // Notice that the counter didn't reset back to zero; the application + // is not restarted. + primarySwatch: Colors.blue, + ), + home: const MyHomePage(title: 'Flutter Demo Home Page'), + ); + } +} + +class MyHomePage extends StatefulWidget { + const MyHomePage({Key key, this.title}) : super(key: key); + + // This widget is the home page of your application. It is stateful, meaning + // that it has a State object (defined below) that contains fields that affect + // how it looks. + + // This class is the configuration for the state. It holds the values (in this + // case the title) provided by the parent (in this case the App widget) and + // used by the build method of the State. Fields in a Widget subclass are + // always marked "final". + + final String title; + + @override + _MyHomePageState createState() => _MyHomePageState(); +} + +class _MyHomePageState extends State { + int _counter = 0; + + void _incrementCounter() { + setState(() { + // This call to setState tells the Flutter framework that something has + // changed in this State, which causes it to rerun the build method below + // so that the display can reflect the updated values. If we changed + // _counter without calling setState(), then the build method would not be + // called again, and so nothing would appear to happen. + _counter++; + }); + } + + @override + Widget build(BuildContext context) { + // This method is rerun every time setState is called, for instance as done + // by the _incrementCounter method above. + // + // The Flutter framework has been optimized to make rerunning build methods + // fast, so that you can just rebuild anything that needs updating rather + // than having to individually change instances of widgets. + return Scaffold( + appBar: AppBar( + // Here we take the value from the MyHomePage object that was created by + // the App.build method, and use it to set our appbar title. + title: Text(widget.title), + ), + body: Center( + // Center is a layout widget. It takes a single child and positions it + // in the middle of the parent. + child: Column( + // Column is also layout widget. It takes a list of children and + // arranges them vertically. By default, it sizes itself to fit its + // children horizontally, and tries to be as tall as its parent. + // + // Invoke "debug painting" (press "p" in the console, choose the + // "Toggle Debug Paint" action from the Flutter Inspector in Android + // Studio, or the "Toggle Debug Paint" command in Visual Studio Code) + // to see the wireframe for each widget. + // + // Column has various properties to control how it sizes itself and + // how it positions its children. Here we use mainAxisAlignment to + // center the children vertically; the main axis here is the vertical + // axis because Columns are vertical (the cross axis would be + // horizontal). + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Text( + 'You have pushed the button this many times:', + ), + Text( + '$_counter', + style: Theme.of(context).textTheme.display1, + ), + ], + ), + ), + floatingActionButton: FloatingActionButton( + onPressed: _incrementCounter, + tooltip: 'Increment', + child: const Icon(Icons.add), + ), // This trailing comma makes auto-formatting nicer for build methods. + ); + } +} diff --git a/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/pubspec.yaml b/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/pubspec.yaml new file mode 100644 index 0000000000..bb6cdceec5 --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/pubspec.yaml @@ -0,0 +1,93 @@ +name: splash_screen_load_rotate +description: A new Flutter application. + +# The following defines the version and build number for your application. +# A version number is three numbers separated by dots, like 1.2.43 +# followed by an optional build number separated by a +. +# Both the version and the builder number may be overridden in flutter +# build by specifying --build-name and --build-number, respectively. +# In Android, build-name is used as versionName while build-number used as versionCode. +# Read more about Android versioning at https://developer.android.com/studio/publish/versioning +# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. +# Read more about iOS versioning at +# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html +version: 1.0.0+1 + +environment: + sdk: ">=2.1.0 <3.0.0" + +dependencies: + flutter: + sdk: flutter + + # The following adds the Cupertino Icons font to your application. + # Use with the CupertinoIcons class for iOS style icons. + cupertino_icons: 0.1.2 + + collection: 1.14.11 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + meta: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + typed_data: 1.1.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + vector_math: 2.0.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + +dev_dependencies: + flutter_test: + sdk: flutter + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter. + + async: 2.3.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + boolean_selector: 1.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + charcode: 1.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + matcher: 0.12.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + path: 1.6.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + pedantic: 1.8.0+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + quiver: 2.0.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + source_span: 1.5.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + stack_trace: 1.9.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + stream_channel: 2.0.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + string_scanner: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + term_glyph: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + test_api: 0.2.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + +flutter: + + # The following line ensures that the Material Icons font is + # included with your application, so that you can use the icons in + # the material Icons class. + uses-material-design: true + + # To add assets to your application, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware. + + # For details regarding adding assets from package dependencies, see + # https://flutter.dev/assets-and-images/#from-packages + + # To add custom fonts to your application, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts from package dependencies, + # see https://flutter.dev/custom-fonts/#from-packages + +# PUBSPEC CHECKSUM: e860 diff --git a/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/test/widget_test.dart b/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/test/widget_test.dart new file mode 100644 index 0000000000..d0efff84b5 --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_load_rotate/test/widget_test.dart @@ -0,0 +1,30 @@ +// This is a basic Flutter widget test. +// +// To perform an interaction with a widget in your test, use the WidgetTester +// utility that Flutter provides. For example, you can send tap and scroll +// gestures. You can also use WidgetTester to find child widgets in the widget +// tree, read text, and verify that the values of widget properties are correct. + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'package:splash_screen_load_rotate/main.dart'; + +void main() { + testWidgets('Counter increments smoke test', (WidgetTester tester) async { + // Build our app and trigger a frame. + await tester.pumpWidget(MyApp()); + + // Verify that our counter starts at 0. + expect(find.text('0'), findsOneWidget); + expect(find.text('1'), findsNothing); + + // Tap the '+' icon and trigger a frame. + await tester.tap(find.byIcon(Icons.add)); + await tester.pump(); + + // Verify that our counter has incremented. + expect(find.text('0'), findsNothing); + expect(find.text('1'), findsOneWidget); + }); +} diff --git a/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/.gitignore b/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/.gitignore new file mode 100644 index 0000000000..ac4a90645c --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/.gitignore @@ -0,0 +1,72 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +.dart_tool/ +.flutter-plugins +.packages +.pub-cache/ +.pub/ +/build/ + +# Android related +**/android/**/gradle-wrapper.jar +**/android/.gradle +**/android/captures/ +**/android/gradlew +**/android/gradlew.bat +**/android/local.properties +**/android/**/GeneratedPluginRegistrant.java + +# iOS/XCode related +**/ios/**/*.mode1v3 +**/ios/**/*.mode2v3 +**/ios/**/*.moved-aside +**/ios/**/*.pbxuser +**/ios/**/*.perspectivev3 +**/ios/**/*sync/ +**/ios/**/.sconsign.dblite +**/ios/**/.tags* +**/ios/**/.vagrant/ +**/ios/**/DerivedData/ +**/ios/**/Icon? +**/ios/**/Pods/ +**/ios/**/.symlinks/ +**/ios/**/profile +**/ios/**/xcuserdata +**/ios/.generated/ +**/ios/Flutter/App.framework +**/ios/Flutter/Flutter.framework +**/ios/Flutter/Generated.xcconfig +**/ios/Flutter/app.flx +**/ios/Flutter/app.zip +**/ios/Flutter/flutter_assets/ +**/ios/ServiceDefinitions.json +**/ios/Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!**/ios/**/default.mode1v3 +!**/ios/**/default.mode2v3 +!**/ios/**/default.pbxuser +!**/ios/**/default.perspectivev3 +!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages diff --git a/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/.metadata b/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/.metadata new file mode 100644 index 0000000000..693ab4f015 --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: 87a4fb567bcd3db87eb49f80d13e8ef95cfaa21e + channel: unknown + +project_type: app diff --git a/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/README.md b/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/README.md new file mode 100644 index 0000000000..def6d005e6 --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/README.md @@ -0,0 +1,7 @@ +# Splash Demo: Long transition animation + +This project is an example of a splash screen that fades very slowly to the Flutter UI. + +A slow transition is provided as a demo so that developers can manually verify that orientation +changes and other UI destruction processes do not cause issues with Flutter's splash system for +Android. diff --git a/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/app/build.gradle b/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/app/build.gradle new file mode 100644 index 0000000000..ea8e9ea993 --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/app/build.gradle @@ -0,0 +1,65 @@ +def localProperties = new Properties() +def localPropertiesFile = rootProject.file('local.properties') +if (localPropertiesFile.exists()) { + localPropertiesFile.withReader('UTF-8') { reader -> + localProperties.load(reader) + } +} + +def flutterRoot = localProperties.getProperty('flutter.sdk') +if (flutterRoot == null) { + throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") +} + +def flutterVersionCode = localProperties.getProperty('flutter.versionCode') +if (flutterVersionCode == null) { + flutterVersionCode = '1' +} + +def flutterVersionName = localProperties.getProperty('flutter.versionName') +if (flutterVersionName == null) { + flutterVersionName = '1.0' +} + +apply plugin: 'com.android.application' +apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" + +android { + compileSdkVersion 28 + + lintOptions { + disable 'InvalidPackage' + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "io.flutter.splash_screen_trans_rotate" + minSdkVersion 16 + targetSdkVersion 28 + versionCode flutterVersionCode.toInteger() + versionName flutterVersionName + 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 { + implementation 'androidx.fragment:fragment:1.1.0-beta01' + implementation 'androidx.lifecycle:lifecycle-runtime:2.2.0-alpha01' + implementation 'androidx.lifecycle:lifecycle-common-java8:2.2.0-alpha01' + + testImplementation 'junit:junit:4.12' + androidTestImplementation 'com.android.support.test:runner:1.0.2' + androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' +} diff --git a/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/app/src/debug/AndroidManifest.xml b/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 0000000000..05a9cbd2f3 --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/app/src/main/AndroidManifest.xml b/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..9f1ba01d88 --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + diff --git a/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/app/src/main/java/io/flutter/splash_screen_trans_rotate/MainActivity.java b/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/app/src/main/java/io/flutter/splash_screen_trans_rotate/MainActivity.java new file mode 100644 index 0000000000..039ec62bfe --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/app/src/main/java/io/flutter/splash_screen_trans_rotate/MainActivity.java @@ -0,0 +1,47 @@ +package io.flutter.splash_screen_trans_rotate; + +import android.content.Context; +import android.util.Log; + +import androidx.annotation.Nullable; + +import io.flutter.embedding.android.FlutterActivity; +import io.flutter.embedding.android.SplashScreen; +import io.flutter.embedding.engine.FlutterEngine; +import io.flutter.embedding.engine.dart.DartExecutor; +import io.flutter.view.FlutterMain; + +public class MainActivity extends FlutterActivity { + private static FlutterEngine flutterEngine; + + static { + // Explicitly activates Debug logging for the Flutter Android embedding. + io.flutter.Log.setLogLevel(Log.DEBUG); + } + + /** + * We explicitly provide a {@code FlutterEngine} so that every rotation does not create a + * new FlutterEngine. Creating a new FlutterEngine on every orientation would cause the + * splash experience to restart upon every orientation change, which is not what we're + * interested in verifying in this example app. + */ + @Override + public FlutterEngine provideFlutterEngine(Context context) { + if (flutterEngine == null) { + flutterEngine = new FlutterEngine(context); + + flutterEngine.getDartExecutor().executeDartEntrypoint(new DartExecutor.DartEntrypoint( + getAssets(), + FlutterMain.findAppBundlePath(context), + "main" + )); + } + return flutterEngine; + } + + @Override + @Nullable + public SplashScreen provideSplashScreen() { + return new VeryLongTransitionSplashScreen(); + } +} diff --git a/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/app/src/main/java/io/flutter/splash_screen_trans_rotate/VeryLongTransitionSplashScreen.java b/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/app/src/main/java/io/flutter/splash_screen_trans_rotate/VeryLongTransitionSplashScreen.java new file mode 100644 index 0000000000..e94a3f6a53 --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/app/src/main/java/io/flutter/splash_screen_trans_rotate/VeryLongTransitionSplashScreen.java @@ -0,0 +1,64 @@ +package io.flutter.splash_screen_trans_rotate; + +import android.content.Context; +import android.os.Bundle; +import android.util.Log; +import android.view.View; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import io.flutter.embedding.android.SplashScreen; + +/** + * {@code SplashScreen} that displays a yellow splash screen {@code View}, which slowly fades + * out when Flutter is ready. + *

+ * See {@link VeryLongTransitionSplashView} for visual details. + */ +public class VeryLongTransitionSplashScreen implements SplashScreen { + private VeryLongTransitionSplashView splashView; + + @Override + public View createSplashView(@NonNull Context context, @Nullable Bundle savedInstanceState) { + splashView = new VeryLongTransitionSplashView(context); + splashView.restoreSplashState(savedInstanceState); + return splashView; + } + + @Override + public void transitionToFlutter(@NonNull Runnable onTransitionComplete) { + if (splashView != null) { + splashView.transitionToFlutter(onTransitionComplete); + } else { + onTransitionComplete.run(); + } + } + + /** + * Informs Flutter that we are capable of restoring a transition that was previously + * in progress. + *

+ * A splash transition can be interrupted by configuration changes or other OS operations. + *

+ * If we were to return false here, then an orientation change would skip the rest of + * the transition and jump directly to the Flutter UI. + */ + @Override + public boolean doesSplashViewRememberItsTransition() { + return true; + } + + /** + * Saves the state of our {@code splashView} so that we can restore the long fade transition + * when we are recreated after a config change or other recreation event. + */ + @Override + @Nullable + public Bundle saveSplashScreenState() { + if (splashView != null) { + return splashView.saveSplashState(); + } else { + return null; + } + } +} diff --git a/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/app/src/main/java/io/flutter/splash_screen_trans_rotate/VeryLongTransitionSplashView.java b/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/app/src/main/java/io/flutter/splash_screen_trans_rotate/VeryLongTransitionSplashView.java new file mode 100644 index 0000000000..b0dd82412f --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/app/src/main/java/io/flutter/splash_screen_trans_rotate/VeryLongTransitionSplashView.java @@ -0,0 +1,125 @@ +package io.flutter.splash_screen_trans_rotate; + +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.ValueAnimator; +import android.content.Context; +import android.graphics.Color; +import android.os.Bundle; +import android.util.Log; +import android.view.ViewPropertyAnimator; +import android.widget.FrameLayout; +import androidx.annotation.Nullable; +import androidx.annotation.NonNull; + +/** + * {@code View} that appears entirely yellow and slowly fades away, upon request. + *

+ * Call {@link #transitionToFlutter(Runnable)} to begin fading away. + *

+ * Call {@link #saveSplashState()} to save the current state of this splash {@code View}, + * e.g., the current state of the fade transition. + *

+ * Call {@link #restoreSplashState(Bundle)} to restore a previous state of this splash + * {@code View}, e.g., the previous state of an interrupted fade transition. + */ +public class VeryLongTransitionSplashView extends FrameLayout { + private static final String TAG = "VeryLongTransitionSplashView"; + + private static final int ANIMATION_TIME_IN_MILLIS = 10000; + + private float transitionPercentWhenAnimationStarted = 0.0f; + private float totalTransitionPercent = 0.0f; + private Runnable onTransitionComplete; + private ViewPropertyAnimator fadeAnimator; + + private final ValueAnimator.AnimatorUpdateListener animatorUpdateListener = new ValueAnimator.AnimatorUpdateListener() { + @Override + public void onAnimationUpdate(ValueAnimator animation) { + // We have to represent transition percent as a starting value + the fraction of the + // running animation. This is because there is no way to start an Animator and inform + // it that it should already be X percent complete. + totalTransitionPercent = transitionPercentWhenAnimationStarted + + (animation.getAnimatedFraction() * (1.0f - transitionPercentWhenAnimationStarted)); + } + }; + + private final Animator.AnimatorListener animatorListener = new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + // Remove all animation listeners to avoid memory leaks. + animation.removeAllListeners(); + + // Notify listener that we're done transitioning. + if (onTransitionComplete != null) { + onTransitionComplete.run(); + } + } + + @Override + public void onAnimationCancel(Animator animation) { + // Remove all animation listeners to avoid memory leaks. + animation.removeAllListeners(); + } + }; + + public VeryLongTransitionSplashView(Context context) { + super(context); + + // Give the UI a yellow background to prove that this splash screen view takes up + // all available space. + setBackgroundColor(Color.YELLOW); + } + + /** + * Begins fading out. + *

+ * If a previous transition state was restored, this method will begin fading out from the + * previously restored transition percent. See {@link #restoreSplashState(Bundle)}. + */ + public void transitionToFlutter(@NonNull Runnable onTransitionComplete) { + Log.d(TAG, "Transitioning to flutter."); + this.onTransitionComplete = onTransitionComplete; + + fadeAnimator = animate() + .alpha(0.0f) + .setDuration(Math.round(ANIMATION_TIME_IN_MILLIS * (1.0 - totalTransitionPercent))) + .setUpdateListener(animatorUpdateListener) + .setListener(animatorListener); + fadeAnimator.start(); + } + + @Override + protected void onDetachedFromWindow() { + if (fadeAnimator != null) { + // Cancel our animator to avoid leaks. + fadeAnimator.cancel(); + } + super.onDetachedFromWindow(); + } + + @Nullable + public Bundle saveSplashState() { + Log.d(TAG, "Saving splash state."); + if (totalTransitionPercent > 0.0f && totalTransitionPercent < 1.0f) { + Bundle state = new Bundle(); + state.putFloat("totalTransitionPercent", totalTransitionPercent); + Log.d(TAG, String.format("Transition percent: %.2f", totalTransitionPercent)); + return state; + } else { + Log.d(TAG, "No transition to save."); + return null; + } + } + + public void restoreSplashState(@Nullable Bundle bundle) { + Log.d(TAG, "Restoring splash state: " + bundle); + if (bundle != null) { + transitionPercentWhenAnimationStarted = bundle.getFloat("totalTransitionPercent"); + setAlpha(1.0f - transitionPercentWhenAnimationStarted); + Log.d(TAG, String.format("State restored with transition percent: %.2f", transitionPercentWhenAnimationStarted)); + } else { + Log.d(TAG, "No state provided."); + } + } +} diff --git a/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/app/src/main/res/drawable/launch_background.xml b/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 0000000000..dd65c19876 --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/app/src/main/res/drawable/normal_background.xml b/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/app/src/main/res/drawable/normal_background.xml new file mode 100644 index 0000000000..5782842b81 --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/app/src/main/res/drawable/normal_background.xml @@ -0,0 +1,4 @@ + + + + diff --git a/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/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/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/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/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/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 + + #FFFFFF00 + \ No newline at end of file diff --git a/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/app/src/main/res/values/ids.xml b/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/app/src/main/res/values/ids.xml new file mode 100644 index 0000000000..9cf305abe1 --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/app/src/main/res/values/ids.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/app/src/main/res/values/styles.xml b/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000000..2032af9d4b --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/app/src/main/res/values/styles.xml @@ -0,0 +1,12 @@ + + + + + + diff --git a/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/app/src/profile/AndroidManifest.xml b/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 0000000000..05a9cbd2f3 --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/build.gradle b/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/build.gradle new file mode 100644 index 0000000000..bb8a303898 --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/build.gradle @@ -0,0 +1,29 @@ +buildscript { + repositories { + google() + jcenter() + } + + dependencies { + classpath 'com.android.tools.build:gradle:3.2.1' + } +} + +allprojects { + repositories { + google() + jcenter() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(':app') +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/gradle.properties b/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/gradle.properties new file mode 100644 index 0000000000..94adc3a3f9 --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx1536M +android.useAndroidX=true +android.enableJetifier=true diff --git a/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/gradle/wrapper/gradle-wrapper.properties b/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000..2819f022f1 --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Fri Jun 23 08:50:38 CEST 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip diff --git a/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/settings.gradle b/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/settings.gradle new file mode 100644 index 0000000000..5a2f14fb18 --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/android/settings.gradle @@ -0,0 +1,15 @@ +include ':app' + +def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() + +def plugins = new Properties() +def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') +if (pluginsFile.exists()) { + pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } +} + +plugins.each { name, path -> + def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() + include ":$name" + project(":$name").projectDir = pluginDirectory +} diff --git a/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/lib/main.dart b/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/lib/main.dart new file mode 100644 index 0000000000..7342a11e85 --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/lib/main.dart @@ -0,0 +1,111 @@ +import 'package:flutter/material.dart'; + +void main() => runApp(MyApp()); + +class MyApp extends StatelessWidget { + // This widget is the root of your application. + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Flutter Demo', + theme: ThemeData( + // This is the theme of your application. + // + // Try running your application with "flutter run". You'll see the + // application has a blue toolbar. Then, without quitting the app, try + // changing the primarySwatch below to Colors.green and then invoke + // "hot reload" (press "r" in the console where you ran "flutter run", + // or simply save your changes to "hot reload" in a Flutter IDE). + // Notice that the counter didn't reset back to zero; the application + // is not restarted. + primarySwatch: Colors.blue, + ), + home: const MyHomePage(title: 'Flutter Demo Home Page'), + ); + } +} + +class MyHomePage extends StatefulWidget { + const MyHomePage({Key key, this.title}) : super(key: key); + + // This widget is the home page of your application. It is stateful, meaning + // that it has a State object (defined below) that contains fields that affect + // how it looks. + + // This class is the configuration for the state. It holds the values (in this + // case the title) provided by the parent (in this case the App widget) and + // used by the build method of the State. Fields in a Widget subclass are + // always marked "final". + + final String title; + + @override + _MyHomePageState createState() => _MyHomePageState(); +} + +class _MyHomePageState extends State { + int _counter = 0; + + void _incrementCounter() { + setState(() { + // This call to setState tells the Flutter framework that something has + // changed in this State, which causes it to rerun the build method below + // so that the display can reflect the updated values. If we changed + // _counter without calling setState(), then the build method would not be + // called again, and so nothing would appear to happen. + _counter++; + }); + } + + @override + Widget build(BuildContext context) { + // This method is rerun every time setState is called, for instance as done + // by the _incrementCounter method above. + // + // The Flutter framework has been optimized to make rerunning build methods + // fast, so that you can just rebuild anything that needs updating rather + // than having to individually change instances of widgets. + return Scaffold( + appBar: AppBar( + // Here we take the value from the MyHomePage object that was created by + // the App.build method, and use it to set our appbar title. + title: Text(widget.title), + ), + body: Center( + // Center is a layout widget. It takes a single child and positions it + // in the middle of the parent. + child: Column( + // Column is also layout widget. It takes a list of children and + // arranges them vertically. By default, it sizes itself to fit its + // children horizontally, and tries to be as tall as its parent. + // + // Invoke "debug painting" (press "p" in the console, choose the + // "Toggle Debug Paint" action from the Flutter Inspector in Android + // Studio, or the "Toggle Debug Paint" command in Visual Studio Code) + // to see the wireframe for each widget. + // + // Column has various properties to control how it sizes itself and + // how it positions its children. Here we use mainAxisAlignment to + // center the children vertically; the main axis here is the vertical + // axis because Columns are vertical (the cross axis would be + // horizontal). + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Text( + 'You have pushed the button this many times:', + ), + Text( + '$_counter', + style: Theme.of(context).textTheme.display1, + ), + ], + ), + ), + floatingActionButton: FloatingActionButton( + onPressed: _incrementCounter, + tooltip: 'Increment', + child: const Icon(Icons.add), + ), // This trailing comma makes auto-formatting nicer for build methods. + ); + } +} diff --git a/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/pubspec.yaml b/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/pubspec.yaml new file mode 100644 index 0000000000..ddedfef3a9 --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/pubspec.yaml @@ -0,0 +1,132 @@ +name: splash_screen_trans_rotate +description: A new Flutter application. + +# The following defines the version and build number for your application. +# A version number is three numbers separated by dots, like 1.2.43 +# followed by an optional build number separated by a +. +# Both the version and the builder number may be overridden in flutter +# build by specifying --build-name and --build-number, respectively. +# In Android, build-name is used as versionName while build-number used as versionCode. +# Read more about Android versioning at https://developer.android.com/studio/publish/versioning +# In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. +# Read more about iOS versioning at +# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html +version: 1.0.0+1 + +environment: + sdk: ">=2.1.0 <3.0.0" + +dependencies: + flutter: + sdk: flutter + + # The following adds the Cupertino Icons font to your application. + # Use with the CupertinoIcons class for iOS style icons. + cupertino_icons: 0.1.2 + + collection: 1.14.11 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + meta: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + typed_data: 1.1.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + vector_math: 2.0.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + +dev_dependencies: + flutter_test: + sdk: flutter + + flutter_driver: + sdk: flutter + test: 1.6.3 + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter. + + analyzer: 0.36.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + args: 1.5.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + async: 2.3.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + boolean_selector: 1.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + charcode: 1.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + convert: 2.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + crypto: 2.0.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + csslib: 0.16.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + file: 5.0.8+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + front_end: 0.1.19 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + glob: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + html: 0.14.0+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + http: 0.12.0+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + http_multi_server: 2.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + http_parser: 3.1.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + intl: 0.15.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + io: 0.3.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + js: 0.6.1+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + json_rpc_2: 2.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + kernel: 0.3.19 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + matcher: 0.12.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + mime: 0.9.6+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + multi_server_socket: 1.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + node_preamble: 1.4.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + package_config: 1.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + package_resolver: 1.0.10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + path: 1.6.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + pedantic: 1.8.0+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + pool: 1.4.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + pub_semver: 1.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + quiver: 2.0.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + shelf: 0.7.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + shelf_packages_handler: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + shelf_static: 0.2.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + shelf_web_socket: 0.2.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + source_map_stack_trace: 1.1.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + source_maps: 0.10.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + source_span: 1.5.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + stack_trace: 1.9.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + stream_channel: 2.0.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + string_scanner: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + term_glyph: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + test_api: 0.2.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + test_core: 0.2.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + vm_service_client: 0.2.6+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + watcher: 0.9.7+12 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + web_socket_channel: 1.0.14 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + yaml: 2.1.16 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + +flutter: + + # The following line ensures that the Material Icons font is + # included with your application, so that you can use the icons in + # the material Icons class. + uses-material-design: true + + # To add assets to your application, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware. + + # For details regarding adding assets from package dependencies, see + # https://flutter.dev/assets-and-images/#from-packages + + # To add custom fonts to your application, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts from package dependencies, + # see https://flutter.dev/custom-fonts/#from-packages + +# PUBSPEC CHECKSUM: e85f diff --git a/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/test/widget_test.dart b/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/test/widget_test.dart new file mode 100644 index 0000000000..79b3ab3858 --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/test/widget_test.dart @@ -0,0 +1,30 @@ +// This is a basic Flutter widget test. +// +// To perform an interaction with a widget in your test, use the WidgetTester +// utility that Flutter provides. For example, you can send tap and scroll +// gestures. You can also use WidgetTester to find child widgets in the widget +// tree, read text, and verify that the values of widget properties are correct. + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'package:splash_screen_trans_rotate/main.dart'; + +void main() { + testWidgets('Counter increments smoke test', (WidgetTester tester) async { + // Build our app and trigger a frame. + await tester.pumpWidget(MyApp()); + + // Verify that our counter starts at 0. + expect(find.text('0'), findsOneWidget); + expect(find.text('1'), findsNothing); + + // Tap the '+' icon and trigger a frame. + await tester.tap(find.byIcon(Icons.add)); + await tester.pump(); + + // Verify that our counter has incremented. + expect(find.text('0'), findsNothing); + expect(find.text('1'), findsOneWidget); + }); +} diff --git a/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/test_driver/main.dart b/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/test_driver/main.dart new file mode 100644 index 0000000000..cc92f2bf5f --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/test_driver/main.dart @@ -0,0 +1,7 @@ +import 'package:flutter_driver/driver_extension.dart'; +import 'package:splash_screen_trans_rotate/main.dart' as app; + +void main() { + enableFlutterDriverExtension(); + app.main(); +} \ No newline at end of file diff --git a/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/test_driver/main_test.dart b/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/test_driver/main_test.dart new file mode 100644 index 0000000000..c124a42bc0 --- /dev/null +++ b/dev/integration_tests/android_splash_screens/splash_screen_trans_rotate/test_driver/main_test.dart @@ -0,0 +1,28 @@ +// Copyright 2018 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter_driver/flutter_driver.dart'; + +import 'package:test/test.dart' hide TypeMatcher, isInstanceOf; + +void main() { + group('end-to-end test', () { + FlutterDriver driver; + + setUpAll(() async { + driver = await FlutterDriver.connect(); + }); + + tearDownAll(() async { + await driver?.close(); + }); + + test('Flutter experience eventually appears', () async { + final SerializableFinder fabFinder = find.byTooltip('Increment'); + + // Ensure that the Flutter experience eventually becomes visible. + await driver.waitFor(fabFinder); + }); + }); +} diff --git a/dev/integration_tests/android_views/pubspec.yaml b/dev/integration_tests/android_views/pubspec.yaml index 03add699f4..2a75d9a6ab 100644 --- a/dev/integration_tests/android_views/pubspec.yaml +++ b/dev/integration_tests/android_views/pubspec.yaml @@ -55,7 +55,7 @@ dev_dependencies: matcher: 0.12.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" mime: 0.9.6+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" multi_server_socket: 1.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - node_preamble: 1.4.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + node_preamble: 1.4.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" package_config: 1.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" package_resolver: 1.0.10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" pedantic: 1.8.0+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -76,4 +76,4 @@ dev_dependencies: flutter: uses-material-design: true -# PUBSPEC CHECKSUM: 0581 +# PUBSPEC CHECKSUM: 1682 diff --git a/dev/integration_tests/channels/pubspec.yaml b/dev/integration_tests/channels/pubspec.yaml index 7dd31950f9..d3923d554b 100644 --- a/dev/integration_tests/channels/pubspec.yaml +++ b/dev/integration_tests/channels/pubspec.yaml @@ -37,7 +37,7 @@ dependencies: meta: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" mime: 0.9.6+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" multi_server_socket: 1.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - node_preamble: 1.4.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + node_preamble: 1.4.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" package_config: 1.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" package_resolver: 1.0.10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" path: 1.6.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -67,4 +67,4 @@ dependencies: flutter: uses-material-design: true -# PUBSPEC CHECKSUM: b1ce +# PUBSPEC CHECKSUM: 80cf diff --git a/dev/integration_tests/codegen/pubspec.yaml b/dev/integration_tests/codegen/pubspec.yaml index 343472c0e6..92c457d92e 100644 --- a/dev/integration_tests/codegen/pubspec.yaml +++ b/dev/integration_tests/codegen/pubspec.yaml @@ -50,7 +50,7 @@ dev_dependencies: matcher: 0.12.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" mime: 0.9.6+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" multi_server_socket: 1.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - node_preamble: 1.4.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + node_preamble: 1.4.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" package_config: 1.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" package_resolver: 1.0.10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" pedantic: 1.8.0+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -74,4 +74,4 @@ builders: flutter: uses-material-design: true -# PUBSPEC CHECKSUM: b1ce +# PUBSPEC CHECKSUM: 80cf diff --git a/dev/integration_tests/external_ui/pubspec.yaml b/dev/integration_tests/external_ui/pubspec.yaml index db2570b160..3d834d1216 100644 --- a/dev/integration_tests/external_ui/pubspec.yaml +++ b/dev/integration_tests/external_ui/pubspec.yaml @@ -37,7 +37,7 @@ dependencies: meta: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" mime: 0.9.6+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" multi_server_socket: 1.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - node_preamble: 1.4.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + node_preamble: 1.4.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" package_config: 1.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" package_resolver: 1.0.10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" path: 1.6.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -67,4 +67,4 @@ dependencies: flutter: uses-material-design: true -# PUBSPEC CHECKSUM: b1ce +# PUBSPEC CHECKSUM: 80cf diff --git a/dev/integration_tests/flavors/pubspec.yaml b/dev/integration_tests/flavors/pubspec.yaml index e0f874b5f1..5483223b59 100644 --- a/dev/integration_tests/flavors/pubspec.yaml +++ b/dev/integration_tests/flavors/pubspec.yaml @@ -37,7 +37,7 @@ dependencies: meta: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" mime: 0.9.6+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" multi_server_socket: 1.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - node_preamble: 1.4.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + node_preamble: 1.4.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" package_config: 1.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" package_resolver: 1.0.10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" path: 1.6.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -67,4 +67,4 @@ dependencies: flutter: uses-material-design: true -# PUBSPEC CHECKSUM: b1ce +# PUBSPEC CHECKSUM: 80cf diff --git a/dev/integration_tests/image_loading/pubspec.yaml b/dev/integration_tests/image_loading/pubspec.yaml index accfdbf8b6..8f0fd3cd2d 100644 --- a/dev/integration_tests/image_loading/pubspec.yaml +++ b/dev/integration_tests/image_loading/pubspec.yaml @@ -30,7 +30,7 @@ dependencies: meta: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" mime: 0.9.6+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" multi_server_socket: 1.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - node_preamble: 1.4.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + node_preamble: 1.4.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" package_config: 1.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" package_resolver: 1.0.10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" path: 1.6.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -60,4 +60,4 @@ dependencies: flutter: uses-material-design: true -# PUBSPEC CHECKSUM: f583 +# PUBSPEC CHECKSUM: c484 diff --git a/dev/integration_tests/platform_interaction/pubspec.yaml b/dev/integration_tests/platform_interaction/pubspec.yaml index c49e474727..6af7eb7431 100644 --- a/dev/integration_tests/platform_interaction/pubspec.yaml +++ b/dev/integration_tests/platform_interaction/pubspec.yaml @@ -37,7 +37,7 @@ dependencies: meta: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" mime: 0.9.6+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" multi_server_socket: 1.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - node_preamble: 1.4.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + node_preamble: 1.4.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" package_config: 1.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" package_resolver: 1.0.10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" path: 1.6.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -67,4 +67,4 @@ dependencies: flutter: uses-material-design: true -# PUBSPEC CHECKSUM: b1ce +# PUBSPEC CHECKSUM: 80cf diff --git a/dev/integration_tests/ui/pubspec.yaml b/dev/integration_tests/ui/pubspec.yaml index d792a835df..80f90464e9 100644 --- a/dev/integration_tests/ui/pubspec.yaml +++ b/dev/integration_tests/ui/pubspec.yaml @@ -39,7 +39,7 @@ dependencies: meta: 1.1.7 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" mime: 0.9.6+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" multi_server_socket: 1.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - node_preamble: 1.4.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + node_preamble: 1.4.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" package_config: 1.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" package_resolver: 1.0.10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" path: 1.6.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -77,4 +77,4 @@ dev_dependencies: flutter: uses-material-design: true -# PUBSPEC CHECKSUM: a113 +# PUBSPEC CHECKSUM: c214 diff --git a/dev/snippets/pubspec.yaml b/dev/snippets/pubspec.yaml index 41015feb63..081dd403d8 100644 --- a/dev/snippets/pubspec.yaml +++ b/dev/snippets/pubspec.yaml @@ -53,7 +53,7 @@ dev_dependencies: matcher: 0.12.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" mime: 0.9.6+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" multi_server_socket: 1.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - node_preamble: 1.4.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + node_preamble: 1.4.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" package_resolver: 1.0.10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" pool: 1.4.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" shelf: 0.7.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -98,4 +98,4 @@ executables: vm_service_client: 0.2.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" web_socket_channel: 1.0.9 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" -# PUBSPEC CHECKSUM: f492 +# PUBSPEC CHECKSUM: bd93 diff --git a/examples/catalog/pubspec.yaml b/examples/catalog/pubspec.yaml index c6a30364fc..190acf40fb 100644 --- a/examples/catalog/pubspec.yaml +++ b/examples/catalog/pubspec.yaml @@ -45,7 +45,7 @@ dev_dependencies: matcher: 0.12.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" mime: 0.9.6+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" multi_server_socket: 1.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - node_preamble: 1.4.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + node_preamble: 1.4.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" package_config: 1.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" package_resolver: 1.0.10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" pedantic: 1.8.0+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -73,4 +73,4 @@ dev_dependencies: flutter: uses-material-design: true -# PUBSPEC CHECKSUM: 65b9 +# PUBSPEC CHECKSUM: 4eba diff --git a/examples/flutter_gallery/pubspec.yaml b/examples/flutter_gallery/pubspec.yaml index 64045bed6f..58fcd94eaf 100644 --- a/examples/flutter_gallery/pubspec.yaml +++ b/examples/flutter_gallery/pubspec.yaml @@ -59,7 +59,7 @@ dev_dependencies: matcher: 0.12.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" mime: 0.9.6+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" multi_server_socket: 1.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - node_preamble: 1.4.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + node_preamble: 1.4.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" package_config: 1.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" package_resolver: 1.0.10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" pedantic: 1.8.0+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -254,4 +254,4 @@ flutter: - asset: packages/flutter_gallery_assets/fonts/merriweather/Merriweather-Regular.ttf - asset: packages/flutter_gallery_assets/fonts/merriweather/Merriweather-Light.ttf -# PUBSPEC CHECKSUM: 8185 +# PUBSPEC CHECKSUM: 4586 diff --git a/examples/platform_channel/pubspec.yaml b/examples/platform_channel/pubspec.yaml index 41f0a96583..d1a2333fde 100644 --- a/examples/platform_channel/pubspec.yaml +++ b/examples/platform_channel/pubspec.yaml @@ -43,7 +43,7 @@ dev_dependencies: matcher: 0.12.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" mime: 0.9.6+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" multi_server_socket: 1.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - node_preamble: 1.4.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + node_preamble: 1.4.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" package_config: 1.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" package_resolver: 1.0.10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" path: 1.6.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -72,4 +72,4 @@ dev_dependencies: flutter: uses-material-design: true -# PUBSPEC CHECKSUM: 65b9 +# PUBSPEC CHECKSUM: 4eba diff --git a/examples/platform_channel_swift/pubspec.yaml b/examples/platform_channel_swift/pubspec.yaml index 53c33cd869..b3764e1a7d 100644 --- a/examples/platform_channel_swift/pubspec.yaml +++ b/examples/platform_channel_swift/pubspec.yaml @@ -43,7 +43,7 @@ dev_dependencies: matcher: 0.12.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" mime: 0.9.6+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" multi_server_socket: 1.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - node_preamble: 1.4.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + node_preamble: 1.4.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" package_config: 1.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" package_resolver: 1.0.10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" path: 1.6.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -72,4 +72,4 @@ dev_dependencies: flutter: uses-material-design: true -# PUBSPEC CHECKSUM: 65b9 +# PUBSPEC CHECKSUM: 4eba diff --git a/packages/flutter_tools/lib/src/commands/update_packages.dart b/packages/flutter_tools/lib/src/commands/update_packages.dart index 1ab825720d..893cd96182 100644 --- a/packages/flutter_tools/lib/src/commands/update_packages.dart +++ b/packages/flutter_tools/lib/src/commands/update_packages.dart @@ -24,7 +24,8 @@ const Map _kManuallyPinnedDependencies = { 'flutter_gallery_assets': '0.1.9+2', // See //examples/flutter_gallery/pubspec.yaml 'test': '1.6.3', // | Tests are timing out at 1.6.4 https://github.com/flutter/flutter/issues/33823 'test_api': '0.2.5', // | - 'test_core': '0.2.5' // | + 'test_core': '0.2.5', // | + 'build_runner': '1.6.1' // TODO(jonahwilliams): allow newer versions }; class UpdatePackagesCommand extends FlutterCommand { diff --git a/packages/flutter_tools/pubspec.yaml b/packages/flutter_tools/pubspec.yaml index 0c58efad55..de771fa27f 100644 --- a/packages/flutter_tools/pubspec.yaml +++ b/packages/flutter_tools/pubspec.yaml @@ -13,7 +13,7 @@ dependencies: args: 1.5.2 bsdiff: 0.1.0 completion: 0.2.1+1 - coverage: 0.13.1 + coverage: 0.13.2 crypto: 2.0.6 file: 5.0.8+1 http: 0.12.0+2 @@ -33,7 +33,7 @@ dependencies: usage: 3.4.1 vm_service_client: 0.2.6+2 web_socket_channel: 1.0.14 - webkit_inspection_protocol: 0.4.2 + webkit_inspection_protocol: 0.5.0 xml: 3.5.0 yaml: 2.1.16 flutter_goldens_client: @@ -51,7 +51,7 @@ dependencies: dart_style: 1.2.9 code_builder: 3.2.0 build: 1.1.5 - build_modules: 2.3.0 + build_modules: 2.3.1 build_daemon: 1.1.0 build_web_compilers: 2.1.4 @@ -111,7 +111,7 @@ dev_dependencies: mime: 0.9.6+3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" multi_server_socket: 1.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" - node_preamble: 1.4.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" + node_preamble: 1.4.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" shelf_packages_handler: 1.0.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" shelf_static: 0.2.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade" @@ -119,4 +119,4 @@ dartdoc: # Exclude this package from the hosted API docs. nodoc: true -# PUBSPEC CHECKSUM: 5030 +# PUBSPEC CHECKSUM: 4832