Merge branches 'master' and 'master' of github.com:flutter/flutter into timsneath-precache2
138
.cirrus.yml
@ -72,7 +72,11 @@ task:
|
||||
env:
|
||||
GCLOUD_SERVICE_ACCOUNT_KEY: ENCRYPTED[f12abe60f5045d619ef4c79b83dd1e0722a0b0b13dbea95fbe334e2db7fffbcd841a5a92da8824848b539a19afe0c9fb]
|
||||
SHARD: tests
|
||||
DEPOT_TOOLS: "tmp/depot_tools"
|
||||
GOLDCTL: "$DEPOT_TOOLS/goldctl"
|
||||
GOLD_SERVICE_ACCOUNT: ENCRYPTED[3afeea5ac7201151c3d0dc9648862f0462b5e4f55dc600ca8b692319622f7c3eda3d577b1b16cc2ef0311b7314c1c095]
|
||||
SUBSHARD: framework_other
|
||||
goldctl_script: ./dev/bots/download_goldctl.sh
|
||||
test_script:
|
||||
- dart --enable-asserts ./dev/bots/test.dart
|
||||
container:
|
||||
@ -219,7 +223,11 @@ task:
|
||||
- ./dev/bots/firebase_testlab.sh
|
||||
- export CIRRUS_CHANGE_MESSAGE=`cat /tmp/cirrus_change_message.txt`
|
||||
- export CIRRUS_COMMIT_MESSAGE=`cat /tmp/cirrus_commit_message.txt`
|
||||
|
||||
- name: customer_testing-linux
|
||||
script:
|
||||
- rm -rf bin/cache/pkg/tests
|
||||
- git clone https://github.com/flutter/tests.git bin/cache/pkg/tests
|
||||
- dart --enable-asserts dev/customer_testing/run_tests.dart --skip-on-fetch-failure --skip-template bin/cache/pkg/tests/registry/*.test
|
||||
|
||||
task:
|
||||
use_compute_credits: $CIRRUS_USER_COLLABORATOR == 'true' && $CIRRUS_PR == ''
|
||||
@ -229,6 +237,7 @@ task:
|
||||
cpu: 4
|
||||
env:
|
||||
CIRRUS_WORKING_DIR: "C:\\Windows\\Temp\\flutter sdk"
|
||||
PATH: "$CIRRUS_WORKING_DIR/bin;$CIRRUS_WORKING_DIR/bin/cache/dart-sdk/bin;$PATH"
|
||||
git_fetch_script:
|
||||
- git clean -xfd
|
||||
- git fetch origin
|
||||
@ -244,12 +253,12 @@ task:
|
||||
folder: bin\cache\artifacts
|
||||
fingerprint_script: echo %OS% & type bin\internal\engine.version
|
||||
setup_script:
|
||||
- bin\flutter.bat config --no-analytics
|
||||
- bin\flutter.bat doctor -v
|
||||
- bin\flutter.bat update-packages
|
||||
- flutter config --no-analytics
|
||||
- flutter doctor -v
|
||||
- flutter update-packages
|
||||
- git fetch origin master
|
||||
test_all_script:
|
||||
- bin\cache\dart-sdk\bin\dart.exe --enable-asserts dev\bots\test.dart
|
||||
- dart --enable-asserts dev\bots\test.dart
|
||||
matrix:
|
||||
# all of the tests except test/integration and test/commands/create_test for packages/flutter_tools
|
||||
- name: tool_tests-windows
|
||||
@ -279,6 +288,7 @@ task:
|
||||
cpu: 4
|
||||
env:
|
||||
CIRRUS_WORKING_DIR: "C:\\Windows\\Temp\\flutter sdk"
|
||||
PATH: "$CIRRUS_WORKING_DIR/bin;$CIRRUS_WORKING_DIR/bin/cache/dart-sdk/bin;$PATH"
|
||||
git_fetch_script:
|
||||
- git clean -xfd
|
||||
- git fetch origin
|
||||
@ -294,40 +304,56 @@ task:
|
||||
folder: bin\cache\artifacts
|
||||
fingerprint_script: echo %OS% & type bin\internal\engine.version
|
||||
setup_script:
|
||||
- bin\flutter.bat config --no-analytics
|
||||
- bin\flutter.bat doctor -v
|
||||
- bin\flutter.bat update-packages
|
||||
- flutter config --no-analytics
|
||||
- flutter doctor -v
|
||||
- flutter update-packages
|
||||
- git fetch origin master
|
||||
test_all_script:
|
||||
- bin\cache\dart-sdk\bin\dart.exe --enable-asserts dev\bots\test.dart
|
||||
matrix:
|
||||
- name: tests_widgets-windows
|
||||
env:
|
||||
GCLOUD_SERVICE_ACCOUNT_KEY: ENCRYPTED[f12abe60f5045d619ef4c79b83dd1e0722a0b0b13dbea95fbe334e2db7fffbcd841a5a92da8824848b539a19afe0c9fb]
|
||||
SHARD: tests
|
||||
SUBSHARD: widgets
|
||||
test_all_script:
|
||||
- dart --enable-asserts dev\bots\test.dart
|
||||
- name: tests_framework_other-windows
|
||||
env:
|
||||
GCLOUD_SERVICE_ACCOUNT_KEY: ENCRYPTED[f12abe60f5045d619ef4c79b83dd1e0722a0b0b13dbea95fbe334e2db7fffbcd841a5a92da8824848b539a19afe0c9fb]
|
||||
SHARD: tests
|
||||
SUBSHARD: framework_other
|
||||
GOLDCTL: "C:\\Windows\\Temp\\goldctl_tool\\goldctl.exe"
|
||||
GOLD_SERVICE_ACCOUNT: ENCRYPTED[3afeea5ac7201151c3d0dc9648862f0462b5e4f55dc600ca8b692319622f7c3eda3d577b1b16cc2ef0311b7314c1c095]
|
||||
goldctl_script: powershell dev\bots\download_goldctl.ps1
|
||||
test_all_script:
|
||||
- dart --enable-asserts dev\bots\test.dart
|
||||
- name: tests_extras-windows
|
||||
env:
|
||||
GCLOUD_SERVICE_ACCOUNT_KEY: ENCRYPTED[f12abe60f5045d619ef4c79b83dd1e0722a0b0b13dbea95fbe334e2db7fffbcd841a5a92da8824848b539a19afe0c9fb]
|
||||
SHARD: tests
|
||||
SUBSHARD: extras
|
||||
test_all_script:
|
||||
- dart --enable-asserts dev\bots\test.dart
|
||||
- name: build_tests-windows
|
||||
env:
|
||||
SHARD: build_tests
|
||||
container:
|
||||
cpu: 4
|
||||
memory: 12G
|
||||
test_all_script:
|
||||
- dart --enable-asserts dev\bots\test.dart
|
||||
- name: integration_tests-windows
|
||||
env:
|
||||
SHARD: integration_tests
|
||||
container:
|
||||
cpu: 4
|
||||
memory: 12G
|
||||
test_all_script:
|
||||
- dart --enable-asserts dev\bots\test.dart
|
||||
- name: customer_testing-windows
|
||||
test_script:
|
||||
- CMD /S /C "IF EXIST "bin\cache\pkg\tests\" RMDIR /S /Q bin\cache\pkg\tests"
|
||||
- git clone https://github.com/flutter/tests.git bin\cache\pkg\tests
|
||||
- dart --enable-asserts dev\customer_testing\run_tests.dart --skip-on-fetch-failure --skip-template bin/cache/pkg/tests/registry/*.test
|
||||
|
||||
task:
|
||||
use_compute_credits: $CIRRUS_USER_COLLABORATOR == 'true'
|
||||
@ -395,9 +421,9 @@ task:
|
||||
- bin/flutter config --no-analytics
|
||||
- bin/flutter doctor -v
|
||||
- bin/flutter update-packages
|
||||
test_all_script: |
|
||||
ulimit -S -n 2048 # https://github.com/flutter/flutter/issues/2976
|
||||
bin/cache/dart-sdk/bin/dart --enable-asserts dev/bots/test.dart
|
||||
test_all_script:
|
||||
- ulimit -S -n 2048 # https://github.com/flutter/flutter/issues/2976
|
||||
- bin/cache/dart-sdk/bin/dart --enable-asserts dev/bots/test.dart
|
||||
matrix:
|
||||
# all of the tests except test/integration and test/commands/create_test for packages/flutter_tools
|
||||
- name: tool_tests-macos
|
||||
@ -428,37 +454,7 @@ task:
|
||||
env:
|
||||
CIRRUS_WORKING_DIR: "/tmp/flutter sdk"
|
||||
COCOAPODS_DISABLE_STATS: true
|
||||
matrix:
|
||||
- name: tests_widgets-macos
|
||||
env:
|
||||
GCLOUD_SERVICE_ACCOUNT_KEY: ENCRYPTED[f12abe60f5045d619ef4c79b83dd1e0722a0b0b13dbea95fbe334e2db7fffbcd841a5a92da8824848b539a19afe0c9fb]
|
||||
SHARD: tests
|
||||
SUBSHARD: widgets
|
||||
- name: tests_framework_other-macos
|
||||
env:
|
||||
GCLOUD_SERVICE_ACCOUNT_KEY: ENCRYPTED[f12abe60f5045d619ef4c79b83dd1e0722a0b0b13dbea95fbe334e2db7fffbcd841a5a92da8824848b539a19afe0c9fb]
|
||||
SHARD: tests
|
||||
SUBSHARD: framework_other
|
||||
- name: tests_extras-macos
|
||||
env:
|
||||
GCLOUD_SERVICE_ACCOUNT_KEY: ENCRYPTED[f12abe60f5045d619ef4c79b83dd1e0722a0b0b13dbea95fbe334e2db7fffbcd841a5a92da8824848b539a19afe0c9fb]
|
||||
SHARD: tests
|
||||
SUBSHARD: extras
|
||||
- name: $SHARD-macos
|
||||
env:
|
||||
matrix:
|
||||
# The flakiness of this target has increased beyond tolerable levels. Until we can stabilize it,
|
||||
# keep the shard disabled.
|
||||
# - SHARD: integration_tests
|
||||
- SHARD: build_tests
|
||||
COCOAPODS_DISABLE_STATS: true
|
||||
FLUTTER_FRAMEWORK_DIR: "/tmp/flutter sdk/bin/cache/artifacts/engine/ios/"
|
||||
osx_instance:
|
||||
image: mojave-flutter
|
||||
remove_preinstalled_fluuter_script: rm -rf $FLUTTER_HOME
|
||||
- name: add2app-macos
|
||||
env:
|
||||
SHARD: add2app_test
|
||||
PATH: "$CIRRUS_WORKING_DIR/bin:$CIRRUS_WORKING_DIR/bin/cache/dart-sdk/bin:$PATH"
|
||||
# occasionally the clock on these machines is out of sync
|
||||
# with the actual time - this should help to verify
|
||||
print_date_script:
|
||||
@ -482,9 +478,57 @@ task:
|
||||
- bin/flutter config --no-analytics
|
||||
- bin/flutter doctor -v
|
||||
- bin/flutter update-packages
|
||||
test_all_script: |
|
||||
ulimit -S -n 2048 # https://github.com/flutter/flutter/issues/2976
|
||||
bin/cache/dart-sdk/bin/dart --enable-asserts dev/bots/test.dart
|
||||
matrix:
|
||||
- name: tests_widgets-macos
|
||||
env:
|
||||
GCLOUD_SERVICE_ACCOUNT_KEY: ENCRYPTED[f12abe60f5045d619ef4c79b83dd1e0722a0b0b13dbea95fbe334e2db7fffbcd841a5a92da8824848b539a19afe0c9fb]
|
||||
SHARD: tests
|
||||
SUBSHARD: widgets
|
||||
test_all_script:
|
||||
- ulimit -S -n 2048 # https://github.com/flutter/flutter/issues/2976
|
||||
- dart --enable-asserts dev/bots/test.dart
|
||||
- name: tests_framework_other-macos
|
||||
env:
|
||||
GCLOUD_SERVICE_ACCOUNT_KEY: ENCRYPTED[f12abe60f5045d619ef4c79b83dd1e0722a0b0b13dbea95fbe334e2db7fffbcd841a5a92da8824848b539a19afe0c9fb]
|
||||
SHARD: tests
|
||||
SUBSHARD: framework_other
|
||||
test_all_script:
|
||||
- ulimit -S -n 2048 # https://github.com/flutter/flutter/issues/2976
|
||||
- dart --enable-asserts dev/bots/test.dart
|
||||
- name: tests_extras-macos
|
||||
env:
|
||||
GCLOUD_SERVICE_ACCOUNT_KEY: ENCRYPTED[f12abe60f5045d619ef4c79b83dd1e0722a0b0b13dbea95fbe334e2db7fffbcd841a5a92da8824848b539a19afe0c9fb]
|
||||
SHARD: tests
|
||||
SUBSHARD: extras
|
||||
DEPOT_TOOLS: "tmp/depot_tools"
|
||||
GOLDCTL: "$DEPOT_TOOLS/goldctl"
|
||||
GOLD_SERVICE_ACCOUNT: ENCRYPTED[3afeea5ac7201151c3d0dc9648862f0462b5e4f55dc600ca8b692319622f7c3eda3d577b1b16cc2ef0311b7314c1c095]
|
||||
goldctl_script: ./dev/bots/download_goldctl.sh
|
||||
test_all_script:
|
||||
- ulimit -S -n 2048 # https://github.com/flutter/flutter/issues/2976
|
||||
- dart --enable-asserts dev/bots/test.dart
|
||||
- name: build_tests-macos
|
||||
env:
|
||||
SHARD: build_tests # we should also enable integration_tests at some point, but it's too flaky right now
|
||||
COCOAPODS_DISABLE_STATS: true
|
||||
FLUTTER_FRAMEWORK_DIR: "/tmp/flutter sdk/bin/cache/artifacts/engine/ios/"
|
||||
osx_instance:
|
||||
image: mojave-flutter
|
||||
remove_preinstalled_flutter_script: rm -rf $FLUTTER_HOME
|
||||
test_all_script:
|
||||
- ulimit -S -n 2048 # https://github.com/flutter/flutter/issues/2976
|
||||
- dart --enable-asserts dev/bots/test.dart
|
||||
- name: add2app-macos
|
||||
env:
|
||||
SHARD: add2app_test
|
||||
test_all_script:
|
||||
- ulimit -S -n 2048 # https://github.com/flutter/flutter/issues/2976
|
||||
- dart --enable-asserts dev/bots/test.dart
|
||||
- name: customer_testing-macos
|
||||
test_script:
|
||||
- rm -rf bin/cache/pkg/tests
|
||||
- git clone https://github.com/flutter/tests.git bin/cache/pkg/tests
|
||||
- dart --enable-asserts dev/customer_testing/run_tests.dart --skip-on-fetch-failure --skip-template bin/cache/pkg/tests/registry/*.test
|
||||
|
||||
docker_builder:
|
||||
# Only build a new docker image when we tag a release (for dev, beta, or release.)
|
||||
|
||||
@ -1 +1 @@
|
||||
e695a516f148cef9c7850a6e00151f00bfadf0d4
|
||||
d1dcd1848633c5764e23313823445cbcba451a59
|
||||
|
||||
@ -1 +1,2 @@
|
||||
b2cef0060add1b33bf65c97aaf80146b54cf7b86
|
||||
09a19be7d0cd25eb7602b6ead198e8cf234a9ed2
|
||||
|
||||
|
||||
@ -19,7 +19,7 @@ dependencies:
|
||||
collection: 1.14.11 # 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.0 # 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"
|
||||
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"
|
||||
@ -59,10 +59,10 @@ dependencies:
|
||||
vector_math: 2.0.8 # 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+10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web_socket_channel: 1.0.13 # 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:
|
||||
uses-material-design: true
|
||||
|
||||
# PUBSPEC CHECKSUM: 6e23
|
||||
# PUBSPEC CHECKSUM: 4625
|
||||
|
||||
@ -35,7 +35,7 @@ dependencies:
|
||||
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"
|
||||
vm_service_client: 0.2.6+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web_socket_channel: 1.0.13 # 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"
|
||||
|
||||
dev_dependencies:
|
||||
flutter_test:
|
||||
@ -45,7 +45,7 @@ dev_dependencies:
|
||||
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"
|
||||
boolean_selector: 1.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
csslib: 0.16.0 # 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"
|
||||
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"
|
||||
@ -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: 3eb2
|
||||
# PUBSPEC CHECKSUM: 86b4
|
||||
|
||||
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
@ -35,7 +35,7 @@ dependencies:
|
||||
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"
|
||||
vm_service_client: 0.2.6+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web_socket_channel: 1.0.13 # 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"
|
||||
|
||||
dev_dependencies:
|
||||
flutter_test:
|
||||
@ -45,7 +45,7 @@ dev_dependencies:
|
||||
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"
|
||||
boolean_selector: 1.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
csslib: 0.16.0 # 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"
|
||||
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"
|
||||
@ -79,4 +79,4 @@ dev_dependencies:
|
||||
flutter:
|
||||
uses-material-design: true
|
||||
|
||||
# PUBSPEC CHECKSUM: 3eb2
|
||||
# PUBSPEC CHECKSUM: 86b4
|
||||
|
||||
@ -23,8 +23,8 @@ dependencies:
|
||||
collection: 1.14.11 # 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.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
dart_style: 1.2.8 # 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"
|
||||
dart_style: 1.2.9 # 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"
|
||||
@ -67,10 +67,10 @@ dependencies:
|
||||
vector_math: 2.0.8 # 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+10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web_socket_channel: 1.0.13 # 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:
|
||||
uses-material-design: true
|
||||
|
||||
# PUBSPEC CHECKSUM: 1f87
|
||||
# PUBSPEC CHECKSUM: e88a
|
||||
|
||||
5
dev/bots/download_goldctl.ps1
Normal file
@ -0,0 +1,5 @@
|
||||
$url= "https://chrome-infra-packages.appspot.com/p/skia/tools/goldctl/windows-amd64/+/"
|
||||
$path = "c:\Windows\Temp\goldctl.zip"
|
||||
|
||||
(New-Object System.Net.WebClient).DownloadFile($path, $output)
|
||||
Expand-Archive -LiteralPath $path -DestinationPath "C:\Windows\Temp\goldctl_tool"
|
||||
6
dev/bots/download_goldctl.sh
Executable file
@ -0,0 +1,6 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
git clone --depth 1 https://chromium.googlesource.com/chromium/tools/depot_tools.git ./tmp/depot_tools
|
||||
cd tmp/depot_tools
|
||||
echo -e '# Ensure File\n$ServiceURL https://chrome-infra-packages.appspot.com\n\n# Skia Gold Client goldctl\nskia/tools/goldctl/${platform} latest' > ensure.txt
|
||||
./cipd ensure -ensure-file ensure.txt -root .
|
||||
@ -14,7 +14,7 @@ dependencies:
|
||||
http: 0.12.0+2
|
||||
http_parser: 3.1.3
|
||||
test: 1.6.3
|
||||
googleapis: 0.53.0
|
||||
googleapis: 0.54.0
|
||||
googleapis_auth: 0.2.8
|
||||
|
||||
_discoveryapis_commons: 0.1.8+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
@ -25,7 +25,7 @@ dependencies:
|
||||
collection: 1.14.11 # 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.0 # 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"
|
||||
@ -60,11 +60,11 @@ dependencies:
|
||||
typed_data: 1.1.6 # 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+10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web_socket_channel: 1.0.13 # 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"
|
||||
|
||||
dev_dependencies:
|
||||
mockito: 4.1.0
|
||||
test_api: 0.2.5
|
||||
|
||||
# PUBSPEC CHECKSUM: ca5a
|
||||
# PUBSPEC CHECKSUM: 245d
|
||||
|
||||
@ -87,6 +87,7 @@ Future<void> runCommand(String executable, List<String> arguments, {
|
||||
bool skip = false,
|
||||
bool expectFlaky = false,
|
||||
Duration timeout = _kLongTimeout,
|
||||
bool Function(String) removeLine,
|
||||
}) async {
|
||||
final String commandDescription = '${path.relative(executable, from: workingDirectory)} ${arguments.join(' ')}';
|
||||
final String relativeWorkingDir = path.relative(workingDirectory);
|
||||
@ -103,13 +104,19 @@ Future<void> runCommand(String executable, List<String> arguments, {
|
||||
);
|
||||
|
||||
Future<List<List<int>>> savedStdout, savedStderr;
|
||||
final Stream<List<int>> stdoutSource = process.stdout
|
||||
.transform<String>(const Utf8Decoder())
|
||||
.transform(const LineSplitter())
|
||||
.where((String line) => removeLine == null || !removeLine(line))
|
||||
.map((String line) => '$line\n')
|
||||
.transform(const Utf8Encoder());
|
||||
if (printOutput) {
|
||||
await Future.wait<void>(<Future<void>>[
|
||||
stdout.addStream(process.stdout),
|
||||
stdout.addStream(stdoutSource),
|
||||
stderr.addStream(process.stderr),
|
||||
]);
|
||||
} else {
|
||||
savedStdout = process.stdout.toList();
|
||||
savedStdout = stdoutSource.toList();
|
||||
savedStderr = process.stderr.toList();
|
||||
}
|
||||
|
||||
|
||||
@ -240,7 +240,8 @@ Future<void> _runToolTests() async {
|
||||
File(path.join(flutterRoot, 'bin', 'cache', 'flutter_tools.snapshot')).deleteSync();
|
||||
File(path.join(flutterRoot, 'bin', 'cache', 'flutter_tools.stamp')).deleteSync();
|
||||
}
|
||||
if (noUseBuildRunner) {
|
||||
// reduce overhead of build_runner in the create case.
|
||||
if (noUseBuildRunner || Platform.environment['SUBSHARD'] == 'create') {
|
||||
await _pubRunTest(
|
||||
path.join(flutterRoot, 'packages', 'flutter_tools'),
|
||||
tableData: bigqueryApi?.tabledata,
|
||||
@ -258,22 +259,23 @@ Future<void> _runToolTests() async {
|
||||
print('${bold}DONE: All tests successful.$reset');
|
||||
}
|
||||
|
||||
/// Verifies that AOT, APK, and IPA (if on macOS) builds of some
|
||||
/// examples apps finish without crashing. It does not actually
|
||||
/// Verifies that AOT, APK, and IPA (if on macOS) builds the
|
||||
/// examples apps without crashing. It does not actually
|
||||
/// launch the apps. That happens later in the devicelab. This is
|
||||
/// just a smoke-test. In particular, this will verify we can build
|
||||
/// when there are spaces in the path name for the Flutter SDK and
|
||||
/// target app.
|
||||
Future<void> _runBuildTests() async {
|
||||
final List<String> paths = <String>[
|
||||
path.join('examples', 'hello_world'),
|
||||
path.join('examples', 'flutter_gallery'),
|
||||
path.join('examples', 'flutter_view'),
|
||||
];
|
||||
for (String path in paths) {
|
||||
await _flutterBuildAot(path);
|
||||
await _flutterBuildApk(path);
|
||||
await _flutterBuildIpa(path);
|
||||
final Stream<FileSystemEntity> exampleDirectories = Directory(path.join(flutterRoot, 'examples')).list();
|
||||
await for (FileSystemEntity fileEntity in exampleDirectories) {
|
||||
if (fileEntity is! Directory) {
|
||||
continue;
|
||||
}
|
||||
final String examplePath = fileEntity.path;
|
||||
|
||||
await _flutterBuildAot(examplePath);
|
||||
await _flutterBuildApk(examplePath);
|
||||
await _flutterBuildIpa(examplePath);
|
||||
}
|
||||
await _flutterBuildDart2js(path.join('dev', 'integration_tests', 'web'));
|
||||
|
||||
@ -552,6 +554,7 @@ Future<void> _buildRunnerTest(
|
||||
args,
|
||||
workingDirectory:workingDirectory,
|
||||
environment:pubEnvironment,
|
||||
removeLine: (String line) => line.contains('[INFO]')
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -588,6 +591,9 @@ Future<void> _pubRunTest(
|
||||
case 'tool':
|
||||
args.addAll(<String>['--exclude-tags', 'integration']);
|
||||
break;
|
||||
case 'create':
|
||||
args.addAll(<String>[path.join('test', 'commands', 'create_test.dart')]);
|
||||
break;
|
||||
}
|
||||
|
||||
if (useFlutterTestFormatter) {
|
||||
@ -603,7 +609,7 @@ Future<void> _pubRunTest(
|
||||
await runCommand(
|
||||
pub,
|
||||
args,
|
||||
workingDirectory:workingDirectory,
|
||||
workingDirectory: workingDirectory,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
20
dev/customer_testing/pubspec.yaml
Normal file
@ -0,0 +1,20 @@
|
||||
name: customer_testing
|
||||
description: Tool to run the tests listed in the flutter/tests repository.
|
||||
|
||||
environment:
|
||||
sdk: any
|
||||
|
||||
dependencies:
|
||||
args: 1.5.2
|
||||
path: 1.6.2
|
||||
glob: 1.1.7
|
||||
meta: 1.1.6
|
||||
|
||||
async: 2.2.0 # 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"
|
||||
collection: 1.14.11 # 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"
|
||||
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"
|
||||
|
||||
# PUBSPEC CHECKSUM: f971
|
||||
263
dev/customer_testing/run_tests.dart
Normal file
@ -0,0 +1,263 @@
|
||||
// Copyright 2017 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:convert';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:args/args.dart';
|
||||
import 'package:glob/glob.dart';
|
||||
import 'package:meta/meta.dart';
|
||||
import 'package:path/path.dart' as path;
|
||||
|
||||
Future<void> main(List<String> arguments) async {
|
||||
exit(await run(arguments) ? 0 : 1);
|
||||
}
|
||||
|
||||
Future<bool> run(List<String> arguments) async {
|
||||
final ArgParser argParser = ArgParser(
|
||||
allowTrailingOptions: false,
|
||||
usageLineLength: 72,
|
||||
)
|
||||
..addOption(
|
||||
'repeat',
|
||||
defaultsTo: '1',
|
||||
help: 'How many times to run each test. Set to a high value to look for flakes.',
|
||||
valueHelp: 'count',
|
||||
)
|
||||
..addFlag(
|
||||
'skip-on-fetch-failure',
|
||||
defaultsTo: false,
|
||||
help: 'Whether to skip tests that we fail to download.',
|
||||
)
|
||||
..addFlag(
|
||||
'skip-template',
|
||||
defaultsTo: false,
|
||||
help: 'Whether to skip tests named "template.test".',
|
||||
)
|
||||
..addFlag(
|
||||
'verbose',
|
||||
defaultsTo: false,
|
||||
help: 'Describe what is happening in detail.',
|
||||
)
|
||||
..addFlag(
|
||||
'help',
|
||||
defaultsTo: false,
|
||||
negatable: false,
|
||||
help: 'Print this help message.',
|
||||
);
|
||||
|
||||
final ArgResults parsedArguments = argParser.parse(arguments);
|
||||
|
||||
final int repeat = int.tryParse(parsedArguments['repeat']);
|
||||
final bool skipOnFetchFailure = parsedArguments['skip-on-fetch-failure'];
|
||||
final bool skipTemplate = parsedArguments['skip-template'];
|
||||
final bool verbose = parsedArguments['verbose'];
|
||||
final bool help = parsedArguments['help'];
|
||||
final List<File> files = parsedArguments
|
||||
.rest
|
||||
.expand((String path) => Glob(path).listSync())
|
||||
.whereType<File>()
|
||||
.where((File file) => !skipTemplate || path.basename(file.path) != 'template.test')
|
||||
.toList();
|
||||
|
||||
if (help || repeat == null || files.isEmpty) {
|
||||
print('run_tests.dart [options...] path/to/file1.test path/to/file2.test...');
|
||||
print('For details on the test registry format, see:');
|
||||
print(' https://github.com/flutter/tests/blob/master/registry/template.test');
|
||||
print('');
|
||||
print(argParser.usage);
|
||||
print('');
|
||||
return help;
|
||||
}
|
||||
|
||||
if (verbose)
|
||||
print('Starting run_tests.dart...');
|
||||
|
||||
int failures = 0;
|
||||
|
||||
if (verbose) {
|
||||
final String s = files.length == 1 ? '' : 's';
|
||||
print('${files.length} file$s specified.');
|
||||
print('');
|
||||
}
|
||||
|
||||
for (File file in files) {
|
||||
if (verbose)
|
||||
print('Processing ${file.path}...');
|
||||
TestFile instructions;
|
||||
try {
|
||||
instructions = TestFile(file);
|
||||
} on FormatException catch (error) {
|
||||
print('ERROR: ${error.message}');
|
||||
print('');
|
||||
failures += 1;
|
||||
continue;
|
||||
} on FileSystemException catch (error) {
|
||||
print('ERROR: ${error.message}');
|
||||
print(' ${file.path}');
|
||||
print('');
|
||||
failures += 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
final Directory checkout = Directory.systemTemp.createTempSync('flutter_customer_testing.${path.basenameWithoutExtension(file.path)}.');
|
||||
if (verbose)
|
||||
print('Created temporary directory: ${checkout.path}');
|
||||
try {
|
||||
bool success;
|
||||
bool showContacts = false;
|
||||
for (String fetchCommand in instructions.fetch) {
|
||||
success = await shell(fetchCommand, checkout, verbose: verbose, silentFailure: skipOnFetchFailure);
|
||||
if (!success) {
|
||||
if (skipOnFetchFailure) {
|
||||
if (verbose) {
|
||||
print('Skipping (fetch failed).');
|
||||
} else {
|
||||
print('Skipping ${file.path} (fetch failed).');
|
||||
}
|
||||
} else {
|
||||
print('ERROR: Failed to fetch repository.');
|
||||
failures += 1;
|
||||
showContacts = true;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
assert(success != null);
|
||||
if (success) {
|
||||
if (verbose)
|
||||
print('Running tests...');
|
||||
final Directory tests = Directory(path.join(checkout.path, 'tests'));
|
||||
// TODO(ianh): Once we have a way to update source code, run that command in each directory of instructions.update
|
||||
for (int iteration = 0; iteration < repeat; iteration += 1) {
|
||||
if (verbose && repeat > 1)
|
||||
print('Round ${iteration + 1} of $repeat.');
|
||||
for (String testCommand in instructions.tests) {
|
||||
success = await shell(testCommand, tests, verbose: verbose);
|
||||
if (!success) {
|
||||
print('ERROR: One or more tests from ${path.basenameWithoutExtension(file.path)} failed.');
|
||||
failures += 1;
|
||||
showContacts = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (verbose && success)
|
||||
print('Tests finished.');
|
||||
}
|
||||
if (showContacts) {
|
||||
final String s = instructions.contacts.length == 1 ? '' : 's';
|
||||
print('Contact$s: ${instructions.contacts.join(", ")}');
|
||||
}
|
||||
} finally {
|
||||
if (verbose)
|
||||
print('Deleting temporary directory...');
|
||||
checkout.deleteSync(recursive: true);
|
||||
}
|
||||
if (verbose)
|
||||
print('');
|
||||
}
|
||||
if (failures > 0) {
|
||||
final String s = failures == 1 ? '' : 's';
|
||||
print('$failures failure$s.');
|
||||
return false;
|
||||
}
|
||||
if (verbose) {
|
||||
print('All tests passed!');
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@immutable
|
||||
class TestFile {
|
||||
factory TestFile(File file) {
|
||||
final String errorPrefix = 'Could not parse: ${file.path}\n';
|
||||
final List<String> contacts = <String>[];
|
||||
final List<String> fetch = <String>[];
|
||||
final List<Directory> update = <Directory>[];
|
||||
final List<String> test = <String>[];
|
||||
for (String line in file.readAsLinesSync().map((String line) => line.trim())) {
|
||||
if (line.isEmpty) {
|
||||
// blank line
|
||||
} else if (line.startsWith('#')) {
|
||||
// comment
|
||||
} else if (line.startsWith('contact=')) {
|
||||
contacts.add(line.substring(8));
|
||||
} else if (line.startsWith('fetch=')) {
|
||||
fetch.add(line.substring(6));
|
||||
} else if (line.startsWith('update=')) {
|
||||
update.add(Directory(line.substring(7)));
|
||||
} else if (line.startsWith('test=')) {
|
||||
test.add(line.substring(5));
|
||||
} else {
|
||||
throw FormatException('${errorPrefix}Unexpected directive:\n$line');
|
||||
}
|
||||
}
|
||||
if (contacts.isEmpty)
|
||||
throw FormatException('${errorPrefix}No contacts specified. At least one contact e-mail address must be specified.');
|
||||
for (String email in contacts) {
|
||||
if (!email.contains(_email) || email.endsWith('@example.com'))
|
||||
throw FormatException('${errorPrefix}The following e-mail address appears to be an invalid e-mail address: $email');
|
||||
}
|
||||
if (fetch.isEmpty)
|
||||
throw FormatException('${errorPrefix}No "fetch" directives specified. Two lines are expected: "git clone https://github.com/USERNAME/REPOSITORY.git tests" and "git -C tests checkout HASH".');
|
||||
if (fetch.length < 2)
|
||||
throw FormatException('${errorPrefix}Only one "fetch" directive specified. Two lines are expected: "git clone https://github.com/USERNAME/REPOSITORY.git tests" and "git -C tests checkout HASH".');
|
||||
if (!fetch[0].contains(_fetch1))
|
||||
throw FormatException('${errorPrefix}First "fetch" directive does not match expected pattern (expected "git clone https://github.com/USERNAME/REPOSITORY.git tests").');
|
||||
if (!fetch[1].contains(_fetch2))
|
||||
throw FormatException('${errorPrefix}Second "fetch" directive does not match expected pattern (expected "git -C tests checkout HASH").');
|
||||
if (update.isEmpty)
|
||||
throw FormatException('${errorPrefix}No "update" directives specified. At least one directory must be specified. (It can be "." to just upgrade the root of the repository.)');
|
||||
if (test.isEmpty)
|
||||
throw FormatException('${errorPrefix}No "test" directives specified. At least one command must be specified to run tests.');
|
||||
return TestFile._(
|
||||
List<String>.unmodifiable(contacts),
|
||||
List<String>.unmodifiable(fetch),
|
||||
List<Directory>.unmodifiable(update),
|
||||
List<String>.unmodifiable(test),
|
||||
);
|
||||
}
|
||||
|
||||
const TestFile._(this.contacts, this.fetch, this.update, this.tests);
|
||||
|
||||
// (e-mail regexp from HTML standard)
|
||||
static final RegExp _email = RegExp(r'''^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$''');
|
||||
static final RegExp _fetch1 = RegExp(r'^git clone https://github.com/[-a-zA-Z0-9]+/[-_a-zA-Z0-9]+.git tests$');
|
||||
static final RegExp _fetch2 = RegExp(r'^git -C tests checkout [0-9a-f]+$');
|
||||
|
||||
final List<String> contacts;
|
||||
final List<String> fetch;
|
||||
final List<Directory> update;
|
||||
final List<String> tests;
|
||||
}
|
||||
|
||||
final RegExp _spaces = RegExp(r' +');
|
||||
|
||||
Future<bool> shell(String command, Directory directory, { bool verbose = false, bool silentFailure = false }) async {
|
||||
if (verbose)
|
||||
print('>> $command');
|
||||
Process process;
|
||||
if (Platform.isWindows) {
|
||||
process = await Process.start('CMD.EXE', <String>['/S', '/C', '$command'], workingDirectory: directory.path);
|
||||
} else {
|
||||
final List<String> segments = command.trim().split(_spaces);
|
||||
process = await Process.start(segments.first, segments.skip(1).toList(), workingDirectory: directory.path);
|
||||
}
|
||||
final List<String> output = <String>[];
|
||||
utf8.decoder.bind(process.stdout).transform(const LineSplitter()).listen(verbose ? printLog : output.add);
|
||||
utf8.decoder.bind(process.stderr).transform(const LineSplitter()).listen(verbose ? printLog : output.add);
|
||||
final bool success = await process.exitCode == 0;
|
||||
if (success || silentFailure)
|
||||
return success;
|
||||
if (!verbose) {
|
||||
print('>> $command');
|
||||
output.forEach(printLog);
|
||||
}
|
||||
return success;
|
||||
}
|
||||
|
||||
void printLog(String line) {
|
||||
print('| $line'.trimRight());
|
||||
}
|
||||
@ -0,0 +1,14 @@
|
||||
// Copyright 2019 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_devicelab/framework/adb.dart';
|
||||
import 'package:flutter_devicelab/framework/framework.dart';
|
||||
import 'package:flutter_devicelab/tasks/integration_tests.dart';
|
||||
|
||||
Future<void> main() async {
|
||||
deviceOperatingSystem = DeviceOperatingSystem.ios;
|
||||
await task(createPlatformChannelSwiftSampleTest());
|
||||
}
|
||||
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 68 KiB After Width: | Height: | Size: 56 KiB |
|
Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 30 KiB |
@ -47,6 +47,13 @@ TaskFunction createPlatformChannelSampleTest() {
|
||||
);
|
||||
}
|
||||
|
||||
TaskFunction createPlatformChannelSwiftSampleTest() {
|
||||
return DriverTest(
|
||||
'${flutterDirectory.path}/examples/platform_channel_swift',
|
||||
'test_driver/button_tap.dart',
|
||||
);
|
||||
}
|
||||
|
||||
TaskFunction createEmbeddedAndroidViewsIntegrationTest() {
|
||||
return DriverTest(
|
||||
'${flutterDirectory.path}/dev/integration_tests/android_views',
|
||||
|
||||
@ -414,10 +414,17 @@ tasks:
|
||||
|
||||
platform_channel_sample_test_ios:
|
||||
description: >
|
||||
Runs a driver test on the Platform Channel sample app on iPhone 6.
|
||||
Runs a driver test on the Platform Channel sample app on iPhone 6 Objective-C project.
|
||||
stage: devicelab_ios
|
||||
required_agent_capabilities: ["mac/ios"]
|
||||
|
||||
platform_channel_sample_test_swift:
|
||||
description: >
|
||||
Runs a driver test on the Platform Channel sample app on iPhone 6 Swift project.
|
||||
stage: devicelab_ios
|
||||
required_agent_capabilities: ["mac/ios"]
|
||||
flaky: true
|
||||
|
||||
platform_view_ios__start_up:
|
||||
description: >
|
||||
Verifies that Platform View can be used from an iOS project.
|
||||
|
||||
@ -34,7 +34,7 @@ dependencies:
|
||||
stream_channel: 2.0.0 # 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"
|
||||
typed_data: 1.1.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web_socket_channel: 1.0.13 # 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"
|
||||
xml: 3.5.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
|
||||
dev_dependencies:
|
||||
@ -43,7 +43,7 @@ dev_dependencies:
|
||||
|
||||
analyzer: 0.36.4 # 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"
|
||||
csslib: 0.16.0 # 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"
|
||||
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"
|
||||
@ -73,4 +73,4 @@ dev_dependencies:
|
||||
watcher: 0.9.7+10 # 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: 9ffc
|
||||
# PUBSPEC CHECKSUM: 2cfe
|
||||
|
||||
@ -83,6 +83,26 @@
|
||||
font-family: courier, lucidia;
|
||||
}
|
||||
|
||||
.anchor-container {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.anchor-button-overlay {
|
||||
position: absolute;
|
||||
top: 0px;
|
||||
right: 5px;
|
||||
height: 28px;
|
||||
width: 28px;
|
||||
transition: .3s ease;
|
||||
background-color: #2372a3;
|
||||
}
|
||||
|
||||
.anchor-button {
|
||||
border-style: none;
|
||||
background: none;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
/* Styles for the copy-to-clipboard button */
|
||||
.copyable-container {
|
||||
position: relative;
|
||||
|
||||
@ -57,6 +57,30 @@ function supportsCopying() {
|
||||
!!document.queryCommandSupported('copy');
|
||||
}
|
||||
|
||||
// Copies the given string to the clipboard.
|
||||
function copyStringToClipboard(string) {
|
||||
var textArea = document.createElement("textarea");
|
||||
textArea.value = string;
|
||||
document.body.appendChild(textArea);
|
||||
textArea.focus();
|
||||
textArea.select();
|
||||
|
||||
if (!supportsCopying()) {
|
||||
alert('Unable to copy to clipboard (not supported by browser)');
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
document.execCommand('copy');
|
||||
} finally {
|
||||
document.body.removeChild(textArea);
|
||||
}
|
||||
}
|
||||
|
||||
function fixHref(anchor, id) {
|
||||
anchor.href = window.location.href.replace(/#.*$/, '') + '#' + id;
|
||||
}
|
||||
|
||||
// Copies the text inside the currently visible snippet to the clipboard, or the
|
||||
// given element, if any.
|
||||
function copyTextToClipboard(element) {
|
||||
|
||||
@ -16,7 +16,7 @@ dependencies:
|
||||
collection: 1.14.11 # 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.0 # 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"
|
||||
@ -57,10 +57,10 @@ dependencies:
|
||||
vector_math: 2.0.8 # 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+10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web_socket_channel: 1.0.13 # 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:
|
||||
uses-material-design: true
|
||||
|
||||
# PUBSPEC CHECKSUM: 42c8
|
||||
# PUBSPEC CHECKSUM: 32ca
|
||||
|
||||
@ -7,7 +7,7 @@ dependencies:
|
||||
sdk: flutter
|
||||
flutter_driver:
|
||||
sdk: flutter
|
||||
path_provider: 1.1.0
|
||||
path_provider: 1.1.2
|
||||
collection: 1.14.11
|
||||
assets_for_android_views:
|
||||
git:
|
||||
@ -32,7 +32,7 @@ dependencies:
|
||||
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"
|
||||
vm_service_client: 0.2.6+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web_socket_channel: 1.0.13 # 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"
|
||||
|
||||
dev_dependencies:
|
||||
flutter_test:
|
||||
@ -42,7 +42,7 @@ dev_dependencies:
|
||||
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"
|
||||
boolean_selector: 1.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
csslib: 0.16.0 # 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"
|
||||
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"
|
||||
@ -76,4 +76,4 @@ dev_dependencies:
|
||||
flutter:
|
||||
uses-material-design: true
|
||||
|
||||
# PUBSPEC CHECKSUM: dd79
|
||||
# PUBSPEC CHECKSUM: 017d
|
||||
|
||||
@ -20,7 +20,7 @@ dependencies:
|
||||
collection: 1.14.11 # 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.0 # 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"
|
||||
@ -61,10 +61,10 @@ dependencies:
|
||||
vector_math: 2.0.8 # 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+10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web_socket_channel: 1.0.13 # 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:
|
||||
uses-material-design: true
|
||||
|
||||
# PUBSPEC CHECKSUM: 42c8
|
||||
# PUBSPEC CHECKSUM: 32ca
|
||||
|
||||
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
@ -29,7 +29,7 @@ dependencies:
|
||||
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"
|
||||
vm_service_client: 0.2.6+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web_socket_channel: 1.0.13 # 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"
|
||||
|
||||
dev_dependencies:
|
||||
test: 1.6.3
|
||||
@ -37,7 +37,7 @@ dev_dependencies:
|
||||
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"
|
||||
boolean_selector: 1.0.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
csslib: 0.16.0 # 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"
|
||||
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"
|
||||
@ -74,4 +74,4 @@ builders:
|
||||
flutter:
|
||||
uses-material-design: true
|
||||
|
||||
# PUBSPEC CHECKSUM: 42c8
|
||||
# PUBSPEC CHECKSUM: 32ca
|
||||
|
||||
@ -20,7 +20,7 @@ dependencies:
|
||||
collection: 1.14.11 # 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.0 # 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"
|
||||
@ -61,10 +61,10 @@ dependencies:
|
||||
vector_math: 2.0.8 # 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+10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web_socket_channel: 1.0.13 # 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:
|
||||
uses-material-design: true
|
||||
|
||||
# PUBSPEC CHECKSUM: 42c8
|
||||
# PUBSPEC CHECKSUM: 32ca
|
||||
|
||||
@ -20,7 +20,7 @@ dependencies:
|
||||
collection: 1.14.11 # 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.0 # 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"
|
||||
@ -61,10 +61,10 @@ dependencies:
|
||||
vector_math: 2.0.8 # 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+10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web_socket_channel: 1.0.13 # 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:
|
||||
uses-material-design: true
|
||||
|
||||
# PUBSPEC CHECKSUM: 42c8
|
||||
# PUBSPEC CHECKSUM: 32ca
|
||||
|
||||
@ -15,7 +15,7 @@ dependencies:
|
||||
collection: 1.14.11 # 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.0 # 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"
|
||||
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"
|
||||
@ -54,10 +54,10 @@ dependencies:
|
||||
vector_math: 2.0.8 # 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+10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web_socket_channel: 1.0.13 # 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:
|
||||
uses-material-design: true
|
||||
|
||||
# PUBSPEC CHECKSUM: 967d
|
||||
# PUBSPEC CHECKSUM: 707f
|
||||
|
||||
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
@ -20,7 +20,7 @@ dependencies:
|
||||
collection: 1.14.11 # 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.0 # 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"
|
||||
@ -61,10 +61,10 @@ dependencies:
|
||||
vector_math: 2.0.8 # 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+10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web_socket_channel: 1.0.13 # 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:
|
||||
uses-material-design: true
|
||||
|
||||
# PUBSPEC CHECKSUM: 42c8
|
||||
# PUBSPEC CHECKSUM: 32ca
|
||||
|
||||
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
@ -11,7 +11,7 @@ dependencies:
|
||||
collection: 1.14.11 # 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.0 # 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"
|
||||
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"
|
||||
@ -32,4 +32,4 @@ environment:
|
||||
# The pub client defaults to an <2.0.0 sdk constraint which we need to explicitly overwrite.
|
||||
sdk: ">=2.0.0-dev.68.0 <3.0.0"
|
||||
|
||||
# PUBSPEC CHECKSUM: db9f
|
||||
# PUBSPEC CHECKSUM: b4a0
|
||||
|
||||
@ -22,7 +22,7 @@ dependencies:
|
||||
collection: 1.14.11 # 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.0 # 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"
|
||||
@ -63,7 +63,7 @@ dependencies:
|
||||
vector_math: 2.0.8 # 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+10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web_socket_channel: 1.0.13 # 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"
|
||||
xml: 3.5.0 # 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"
|
||||
|
||||
@ -77,4 +77,4 @@ dev_dependencies:
|
||||
flutter:
|
||||
uses-material-design: true
|
||||
|
||||
# PUBSPEC CHECKSUM: ce0d
|
||||
# PUBSPEC CHECKSUM: 3d0f
|
||||
|
||||
|
Before Width: | Height: | Size: 57 KiB After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 198 KiB After Width: | Height: | Size: 111 KiB |
@ -1,4 +1,13 @@
|
||||
{@inject-html}
|
||||
<a name="{{id}}"></a>
|
||||
<div class="anchor-container">
|
||||
<a class="anchor-button-overlay anchor-button" title="Copy link to clipboard"
|
||||
onmouseenter="fixHref(this, '{{id}}');"
|
||||
onclick="fixHref(this, '{{id}}'); copyStringToClipboard(this.href);"
|
||||
href="#">
|
||||
<i class="material-icons copy-image">link</i>
|
||||
</a>
|
||||
</div>
|
||||
<div class="snippet-buttons">
|
||||
<script>var visibleSnippet{{serial}} = "shortSnippet{{serial}}";</script>
|
||||
<button id="shortSnippet{{serial}}Button"
|
||||
|
||||
@ -1,4 +1,13 @@
|
||||
{@inject-html}
|
||||
<a name="{{id}}"></a>
|
||||
<div class="anchor-container">
|
||||
<a class="anchor-button-overlay anchor-button" title="Copy link to clipboard"
|
||||
onmouseenter="fixHref(this, '{{id}}');"
|
||||
onclick="fixHref(this, '{{id}}'); copyStringToClipboard(this.href);"
|
||||
href="#">
|
||||
<i class="material-icons copy-image">link</i>
|
||||
</a>
|
||||
</div>
|
||||
<div class="snippet-buttons">
|
||||
<button id="shortSnippet{{serial}}Button" selected>Sample</button>
|
||||
</div>
|
||||
|
||||
@ -152,13 +152,13 @@ void main(List<String> argList) {
|
||||
input,
|
||||
snippetType,
|
||||
template: template,
|
||||
id: id.join('.'),
|
||||
output: args[_kOutputOption] != null ? File(args[_kOutputOption]) : null,
|
||||
metadata: <String, Object>{
|
||||
'sourcePath': environment['SOURCE_PATH'],
|
||||
'sourceLine': environment['SOURCE_LINE'] != null
|
||||
? int.tryParse(environment['SOURCE_LINE'])
|
||||
: null,
|
||||
'id': id.join('.'),
|
||||
'serial': serial,
|
||||
'package': packageName,
|
||||
'library': libraryName,
|
||||
|
||||
@ -5,8 +5,9 @@
|
||||
import 'dart:convert';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:path/path.dart' as path;
|
||||
import 'package:dart_style/dart_style.dart';
|
||||
import 'package:meta/meta.dart';
|
||||
import 'package:path/path.dart' as path;
|
||||
|
||||
import 'configuration.dart';
|
||||
|
||||
@ -128,13 +129,12 @@ class SnippetGenerator {
|
||||
'code': htmlEscape.convert(result.join('\n')),
|
||||
'language': language ?? 'dart',
|
||||
'serial': '',
|
||||
'id': '',
|
||||
'id': metadata['id'],
|
||||
'app': '',
|
||||
};
|
||||
if (type == SnippetType.application) {
|
||||
substitutions
|
||||
..['serial'] = metadata['serial'].toString() ?? '0'
|
||||
..['id'] = injections.firstWhere((_ComponentTuple tuple) => tuple.name == 'id').mergedContent
|
||||
..['serial'] = metadata['serial']?.toString() ?? '0'
|
||||
..['app'] = htmlEscape.convert(injections.firstWhere((_ComponentTuple tuple) => tuple.name == 'app').mergedContent);
|
||||
}
|
||||
return skeleton.replaceAllMapped(RegExp('{{(${substitutions.keys.join('|')})}}'), (Match match) {
|
||||
@ -209,9 +209,15 @@ class SnippetGenerator {
|
||||
/// The [id] is a string ID to use for the output file, and to tell the user
|
||||
/// about in the `flutter create` hint. It must not be null if the [type] is
|
||||
/// [SnippetType.application].
|
||||
String generate(File input, SnippetType type, {String template, String id, File output, Map<String, Object> metadata}) {
|
||||
String generate(
|
||||
File input,
|
||||
SnippetType type, {
|
||||
String template,
|
||||
File output,
|
||||
@required Map<String, Object> metadata,
|
||||
}) {
|
||||
assert(template != null || type != SnippetType.application);
|
||||
assert(id != null || type != SnippetType.application);
|
||||
assert(metadata != null && metadata['id'] != null);
|
||||
assert(input != null);
|
||||
final List<_ComponentTuple> snippetData = parseInput(_loadFileAsUtf8(input));
|
||||
switch (type) {
|
||||
@ -227,7 +233,6 @@ class SnippetGenerator {
|
||||
'The template $template was not found in the templates directory ${templatesDir.path}');
|
||||
exit(1);
|
||||
}
|
||||
snippetData.add(_ComponentTuple('id', <String>[id]));
|
||||
final String templateContents = _loadFileAsUtf8(templateFile);
|
||||
String app = interpolateTemplate(snippetData, templateContents);
|
||||
|
||||
@ -239,7 +244,7 @@ class SnippetGenerator {
|
||||
}
|
||||
|
||||
snippetData.add(_ComponentTuple('app', app.split('\n')));
|
||||
final File outputFile = output ?? getOutputFile(id);
|
||||
final File outputFile = output ?? getOutputFile(metadata['id']);
|
||||
stderr.writeln('Writing to ${outputFile.absolute.path}');
|
||||
outputFile.writeAsStringSync(app);
|
||||
|
||||
@ -252,7 +257,7 @@ class SnippetGenerator {
|
||||
);
|
||||
metadata ??= <String, Object>{};
|
||||
metadata.addAll(<String, Object>{
|
||||
'id': id,
|
||||
'id': metadata['id'],
|
||||
'file': path.basename(outputFile.path),
|
||||
'description': description?.mergedContent,
|
||||
});
|
||||
|
||||
@ -14,7 +14,7 @@ dartdoc:
|
||||
|
||||
dependencies:
|
||||
args: 1.5.2
|
||||
dart_style: 1.2.8
|
||||
dart_style: 1.2.9
|
||||
meta: 1.1.6
|
||||
platform: 2.2.0
|
||||
|
||||
@ -24,7 +24,7 @@ dependencies:
|
||||
collection: 1.14.11 # 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.0 # 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"
|
||||
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"
|
||||
@ -67,7 +67,7 @@ dev_dependencies:
|
||||
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"
|
||||
web_socket_channel: 1.0.13 # 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"
|
||||
|
||||
executables:
|
||||
snippets: null
|
||||
@ -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: 198b
|
||||
# PUBSPEC CHECKSUM: 918e
|
||||
|
||||
@ -74,8 +74,14 @@ void main() {
|
||||
```
|
||||
''');
|
||||
|
||||
final String html =
|
||||
generator.generate(inputFile, SnippetType.application, template: 'template', id: 'id');
|
||||
final String html = generator.generate(
|
||||
inputFile,
|
||||
SnippetType.application,
|
||||
template: 'template',
|
||||
metadata: <String, Object>{
|
||||
'id': 'id',
|
||||
},
|
||||
);
|
||||
expect(html, contains('<div>HTML Bits</div>'));
|
||||
expect(html, contains('<div>More HTML Bits</div>'));
|
||||
expect(html, contains('print('The actual \$name.');'));
|
||||
@ -103,7 +109,7 @@ void main() {
|
||||
```
|
||||
''');
|
||||
|
||||
final String html = generator.generate(inputFile, SnippetType.sample);
|
||||
final String html = generator.generate(inputFile, SnippetType.sample, metadata: <String, Object>{'id': 'id'});
|
||||
expect(html, contains('<div>HTML Bits</div>'));
|
||||
expect(html, contains('<div>More HTML Bits</div>'));
|
||||
expect(html, contains(' print('The actual \$name.');'));
|
||||
@ -135,9 +141,8 @@ void main() {
|
||||
inputFile,
|
||||
SnippetType.application,
|
||||
template: 'template',
|
||||
id: 'id',
|
||||
output: outputFile,
|
||||
metadata: <String, Object>{'sourcePath': 'some/path.dart'},
|
||||
metadata: <String, Object>{'sourcePath': 'some/path.dart', 'id': 'id'},
|
||||
);
|
||||
expect(expectedMetadataFile.existsSync(), isTrue);
|
||||
final Map<String, dynamic> json = jsonDecode(expectedMetadataFile.readAsStringSync());
|
||||
|
||||
@ -29,7 +29,7 @@ dev_dependencies:
|
||||
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.0 # 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"
|
||||
@ -67,10 +67,10 @@ dev_dependencies:
|
||||
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+10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web_socket_channel: 1.0.13 # 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:
|
||||
uses-material-design: true
|
||||
|
||||
# PUBSPEC CHECKSUM: a7b3
|
||||
# PUBSPEC CHECKSUM: b1b5
|
||||
|
||||
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 3.2 KiB |
|
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 5.2 KiB After Width: | Height: | Size: 3.9 KiB |
|
Before Width: | Height: | Size: 71 KiB After Width: | Height: | Size: 4.8 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 4.5 KiB |
|
Before Width: | Height: | Size: 9.4 KiB After Width: | Height: | Size: 7.0 KiB |
|
Before Width: | Height: | Size: 123 KiB After Width: | Height: | Size: 6.6 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 6.0 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 9.7 KiB |
@ -38,6 +38,7 @@
|
||||
/* End PBXCopyFilesBuildPhase section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
26D36078B4738B64685A0B6F /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
|
||||
2D9222431EC1E1BA007564B0 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
|
||||
2D9222441EC1E1BA007564B0 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
|
||||
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
|
||||
@ -55,6 +56,8 @@
|
||||
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
|
||||
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
C77CA0BBC4B57129484236F4 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
DC01738FBE39EADD5AC4BF42 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
|
||||
ECF490DDAB8ABCEEFB1780BE /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
@ -138,6 +141,9 @@
|
||||
E54E8B7296D73DD9B2385312 /* Pods */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
ECF490DDAB8ABCEEFB1780BE /* Pods-Runner.debug.xcconfig */,
|
||||
26D36078B4738B64685A0B6F /* Pods-Runner.release.xcconfig */,
|
||||
DC01738FBE39EADD5AC4BF42 /* Pods-Runner.profile.xcconfig */,
|
||||
);
|
||||
name = Pods;
|
||||
sourceTree = "<group>";
|
||||
@ -273,7 +279,7 @@
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
|
||||
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
|
||||
showEnvVarsInLog = 0;
|
||||
};
|
||||
/* End PBXShellScriptBuildPhase section */
|
||||
|
||||
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.0 KiB |
@ -10,9 +10,9 @@ dependencies:
|
||||
collection: 1.14.11
|
||||
device_info: 0.4.0+2
|
||||
intl: 0.15.8
|
||||
connectivity: 0.4.3+2
|
||||
connectivity: 0.4.3+4
|
||||
string_scanner: 1.0.4
|
||||
url_launcher: 5.0.3
|
||||
url_launcher: 5.0.5
|
||||
cupertino_icons: 0.1.2
|
||||
video_player: 0.10.1+3
|
||||
scoped_model: 1.0.1
|
||||
@ -44,7 +44,7 @@ dev_dependencies:
|
||||
boolean_selector: 1.0.5 # 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.0 # 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"
|
||||
@ -80,7 +80,7 @@ dev_dependencies:
|
||||
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+10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web_socket_channel: 1.0.13 # 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:
|
||||
@ -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: bd7b
|
||||
# PUBSPEC CHECKSUM: 7e81
|
||||
|
||||
@ -48,6 +48,7 @@
|
||||
2DE332E81E55C6F100393FD5 /* MainViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MainViewController.h; sourceTree = "<group>"; };
|
||||
3B3967011E83382E004F5970 /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = "<group>"; };
|
||||
3B3967041E83383D004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
|
||||
63EC5EC13E843CD861057871 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
|
||||
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
|
||||
7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
|
||||
7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
|
||||
@ -60,6 +61,8 @@
|
||||
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
||||
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
|
||||
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
C50B4FE91C29B0DE9DD62DD3 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
|
||||
EADA814501F2EF49C9E6C636 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
@ -79,6 +82,9 @@
|
||||
840012C8B5EDBCF56B0E4AC1 /* Pods */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
63EC5EC13E843CD861057871 /* Pods-Runner.debug.xcconfig */,
|
||||
C50B4FE91C29B0DE9DD62DD3 /* Pods-Runner.release.xcconfig */,
|
||||
EADA814501F2EF49C9E6C636 /* Pods-Runner.profile.xcconfig */,
|
||||
);
|
||||
name = Pods;
|
||||
sourceTree = "<group>";
|
||||
@ -165,7 +171,6 @@
|
||||
9705A1C41CF9048500538489 /* Embed Frameworks */,
|
||||
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
|
||||
D7EBAA0AD2D4385BA6FA83BA /* [CP] Embed Pods Frameworks */,
|
||||
0273455D92E89802918C824F /* [CP] Copy Pods Resources */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
@ -226,21 +231,6 @@
|
||||
/* End PBXResourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXShellScriptBuildPhase section */
|
||||
0273455D92E89802918C824F /* [CP] Copy Pods Resources */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputPaths = (
|
||||
);
|
||||
name = "[CP] Copy Pods Resources";
|
||||
outputPaths = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n";
|
||||
showEnvVarsInLog = 0;
|
||||
};
|
||||
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
@ -275,13 +265,16 @@
|
||||
files = (
|
||||
);
|
||||
inputPaths = (
|
||||
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
|
||||
"${PODS_ROOT}/Manifest.lock",
|
||||
);
|
||||
name = "[CP] Check Pods Manifest.lock";
|
||||
outputPaths = (
|
||||
"$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n";
|
||||
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
|
||||
showEnvVarsInLog = 0;
|
||||
};
|
||||
D7EBAA0AD2D4385BA6FA83BA /* [CP] Embed Pods Frameworks */ = {
|
||||
@ -296,7 +289,7 @@
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
|
||||
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
|
||||
showEnvVarsInLog = 0;
|
||||
};
|
||||
/* End PBXShellScriptBuildPhase section */
|
||||
|
||||
@ -27,7 +27,7 @@ dev_dependencies:
|
||||
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.0 # 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"
|
||||
@ -66,10 +66,10 @@ dev_dependencies:
|
||||
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+10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web_socket_channel: 1.0.13 # 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:
|
||||
uses-material-design: true
|
||||
|
||||
# PUBSPEC CHECKSUM: a7b3
|
||||
# PUBSPEC CHECKSUM: b1b5
|
||||
|
||||
60
examples/platform_channel_swift/android/app/build.gradle
Normal file
@ -0,0 +1,60 @@
|
||||
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 {
|
||||
applicationId "io.flutter.examples.platform_channel_swift"
|
||||
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 {
|
||||
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'
|
||||
}
|
||||
@ -0,0 +1,94 @@
|
||||
package com.example.platformchannel;
|
||||
|
||||
import android.graphics.Bitmap;
|
||||
import android.support.test.InstrumentationRegistry;
|
||||
import android.support.test.rule.ActivityTestRule;
|
||||
import android.support.test.runner.AndroidJUnit4;
|
||||
|
||||
import io.flutter.view.FlutterView;
|
||||
|
||||
import android.app.Instrumentation;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import org.junit.Rule;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
@RunWith(AndroidJUnit4.class)
|
||||
public class ExampleInstrumentedTest {
|
||||
@Rule
|
||||
public ActivityTestRule<MainActivity> activityRule =
|
||||
new ActivityTestRule<>(MainActivity.class);
|
||||
|
||||
|
||||
@Test
|
||||
public void testBitmap() {
|
||||
final Instrumentation instr = InstrumentationRegistry.getInstrumentation();
|
||||
final BitmapPoller poller = new BitmapPoller(5);
|
||||
instr.runOnMainSync(new Runnable() {
|
||||
public void run() {
|
||||
final FlutterView flutterView = activityRule.getActivity().getFlutterView();
|
||||
|
||||
// Call onPostResume to start the engine's renderer even if the activity
|
||||
// is paused in the test environment.
|
||||
flutterView.onPostResume();
|
||||
|
||||
poller.start(flutterView);
|
||||
}
|
||||
});
|
||||
|
||||
Bitmap bitmap = null;
|
||||
try {
|
||||
bitmap = poller.waitForBitmap();
|
||||
} catch (InterruptedException e) {
|
||||
fail(e.getMessage());
|
||||
}
|
||||
|
||||
assertNotNull(bitmap);
|
||||
assertTrue(bitmap.getWidth() > 0);
|
||||
assertTrue(bitmap.getHeight() > 0);
|
||||
|
||||
// Check that a pixel matches the default Material background color.
|
||||
assertTrue(bitmap.getPixel(bitmap.getWidth() - 1, bitmap.getHeight() - 1) == 0xFFFAFAFA);
|
||||
}
|
||||
|
||||
// Waits on a FlutterView until it is able to produce a bitmap.
|
||||
private class BitmapPoller {
|
||||
private int triesPending;
|
||||
private int waitMsec;
|
||||
private FlutterView flutterView;
|
||||
private Bitmap bitmap;
|
||||
private CountDownLatch latch = new CountDownLatch(1);
|
||||
|
||||
private final int delayMsec = 1000;
|
||||
|
||||
BitmapPoller(int tries) {
|
||||
triesPending = tries;
|
||||
waitMsec = delayMsec * tries + 100;
|
||||
}
|
||||
|
||||
void start(FlutterView flutterView) {
|
||||
this.flutterView = flutterView;
|
||||
flutterView.postDelayed(checkBitmap, delayMsec);
|
||||
}
|
||||
|
||||
Bitmap waitForBitmap() throws InterruptedException {
|
||||
latch.await(waitMsec, TimeUnit.MILLISECONDS);
|
||||
return bitmap;
|
||||
}
|
||||
|
||||
private Runnable checkBitmap = new Runnable() {
|
||||
public void run() {
|
||||
bitmap = flutterView.getBitmap();
|
||||
triesPending--;
|
||||
if (bitmap != null || triesPending == 0) {
|
||||
latch.countDown();
|
||||
} else {
|
||||
flutterView.postDelayed(checkBitmap, delayMsec);
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,25 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
package="com.example.platformchannel">
|
||||
|
||||
<!-- The INTERNET permission is required for development. Specifically,
|
||||
flutter needs it to communicate with the running application
|
||||
to allow setting breakpoints, to provide hot reload, etc.
|
||||
-->
|
||||
<uses-permission android:name="android.permission.INTERNET"/>
|
||||
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
|
||||
|
||||
<application android:name="io.flutter.app.FlutterApplication" android:label="@string/app_name">
|
||||
<activity android:name=".MainActivity"
|
||||
android:launchMode="singleTop"
|
||||
android:theme="@android:style/Theme.Black.NoTitleBar"
|
||||
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
|
||||
android:hardwareAccelerated="true"
|
||||
android:windowSoftInputMode="adjustResize">
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
</intent-filter>
|
||||
</activity>
|
||||
</application>
|
||||
</manifest>
|
||||
@ -0,0 +1,101 @@
|
||||
// Copyright 2017 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.
|
||||
|
||||
package com.example.platformchannel;
|
||||
|
||||
import android.content.BroadcastReceiver;
|
||||
import android.content.Context;
|
||||
import android.content.ContextWrapper;
|
||||
import android.content.Intent;
|
||||
import android.content.IntentFilter;
|
||||
import android.os.BatteryManager;
|
||||
import android.os.Build.VERSION;
|
||||
import android.os.Build.VERSION_CODES;
|
||||
import android.os.Bundle;
|
||||
|
||||
import io.flutter.app.FlutterActivity;
|
||||
import io.flutter.plugin.common.EventChannel;
|
||||
import io.flutter.plugin.common.EventChannel.EventSink;
|
||||
import io.flutter.plugin.common.EventChannel.StreamHandler;
|
||||
import io.flutter.plugin.common.MethodChannel;
|
||||
import io.flutter.plugin.common.MethodChannel.MethodCallHandler;
|
||||
import io.flutter.plugin.common.MethodChannel.Result;
|
||||
import io.flutter.plugin.common.MethodCall;
|
||||
import io.flutter.plugins.GeneratedPluginRegistrant;
|
||||
|
||||
public class MainActivity extends FlutterActivity {
|
||||
private static final String BATTERY_CHANNEL = "samples.flutter.io/battery";
|
||||
private static final String CHARGING_CHANNEL = "samples.flutter.io/charging";
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
GeneratedPluginRegistrant.registerWith(this);
|
||||
new EventChannel(getFlutterView(), CHARGING_CHANNEL).setStreamHandler(
|
||||
new StreamHandler() {
|
||||
private BroadcastReceiver chargingStateChangeReceiver;
|
||||
@Override
|
||||
public void onListen(Object arguments, EventSink events) {
|
||||
chargingStateChangeReceiver = createChargingStateChangeReceiver(events);
|
||||
registerReceiver(
|
||||
chargingStateChangeReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCancel(Object arguments) {
|
||||
unregisterReceiver(chargingStateChangeReceiver);
|
||||
chargingStateChangeReceiver = null;
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
new MethodChannel(getFlutterView(), BATTERY_CHANNEL).setMethodCallHandler(
|
||||
new MethodCallHandler() {
|
||||
@Override
|
||||
public void onMethodCall(MethodCall call, Result result) {
|
||||
if (call.method.equals("getBatteryLevel")) {
|
||||
int batteryLevel = getBatteryLevel();
|
||||
|
||||
if (batteryLevel != -1) {
|
||||
result.success(batteryLevel);
|
||||
} else {
|
||||
result.error("UNAVAILABLE", "Battery level not available.", null);
|
||||
}
|
||||
} else {
|
||||
result.notImplemented();
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
private BroadcastReceiver createChargingStateChangeReceiver(final EventSink events) {
|
||||
return new BroadcastReceiver() {
|
||||
@Override
|
||||
public void onReceive(Context context, Intent intent) {
|
||||
int status = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
|
||||
|
||||
if (status == BatteryManager.BATTERY_STATUS_UNKNOWN) {
|
||||
events.error("UNAVAILABLE", "Charging status unavailable", null);
|
||||
} else {
|
||||
boolean isCharging = status == BatteryManager.BATTERY_STATUS_CHARGING ||
|
||||
status == BatteryManager.BATTERY_STATUS_FULL;
|
||||
events.success(isCharging ? "charging" : "discharging");
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
private int getBatteryLevel() {
|
||||
if (VERSION.SDK_INT >= VERSION_CODES.LOLLIPOP) {
|
||||
BatteryManager batteryManager = (BatteryManager) getSystemService(BATTERY_SERVICE);
|
||||
return batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY);
|
||||
} else {
|
||||
Intent intent = new ContextWrapper(getApplicationContext()).
|
||||
registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
|
||||
return (intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) * 100) /
|
||||
intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="app_name">Platform Channel</string>
|
||||
<string name="title">Flutter Application</string>
|
||||
</resources>
|
||||
29
examples/platform_channel_swift/android/build.gradle
Normal file
@ -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
|
||||
}
|
||||
@ -0,0 +1 @@
|
||||
org.gradle.jvmargs=-Xmx1536M
|
||||
6
examples/platform_channel_swift/android/gradle/wrapper/gradle-wrapper.properties
vendored
Normal file
@ -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
|
||||
15
examples/platform_channel_swift/android/settings.gradle
Normal file
@ -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.withInputStream { stream -> plugins.load(stream) }
|
||||
}
|
||||
|
||||
plugins.each { name, path ->
|
||||
def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile()
|
||||
include ":$name"
|
||||
project(":$name").projectDir = pluginDirectory
|
||||
}
|
||||
@ -31,7 +31,7 @@ enum MyFlutterErrorCode {
|
||||
fatalError("rootViewController is not type FlutterViewController")
|
||||
}
|
||||
let batteryChannel = FlutterMethodChannel(name: ChannelName.battery,
|
||||
binaryMessenger: controller)
|
||||
binaryMessenger: controller.binaryMessenger)
|
||||
batteryChannel.setMethodCallHandler({
|
||||
[weak self] (call: FlutterMethodCall, result: FlutterResult) -> Void in
|
||||
guard call.method == "getBatteryLevel" else {
|
||||
@ -42,7 +42,7 @@ enum MyFlutterErrorCode {
|
||||
})
|
||||
|
||||
let chargingChannel = FlutterEventChannel(name: ChannelName.charging,
|
||||
binaryMessenger: controller)
|
||||
binaryMessenger: controller.binaryMessenger)
|
||||
chargingChannel.setStreamHandler(self)
|
||||
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
|
||||
}
|
||||
|
||||
@ -18,30 +18,58 @@ dev_dependencies:
|
||||
sdk: flutter
|
||||
flutter_driver:
|
||||
sdk: flutter
|
||||
test: 1.6.3
|
||||
|
||||
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.2.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.4 # 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"
|
||||
web_socket_channel: 1.0.13 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
watcher: 0.9.7+10 # 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:
|
||||
uses-material-design: true
|
||||
|
||||
# PUBSPEC CHECKSUM: 3ffa
|
||||
# PUBSPEC CHECKSUM: b1b5
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
// found in the LICENSE file.
|
||||
|
||||
import 'package:flutter_driver/flutter_driver.dart';
|
||||
import 'package:test_api/test_api.dart' hide TypeMatcher, isInstanceOf;
|
||||
import 'package:test/test.dart' hide TypeMatcher, isInstanceOf;
|
||||
|
||||
void main() {
|
||||
group('button tap test', () {
|
||||
@ -19,18 +19,20 @@ void main() {
|
||||
});
|
||||
|
||||
test('tap on the button, verify result', () async {
|
||||
final SerializableFinder batteryLevelLabel = find.byValueKey('Battery level label');
|
||||
final SerializableFinder batteryLevelLabel =
|
||||
find.byValueKey('Battery level label');
|
||||
expect(batteryLevelLabel, isNotNull);
|
||||
|
||||
final SerializableFinder button = find.text('Get Battery Level');
|
||||
final SerializableFinder button = find.text('Refresh');
|
||||
await driver.waitFor(button);
|
||||
await driver.tap(button);
|
||||
|
||||
String batteryLevel;
|
||||
while (batteryLevel == null || batteryLevel.isEmpty) {
|
||||
while (batteryLevel == null || batteryLevel.contains('unknown')) {
|
||||
batteryLevel = await driver.getText(batteryLevelLabel);
|
||||
}
|
||||
expect(batteryLevel, isNotEmpty);
|
||||
|
||||
expect(batteryLevel.contains('%'), isTrue);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
@ -15,9 +15,9 @@ EXTERNAL SOURCES:
|
||||
:path: ".symlinks/flutter/ios"
|
||||
|
||||
SPEC CHECKSUMS:
|
||||
Flutter: 9d0fac939486c9aba2809b7982dfdbb47a7b0296
|
||||
Flutter: 58dd7d1b27887414a370fcccb9e645c08ffd7a6a
|
||||
MaterialControls: 1c6b29e78d3a13d8dd6a67ed31b6d26eb5de8f72
|
||||
|
||||
PODFILE CHECKSUM: 4a320bf98e7f7e414d7d7f5079edf1b2d6679c9b
|
||||
PODFILE CHECKSUM: 80af51c01ee3f0969ddbf2d1f0dcd6f44fad2c52
|
||||
|
||||
COCOAPODS: 1.5.2
|
||||
COCOAPODS: 1.7.1
|
||||
|
||||
@ -40,11 +40,13 @@
|
||||
/* End PBXCopyFilesBuildPhase section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
0F803D4F4B1DB3E426346AD7 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
|
||||
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
|
||||
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
|
||||
2DAF064A1ED38C2300716BEE /* PlatformViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PlatformViewController.h; sourceTree = "<group>"; };
|
||||
2DAF064B1ED38C3E00716BEE /* PlatformViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PlatformViewController.m; sourceTree = "<group>"; };
|
||||
2DAF064D1ED4224F00716BEE /* ic_add.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = ic_add.png; sourceTree = "<group>"; };
|
||||
3036634A71F5F09C1B6453EC /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
|
||||
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
|
||||
3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = "<group>"; };
|
||||
6E6555FD3971FC12A9802782 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
@ -60,6 +62,7 @@
|
||||
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
|
||||
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
|
||||
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
9D6BF03EDD3895D7B4DA4D7D /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
@ -79,6 +82,9 @@
|
||||
5A56E2F315C4CB64895375DA /* Pods */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
3036634A71F5F09C1B6453EC /* Pods-Runner.debug.xcconfig */,
|
||||
9D6BF03EDD3895D7B4DA4D7D /* Pods-Runner.release.xcconfig */,
|
||||
0F803D4F4B1DB3E426346AD7 /* Pods-Runner.profile.xcconfig */,
|
||||
);
|
||||
name = Pods;
|
||||
sourceTree = "<group>";
|
||||
@ -236,7 +242,7 @@
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
|
||||
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
|
||||
showEnvVarsInLog = 0;
|
||||
};
|
||||
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
|
||||
|
||||
|
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 4.9 KiB After Width: | Height: | Size: 4.3 KiB |
|
Before Width: | Height: | Size: 8.7 KiB After Width: | Height: | Size: 7.0 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 7.0 KiB After Width: | Height: | Size: 5.5 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 9.3 KiB |
|
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 9.8 KiB After Width: | Height: | Size: 7.4 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 8.4 KiB |
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 4.0 KiB After Width: | Height: | Size: 3.2 KiB |
|
Before Width: | Height: | Size: 7.0 KiB After Width: | Height: | Size: 5.5 KiB |
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 3.6 KiB |
@ -21,8 +21,8 @@ dependencies:
|
||||
collection: 1.14.11 # 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.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
dart_style: 1.2.8 # 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"
|
||||
dart_style: 1.2.9 # 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"
|
||||
@ -57,9 +57,9 @@ dev_dependencies:
|
||||
stream_channel: 2.0.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"
|
||||
vm_service_client: 0.2.6+2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web_socket_channel: 1.0.13 # 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"
|
||||
|
||||
flutter:
|
||||
uses-material-design: true
|
||||
|
||||
# PUBSPEC CHECKSUM: 4c79
|
||||
# PUBSPEC CHECKSUM: a57c
|
||||
|
||||
@ -85,7 +85,7 @@ void main() {
|
||||
|
||||
// check the color of the icon - dark mode
|
||||
checkIconColor(tester, 'Stock List', Colors.redAccent); // theme accent color
|
||||
checkIconColor(tester, 'Account Balance', Colors.white30); // disabled
|
||||
checkIconColor(tester, 'Account Balance', Colors.white38); // disabled
|
||||
checkIconColor(tester, 'About', Colors.white); // enabled
|
||||
});
|
||||
}
|
||||
|
||||
@ -68,6 +68,39 @@ enum OverlayVisibilityMode {
|
||||
always,
|
||||
}
|
||||
|
||||
class _CupertinoTextFieldSelectionGestureDetectorBuilder extends TextSelectionGestureDetectorBuilder {
|
||||
_CupertinoTextFieldSelectionGestureDetectorBuilder({
|
||||
@required _CupertinoTextFieldState state
|
||||
}) : _state = state,
|
||||
super(delegate: state);
|
||||
|
||||
final _CupertinoTextFieldState _state;
|
||||
|
||||
@override
|
||||
void onSingleTapUp(TapUpDetails details) {
|
||||
// Because TextSelectionGestureDetector listens to taps that happen on
|
||||
// widgets in front of it, tapping the clear button will also trigger
|
||||
// this handler. If the the clear button widget recognizes the up event,
|
||||
// then do not handle it.
|
||||
if (_state._clearGlobalKey.currentContext != null) {
|
||||
final RenderBox renderBox = _state._clearGlobalKey.currentContext.findRenderObject();
|
||||
final Offset localOffset = renderBox.globalToLocal(details.globalPosition);
|
||||
if (renderBox.hitTest(BoxHitTestResult(), position: localOffset)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
super.onSingleTapUp(details);
|
||||
_state._requestKeyboard();
|
||||
if (_state.widget.onTap != null)
|
||||
_state.widget.onTap();
|
||||
}
|
||||
|
||||
@override
|
||||
void onDragSelectionEnd(DragEndDetails details) {
|
||||
_state._requestKeyboard();
|
||||
}
|
||||
}
|
||||
|
||||
/// An iOS-style text field.
|
||||
///
|
||||
/// A text field lets the user enter text, either with a hardware keyboard or with
|
||||
@ -411,6 +444,12 @@ class CupertinoTextField extends StatefulWidget {
|
||||
final VoidCallback onEditingComplete;
|
||||
|
||||
/// {@macro flutter.widgets.editableText.onSubmitted}
|
||||
///
|
||||
/// See also:
|
||||
///
|
||||
/// * [EditableText.onSubmitted] for an example of how to handle moving to
|
||||
/// the next/previous field when using [TextInputAction.next] and
|
||||
/// [TextInputAction.previous] for [textInputAction].
|
||||
final ValueChanged<String> onSubmitted;
|
||||
|
||||
/// {@macro flutter.widgets.editableText.inputFormatters}
|
||||
@ -500,9 +539,8 @@ class CupertinoTextField extends StatefulWidget {
|
||||
}
|
||||
}
|
||||
|
||||
class _CupertinoTextFieldState extends State<CupertinoTextField> with AutomaticKeepAliveClientMixin {
|
||||
class _CupertinoTextFieldState extends State<CupertinoTextField> with AutomaticKeepAliveClientMixin implements TextSelectionGestureDetectorBuilderDelegate {
|
||||
final GlobalKey _clearGlobalKey = GlobalKey();
|
||||
final GlobalKey<EditableTextState> _editableTextKey = GlobalKey<EditableTextState>();
|
||||
|
||||
TextEditingController _controller;
|
||||
TextEditingController get _effectiveController => widget.controller ?? _controller;
|
||||
@ -510,17 +548,25 @@ class _CupertinoTextFieldState extends State<CupertinoTextField> with AutomaticK
|
||||
FocusNode _focusNode;
|
||||
FocusNode get _effectiveFocusNode => widget.focusNode ?? (_focusNode ??= FocusNode());
|
||||
|
||||
// The selection overlay should only be shown when the user is interacting
|
||||
// through a touch screen (via either a finger or a stylus). A mouse shouldn't
|
||||
// trigger the selection overlay.
|
||||
// For backwards-compatibility, we treat a null kind the same as touch.
|
||||
bool _shouldShowSelectionToolbar = true;
|
||||
|
||||
bool _showSelectionHandles = false;
|
||||
|
||||
_CupertinoTextFieldSelectionGestureDetectorBuilder _selectionGestureDetectorBuilder;
|
||||
|
||||
// API for TextSelectionGestureDetectorBuilderDelegate.
|
||||
@override
|
||||
bool get forcePressEnabled => true;
|
||||
|
||||
@override
|
||||
final GlobalKey<EditableTextState> editableTextKey = GlobalKey<EditableTextState>();
|
||||
|
||||
@override
|
||||
bool get selectionEnabled => widget.selectionEnabled;
|
||||
// End of API for TextSelectionGestureDetectorBuilderDelegate.
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_selectionGestureDetectorBuilder = _CupertinoTextFieldSelectionGestureDetectorBuilder(state: this);
|
||||
if (widget.controller == null) {
|
||||
_controller = TextEditingController();
|
||||
_controller.addListener(updateKeepAlive);
|
||||
@ -550,103 +596,16 @@ class _CupertinoTextFieldState extends State<CupertinoTextField> with AutomaticK
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
EditableTextState get _editableText => _editableTextKey.currentState;
|
||||
EditableTextState get _editableText => editableTextKey.currentState;
|
||||
|
||||
void _requestKeyboard() {
|
||||
_editableText?.requestKeyboard();
|
||||
}
|
||||
|
||||
RenderEditable get _renderEditable => _editableText.renderEditable;
|
||||
|
||||
void _handleTapDown(TapDownDetails details) {
|
||||
_renderEditable.handleTapDown(details);
|
||||
|
||||
// The selection overlay should only be shown when the user is interacting
|
||||
// through a touch screen (via either a finger or a stylus). A mouse shouldn't
|
||||
// trigger the selection overlay.
|
||||
// For backwards-compatibility, we treat a null kind the same as touch.
|
||||
final PointerDeviceKind kind = details.kind;
|
||||
_shouldShowSelectionToolbar =
|
||||
kind == null ||
|
||||
kind == PointerDeviceKind.touch ||
|
||||
kind == PointerDeviceKind.stylus;
|
||||
}
|
||||
|
||||
void _handleForcePressStarted(ForcePressDetails details) {
|
||||
if (widget.selectionEnabled) {
|
||||
_renderEditable.selectWordsInRange(
|
||||
from: details.globalPosition,
|
||||
cause: SelectionChangedCause.forcePress,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
void _handleForcePressEnded(ForcePressDetails details) {
|
||||
_renderEditable.selectWordsInRange(
|
||||
from: details.globalPosition,
|
||||
cause: SelectionChangedCause.forcePress,
|
||||
);
|
||||
if (_shouldShowSelectionToolbar)
|
||||
_editableText.showToolbar();
|
||||
}
|
||||
|
||||
void _handleSingleTapUp(TapUpDetails details) {
|
||||
// Because TextSelectionGestureDetector listens to taps that happen on
|
||||
// widgets in front of it, tapping the clear button will also trigger
|
||||
// this handler. If the the clear button widget recognizes the up event,
|
||||
// then do not handle it.
|
||||
if (_clearGlobalKey.currentContext != null) {
|
||||
final RenderBox renderBox = _clearGlobalKey.currentContext.findRenderObject();
|
||||
final Offset localOffset = renderBox.globalToLocal(details.globalPosition);
|
||||
if(renderBox.hitTest(BoxHitTestResult(), position: localOffset)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (widget.selectionEnabled) {
|
||||
_renderEditable.selectWordEdge(cause: SelectionChangedCause.tap);
|
||||
}
|
||||
_requestKeyboard();
|
||||
if (widget.onTap != null) {
|
||||
widget.onTap();
|
||||
}
|
||||
}
|
||||
|
||||
void _handleSingleLongTapStart(LongPressStartDetails details) {
|
||||
if (widget.selectionEnabled) {
|
||||
_renderEditable.selectPositionAt(
|
||||
from: details.globalPosition,
|
||||
cause: SelectionChangedCause.longPress,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
void _handleSingleLongTapMoveUpdate(LongPressMoveUpdateDetails details) {
|
||||
if (widget.selectionEnabled) {
|
||||
_renderEditable.selectPositionAt(
|
||||
from: details.globalPosition,
|
||||
cause: SelectionChangedCause.longPress,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
void _handleSingleLongTapEnd(LongPressEndDetails details) {
|
||||
if (_shouldShowSelectionToolbar)
|
||||
_editableText.showToolbar();
|
||||
}
|
||||
|
||||
void _handleDoubleTapDown(TapDownDetails details) {
|
||||
if (widget.selectionEnabled) {
|
||||
_renderEditable.selectWord(cause: SelectionChangedCause.tap);
|
||||
if (_shouldShowSelectionToolbar)
|
||||
_editableText.showToolbar();
|
||||
}
|
||||
}
|
||||
|
||||
bool _shouldShowSelectionHandles(SelectionChangedCause cause) {
|
||||
// When the text field is activated by something that doesn't trigger the
|
||||
// selection overlay, we shouldn't show the handles either.
|
||||
if (!_shouldShowSelectionToolbar)
|
||||
if (!_selectionGestureDetectorBuilder.shouldShowSelectionToolbar)
|
||||
return false;
|
||||
|
||||
// On iOS, we don't show handles when the selection is collapsed.
|
||||
@ -662,28 +621,6 @@ class _CupertinoTextFieldState extends State<CupertinoTextField> with AutomaticK
|
||||
return false;
|
||||
}
|
||||
|
||||
void _handleMouseDragSelectionStart(DragStartDetails details) {
|
||||
_renderEditable.selectPositionAt(
|
||||
from: details.globalPosition,
|
||||
cause: SelectionChangedCause.drag,
|
||||
);
|
||||
}
|
||||
|
||||
void _handleMouseDragSelectionUpdate(
|
||||
DragStartDetails startDetails,
|
||||
DragUpdateDetails updateDetails,
|
||||
) {
|
||||
_renderEditable.selectPositionAt(
|
||||
from: startDetails.globalPosition,
|
||||
to: updateDetails.globalPosition,
|
||||
cause: SelectionChangedCause.drag,
|
||||
);
|
||||
}
|
||||
|
||||
void _handleMouseDragSelectionEnd(DragEndDetails details) {
|
||||
_requestKeyboard();
|
||||
}
|
||||
|
||||
void _handleSelectionChanged(TextSelection selection, SelectionChangedCause cause) {
|
||||
if (cause == SelectionChangedCause.longPress) {
|
||||
_editableText?.bringIntoView(selection.base);
|
||||
@ -864,7 +801,7 @@ class _CupertinoTextFieldState extends State<CupertinoTextField> with AutomaticK
|
||||
padding: widget.padding,
|
||||
child: RepaintBoundary(
|
||||
child: EditableText(
|
||||
key: _editableTextKey,
|
||||
key: editableTextKey,
|
||||
controller: controller,
|
||||
readOnly: widget.readOnly,
|
||||
showCursor: widget.showCursor,
|
||||
@ -919,18 +856,7 @@ class _CupertinoTextFieldState extends State<CupertinoTextField> with AutomaticK
|
||||
ignoring: !enabled,
|
||||
child: Container(
|
||||
decoration: effectiveDecoration,
|
||||
child: TextSelectionGestureDetector(
|
||||
onTapDown: _handleTapDown,
|
||||
onForcePressStart: _handleForcePressStarted,
|
||||
onForcePressEnd: _handleForcePressEnded,
|
||||
onSingleTapUp: _handleSingleTapUp,
|
||||
onSingleLongTapStart: _handleSingleLongTapStart,
|
||||
onSingleLongTapMoveUpdate: _handleSingleLongTapMoveUpdate,
|
||||
onSingleLongTapEnd: _handleSingleLongTapEnd,
|
||||
onDoubleTapDown: _handleDoubleTapDown,
|
||||
onDragSelectionStart: _handleMouseDragSelectionStart,
|
||||
onDragSelectionUpdate: _handleMouseDragSelectionUpdate,
|
||||
onDragSelectionEnd: _handleMouseDragSelectionEnd,
|
||||
child: _selectionGestureDetectorBuilder.buildGestureDetector(
|
||||
behavior: HitTestBehavior.translucent,
|
||||
child: Align(
|
||||
alignment: Alignment(-1.0, _textAlignVertical.y),
|
||||
|
||||
@ -34,6 +34,19 @@ const TextStyle _errorTextStyle = TextStyle(
|
||||
debugLabel: 'fallback style; consider putting your text in a Material',
|
||||
);
|
||||
|
||||
/// Describes which theme will be used by [MaterialApp].
|
||||
enum ThemeMode {
|
||||
/// Use either the light or dark theme based on what the user has selected in
|
||||
/// the system settings.
|
||||
system,
|
||||
|
||||
/// Always use the light mode regardless of system preference.
|
||||
light,
|
||||
|
||||
/// Always use the dark mode (if available) regardless of system preference.
|
||||
dark,
|
||||
}
|
||||
|
||||
/// An application that uses material design.
|
||||
///
|
||||
/// A convenience widget that wraps a number of widgets that are commonly
|
||||
@ -99,6 +112,7 @@ class MaterialApp extends StatefulWidget {
|
||||
this.color,
|
||||
this.theme,
|
||||
this.darkTheme,
|
||||
this.themeMode = ThemeMode.system,
|
||||
this.locale,
|
||||
this.localizationsDelegates,
|
||||
this.localeListResolutionCallback,
|
||||
@ -169,13 +183,15 @@ class MaterialApp extends StatefulWidget {
|
||||
/// Default visual properties, like colors fonts and shapes, for this app's
|
||||
/// material widgets.
|
||||
///
|
||||
/// A second [darkTheme] [ThemeData] value, which is used when the underlying
|
||||
/// platform requests a "dark mode" UI, can also be specified.
|
||||
/// A second [darkTheme] [ThemeData] value, which is used to provide a dark
|
||||
/// version of the user interface can also be specified. [themeMode] will
|
||||
/// control which theme will be used if a [darkTheme] is provided.
|
||||
///
|
||||
/// The default value of this property is the value of [ThemeData.light()].
|
||||
///
|
||||
/// See also:
|
||||
///
|
||||
/// * [themeMode], which controls which theme to use.
|
||||
/// * [MediaQueryData.platformBrightness], which indicates the platform's
|
||||
/// desired brightness and is used to automatically toggle between [theme]
|
||||
/// and [darkTheme] in [MaterialApp].
|
||||
@ -183,20 +199,21 @@ class MaterialApp extends StatefulWidget {
|
||||
/// colors.
|
||||
final ThemeData theme;
|
||||
|
||||
/// The [ThemeData] to use when the platform specifically requests a dark
|
||||
/// themed UI.
|
||||
/// The [ThemeData] to use when a 'dark mode' is requested by the system.
|
||||
///
|
||||
/// Host platforms such as Android Pie can request a system-wide "dark mode"
|
||||
/// when entering battery saver mode.
|
||||
/// Some host platforms allow the users to select a system-wide 'dark mode',
|
||||
/// or the application may want to offer the user the ability to choose a
|
||||
/// dark theme just for this application. This is theme that will be used for
|
||||
/// such cases. [themeMode] will control which theme will be used.
|
||||
///
|
||||
/// When the host platform requests a [Brightness.dark] mode, you may want to
|
||||
/// supply a [ThemeData.brightness] that's also [Brightness.dark].
|
||||
/// This theme should have a [ThemeData.brightness] set to [Brightness.dark].
|
||||
///
|
||||
/// Uses [theme] instead when null. Defaults to the value of
|
||||
/// [ThemeData.light()] when both [darkTheme] and [theme] are null.
|
||||
///
|
||||
/// See also:
|
||||
///
|
||||
/// * [themeMode], which controls which theme to use.
|
||||
/// * [MediaQueryData.platformBrightness], which indicates the platform's
|
||||
/// desired brightness and is used to automatically toggle between [theme]
|
||||
/// and [darkTheme] in [MaterialApp].
|
||||
@ -204,6 +221,32 @@ class MaterialApp extends StatefulWidget {
|
||||
/// [MediaQueryData.platformBrightness].
|
||||
final ThemeData darkTheme;
|
||||
|
||||
/// Determines which theme will be used by the application if both [theme]
|
||||
/// and [darkTheme] are provided.
|
||||
///
|
||||
/// If set to [ThemeMode.system], the choice of which theme to use will
|
||||
/// be based on the user's system preferences. If the [MediaQuery.platformBrightnessOf]
|
||||
/// is [Brightness.light], [theme] will be used. If it is [Brightness.dark],
|
||||
/// [darkTheme] will be used (unless it is [null], in which case [theme]
|
||||
/// will be used.
|
||||
///
|
||||
/// If set to [ThemeMode.light] the [theme] will always be used,
|
||||
/// regardless of the user's system preference.
|
||||
///
|
||||
/// If set to [ThemeMode.dark] the [darkTheme] will be used
|
||||
/// regardless of the user's system preference. If [darkTheme] is [null]
|
||||
/// then it will fallback to using [theme].
|
||||
///
|
||||
/// The default value is [ThemeMode.system].
|
||||
///
|
||||
/// See also:
|
||||
///
|
||||
/// * [theme], which is used when a light mode is selected.
|
||||
/// * [darkTheme], which is used when a dark mode is selected.
|
||||
/// * [ThemeData.brightness], which indicates to various parts of the
|
||||
/// system what kind of theme is being used.
|
||||
final ThemeMode themeMode;
|
||||
|
||||
/// {@macro flutter.widgets.widgetsApp.color}
|
||||
final Color color;
|
||||
|
||||
@ -454,15 +497,16 @@ class _MaterialAppState extends State<MaterialApp> {
|
||||
onUnknownRoute: widget.onUnknownRoute,
|
||||
builder: (BuildContext context, Widget child) {
|
||||
// Use a light theme, dark theme, or fallback theme.
|
||||
final ThemeMode mode = widget.themeMode ?? ThemeMode.system;
|
||||
ThemeData theme;
|
||||
final ui.Brightness platformBrightness = MediaQuery.platformBrightnessOf(context);
|
||||
if (platformBrightness == ui.Brightness.dark && widget.darkTheme != null) {
|
||||
theme = widget.darkTheme;
|
||||
} else if (widget.theme != null) {
|
||||
theme = widget.theme;
|
||||
} else {
|
||||
theme = ThemeData.fallback();
|
||||
if (widget.darkTheme != null) {
|
||||
final ui.Brightness platformBrightness = MediaQuery.platformBrightnessOf(context);
|
||||
if (mode == ThemeMode.dark ||
|
||||
(mode == ThemeMode.system && platformBrightness == ui.Brightness.dark)) {
|
||||
theme = widget.darkTheme;
|
||||
}
|
||||
}
|
||||
theme ??= widget.theme ?? ThemeData.fallback();
|
||||
|
||||
return AnimatedTheme(
|
||||
data: theme,
|
||||
|
||||
@ -400,6 +400,11 @@ class _ModalBottomSheetRoute<T> extends PopupRoute<T> {
|
||||
/// a [GridView] and have the bottom sheet be draggable, you should set this
|
||||
/// parameter to true.
|
||||
///
|
||||
/// The `useRootNavigator` parameter ensures that the root navigator is used to
|
||||
/// display the [BottomSheet] when set to `true`. This is useful in the case
|
||||
/// that a modal [BottomSheet] needs to be displayed above all other content
|
||||
/// but the caller is inside another [Navigator].
|
||||
///
|
||||
/// Returns a `Future` that resolves to the value (if any) that was passed to
|
||||
/// [Navigator.pop] when the modal bottom sheet was closed.
|
||||
///
|
||||
@ -417,14 +422,16 @@ Future<T> showModalBottomSheet<T>({
|
||||
double elevation,
|
||||
ShapeBorder shape,
|
||||
bool isScrollControlled = false,
|
||||
bool useRootNavigator = false,
|
||||
}) {
|
||||
assert(context != null);
|
||||
assert(builder != null);
|
||||
assert(isScrollControlled != null);
|
||||
assert(useRootNavigator != null);
|
||||
assert(debugCheckHasMediaQuery(context));
|
||||
assert(debugCheckHasMaterialLocalizations(context));
|
||||
|
||||
return Navigator.push(context, _ModalBottomSheetRoute<T>(
|
||||
return Navigator.of(context, rootNavigator: useRootNavigator).push(_ModalBottomSheetRoute<T>(
|
||||
builder: builder,
|
||||
theme: Theme.of(context, shadowThemeOnly: true),
|
||||
isScrollControlled: isScrollControlled,
|
||||
|
||||