diff --git a/.ci/Dockerfile b/.ci/Dockerfile index 59d4064f0a91..bec62f22cc89 100644 --- a/.ci/Dockerfile +++ b/.ci/Dockerfile @@ -1,47 +1,40 @@ # The Flutter version is not important here, since the CI scripts update Flutter # before running. What matters is that the base image is pinned to minimize # unintended changes when modifying this file. -FROM cirrusci/flutter@sha256:505fe8bce2896c75b4df9ccf500b1604155bf932af7465ffcc66fcae8612f82f +# This is the hash for the 3.0.0 image. +FROM cirrusci/flutter@sha256:0224587bba33241cf908184283ec2b544f1b672d87043ead1c00521c368cf844 RUN apt-get update -y +# Set up Firebase Test Lab requirements. RUN apt-get install -y --no-install-recommends gnupg - -# Add repo for gcloud sdk and install it RUN echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main" | \ sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list - RUN curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | \ sudo apt-key --keyring /usr/share/keyrings/cloud.google.gpg add - - RUN apt-get update && apt-get install -y google-cloud-sdk && \ gcloud config set core/disable_usage_reporting true && \ gcloud config set component_manager/disable_update_check true -RUN yes | sdkmanager \ - "platforms;android-27" \ - "build-tools;27.0.3" \ - "extras;google;m2repository" \ - "extras;android;m2repository" - -RUN yes | sdkmanager --licenses - -# Install formatter. +# Install formatter for C-based languages. RUN apt-get install -y clang-format -# Install xvfb to allow running headless -RUN apt-get install -y xvfb libegl1-mesa -# Install Linux desktop build tool requirements. +# Install Linux desktop requirements: +# - build tools. RUN apt-get install -y clang cmake ninja-build file pkg-config -# Install necessary libraries. +# - libraries. RUN apt-get install -y libgtk-3-dev libblkid-dev liblzma-dev libgcrypt20-dev +# - xvfb to allow running headless. +RUN apt-get install -y xvfb libegl1-mesa -# Add repo for Google Chrome and install it +# Install Chrome and make it the default browser, for url_launcher tests. +# IMPORTANT: Web tests should use a pinned version of Chromium, not this, since +# this isn't pinned, so any time the docker image is re-created the version of +# Chrome may change. RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add - RUN echo 'deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main' | sudo tee /etc/apt/sources.list.d/google-chrome.list RUN apt-get update && apt-get install -y --no-install-recommends google-chrome-stable - -# Make Chrome the default so http: and file: has a handler for url_launcher tests. +# Make Chrome the default for http:, https: and file:. RUN apt-get install -y xdg-utils RUN xdg-settings set default-web-browser google-chrome.desktop RUN xdg-mime default google-chrome.desktop inode/directory diff --git a/.ci/flutter_master.version b/.ci/flutter_master.version index 886179e55e79..aa54d97b2eaf 100644 --- a/.ci/flutter_master.version +++ b/.ci/flutter_master.version @@ -1 +1 @@ -64f84f6a47d276e4d79cb10c203adbddeeeae336 +55d67cc7d99226cd12d6c4a76de357fc2c92823e diff --git a/.ci/flutter_stable.version b/.ci/flutter_stable.version index 4c15f9c261c3..20445c3150b3 100644 --- a/.ci/flutter_stable.version +++ b/.ci/flutter_stable.version @@ -1 +1 @@ -e3c29ec00c9c825c891d75054c63fcc46454dca1 +18a827f3933c19f51862dde3fa472197683249d6 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 06154081619b..5ff15569f842 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -50,5 +50,5 @@ jobs: run: | git config --global user.name ${{ secrets.USER_NAME }} git config --global user.email ${{ secrets.USER_EMAIL }} - dart ./script/tool/lib/src/main.dart publish-plugin --all-changed --base-sha=HEAD~ --skip-confirmation --remote=origin + dart ./script/tool/lib/src/main.dart publish --all-changed --base-sha=HEAD~ --skip-confirmation --remote=origin env: {PUB_CREDENTIALS: "${{ secrets.PUB_CREDENTIALS }}"} diff --git a/.github/workflows/scorecards-analysis.yml b/.github/workflows/scorecards-analysis.yml index 6650853754af..e14935f4e455 100644 --- a/.github/workflows/scorecards-analysis.yml +++ b/.github/workflows/scorecards-analysis.yml @@ -50,6 +50,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@904260d7d935dff982205cbdb42025ce30b7a34f + uses: github/codeql-action/upload-sarif@86f3159a697a097a813ad9bfa0002412d97690a4 with: sarif_file: results.sarif diff --git a/analysis_options.yaml b/analysis_options.yaml index 891e2ef49180..98352af415de 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -23,8 +23,8 @@ analyzer: strong-mode: - implicit-casts: false - implicit-dynamic: false + strict-casts: true + strict-raw-types: true errors: # treat missing required parameters as a warning (not a hint) missing_required_param: warning @@ -114,7 +114,7 @@ linter: # - constant_identifier_names # needs an opt-out https://github.com/dart-lang/linter/issues/204 - control_flow_in_finally # - curly_braces_in_flow_control_structures # not required by flutter style - # - depend_on_referenced_packages # LOCAL CHANGE - Needs to be enabled and violations fixed. + - depend_on_referenced_packages - deprecated_consistency # - diagnostic_describe_all_properties # enabled only at the framework level (packages/flutter/lib) - directives_ordering @@ -143,7 +143,7 @@ linter: # - no_default_cases # LOCAL CHANGE - Needs to be enabled and violations fixed. - no_duplicate_case_values - no_leading_underscores_for_library_prefixes - # - no_leading_underscores_for_local_identifiers # LOCAL CHANGE - Needs to be enabled and violations fixed. + - no_leading_underscores_for_local_identifiers - no_logic_in_create_state # - no_runtimeType_toString # ok in tests; we enable this only in packages/ - non_constant_identifier_names @@ -193,7 +193,7 @@ linter: # - prefer_mixin # Has false positives, see https://github.com/dart-lang/linter/issues/3018 # - prefer_null_aware_method_calls # "call()" is confusing to people new to the language since it's not documented anywhere - prefer_null_aware_operators - # - prefer_relative_imports # LOCAL CHANGE - Needs to be enabled and violations fixed. + - prefer_relative_imports - prefer_single_quotes - prefer_spread_collections - prefer_typing_uninitialized_variables diff --git a/packages/camera/camera/CHANGELOG.md b/packages/camera/camera/CHANGELOG.md index 67b8b7970bbe..30bb098f8fd4 100644 --- a/packages/camera/camera/CHANGELOG.md +++ b/packages/camera/camera/CHANGELOG.md @@ -1,5 +1,10 @@ -## NEXT +## 0.10.0+3 +* Updates code for `no_leading_underscores_for_local_identifiers` lint. + +## 0.10.0+2 + +* Updates imports for `prefer_relative_imports`. * Updates minimum Flutter version to 2.10. ## 0.10.0+1 diff --git a/packages/camera/camera/example/integration_test/camera_test.dart b/packages/camera/camera/example/integration_test/camera_test.dart index 557f4858acab..b233d4958c8a 100644 --- a/packages/camera/camera/example/integration_test/camera_test.dart +++ b/packages/camera/camera/example/integration_test/camera_test.dart @@ -221,16 +221,16 @@ void main() { ); await controller.initialize(); - bool _isDetecting = false; + bool isDetecting = false; await controller.startImageStream((CameraImage image) { - if (_isDetecting) { + if (isDetecting) { return; } - _isDetecting = true; + isDetecting = true; - expectLater(image, isNotNull).whenComplete(() => _isDetecting = false); + expectLater(image, isNotNull).whenComplete(() => isDetecting = false); }); expect(controller.value.isStreamingImages, true); @@ -254,19 +254,19 @@ void main() { ); await controller.initialize(); - final Completer _completer = Completer(); + final Completer completer = Completer(); await controller.startImageStream((CameraImage image) { - if (!_completer.isCompleted) { + if (!completer.isCompleted) { Future(() async { await controller.stopImageStream(); await controller.dispose(); }).then((Object? value) { - _completer.complete(image); + completer.complete(image); }); } }); - return _completer.future; + return completer.future; } testWidgets( @@ -277,20 +277,20 @@ void main() { return; } - CameraImage _image = await startStreaming(cameras, null); - expect(_image, isNotNull); - expect(_image.format.group, ImageFormatGroup.bgra8888); - expect(_image.planes.length, 1); + CameraImage image = await startStreaming(cameras, null); + expect(image, isNotNull); + expect(image.format.group, ImageFormatGroup.bgra8888); + expect(image.planes.length, 1); - _image = await startStreaming(cameras, ImageFormatGroup.yuv420); - expect(_image, isNotNull); - expect(_image.format.group, ImageFormatGroup.yuv420); - expect(_image.planes.length, 2); + image = await startStreaming(cameras, ImageFormatGroup.yuv420); + expect(image, isNotNull); + expect(image.format.group, ImageFormatGroup.yuv420); + expect(image.planes.length, 2); - _image = await startStreaming(cameras, ImageFormatGroup.bgra8888); - expect(_image, isNotNull); - expect(_image.format.group, ImageFormatGroup.bgra8888); - expect(_image.planes.length, 1); + image = await startStreaming(cameras, ImageFormatGroup.bgra8888); + expect(image, isNotNull); + expect(image.format.group, ImageFormatGroup.bgra8888); + expect(image.planes.length, 1); }, skip: !Platform.isIOS, ); diff --git a/packages/camera/camera/lib/src/camera_controller.dart b/packages/camera/camera/lib/src/camera_controller.dart index 6566e2abc883..ed1c951925d8 100644 --- a/packages/camera/camera/lib/src/camera_controller.dart +++ b/packages/camera/camera/lib/src/camera_controller.dart @@ -5,13 +5,14 @@ import 'dart:async'; import 'dart:math'; -import 'package:camera/camera.dart'; import 'package:camera_platform_interface/camera_platform_interface.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:quiver/core.dart'; +import '../camera.dart'; + /// Signature for a callback receiving the a camera image. /// /// This is used by [CameraController.startImageStream]. @@ -281,7 +282,7 @@ class CameraController extends ValueNotifier { ); } try { - final Completer _initializeCompleter = + final Completer initializeCompleter = Completer(); _deviceOrientationSubscription = CameraPlatform.instance @@ -302,7 +303,7 @@ class CameraController extends ValueNotifier { .onCameraInitialized(_cameraId) .first .then((CameraInitializedEvent event) { - _initializeCompleter.complete(event); + initializeCompleter.complete(event); })); await CameraPlatform.instance.initializeCamera( @@ -312,18 +313,18 @@ class CameraController extends ValueNotifier { value = value.copyWith( isInitialized: true, - previewSize: await _initializeCompleter.future + previewSize: await initializeCompleter.future .then((CameraInitializedEvent event) => Size( event.previewWidth, event.previewHeight, )), - exposureMode: await _initializeCompleter.future + exposureMode: await initializeCompleter.future .then((CameraInitializedEvent event) => event.exposureMode), - focusMode: await _initializeCompleter.future + focusMode: await initializeCompleter.future .then((CameraInitializedEvent event) => event.focusMode), - exposurePointSupported: await _initializeCompleter.future.then( + exposurePointSupported: await initializeCompleter.future.then( (CameraInitializedEvent event) => event.exposurePointSupported), - focusPointSupported: await _initializeCompleter.future + focusPointSupported: await initializeCompleter.future .then((CameraInitializedEvent event) => event.focusPointSupported), ); } on PlatformException catch (e) { diff --git a/packages/camera/camera/lib/src/camera_preview.dart b/packages/camera/camera/lib/src/camera_preview.dart index 94ffca649fa6..d8eadd8c93ae 100644 --- a/packages/camera/camera/lib/src/camera_preview.dart +++ b/packages/camera/camera/lib/src/camera_preview.dart @@ -2,11 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'package:camera/camera.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import '../camera.dart'; + /// A widget showing a live camera preview. class CameraPreview extends StatelessWidget { /// Creates a preview widget for the given camera controller. diff --git a/packages/camera/camera/pubspec.yaml b/packages/camera/camera/pubspec.yaml index 5a68f6da8036..1190989a63b7 100644 --- a/packages/camera/camera/pubspec.yaml +++ b/packages/camera/camera/pubspec.yaml @@ -4,7 +4,7 @@ description: A Flutter plugin for controlling the camera. Supports previewing Dart. repository: https://github.com/flutter/plugins/tree/main/packages/camera/camera issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 -version: 0.10.0+1 +version: 0.10.0+3 environment: sdk: ">=2.14.0 <3.0.0" diff --git a/packages/camera/camera_android/CHANGELOG.md b/packages/camera/camera_android/CHANGELOG.md index f2417fb20645..af871474f68b 100644 --- a/packages/camera/camera_android/CHANGELOG.md +++ b/packages/camera/camera_android/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.10.0+3 + +* Updates code for `no_leading_underscores_for_local_identifiers` lint. + ## 0.10.0+2 * Removes call to `join` on the camera's background `HandlerThread`. diff --git a/packages/camera/camera_android/example/integration_test/camera_test.dart b/packages/camera/camera_android/example/integration_test/camera_test.dart index 99029fcac605..3b1aae6aec51 100644 --- a/packages/camera/camera_android/example/integration_test/camera_test.dart +++ b/packages/camera/camera_android/example/integration_test/camera_test.dart @@ -225,16 +225,16 @@ void main() { ); await controller.initialize(); - bool _isDetecting = false; + bool isDetecting = false; await controller.startImageStream((CameraImageData image) { - if (_isDetecting) { + if (isDetecting) { return; } - _isDetecting = true; + isDetecting = true; - expectLater(image, isNotNull).whenComplete(() => _isDetecting = false); + expectLater(image, isNotNull).whenComplete(() => isDetecting = false); }); expect(controller.value.isStreamingImages, true); diff --git a/packages/camera/camera_android/example/lib/camera_controller.dart b/packages/camera/camera_android/example/lib/camera_controller.dart index 5a7a79c8d96c..09441cc5449c 100644 --- a/packages/camera/camera_android/example/lib/camera_controller.dart +++ b/packages/camera/camera_android/example/lib/camera_controller.dart @@ -203,7 +203,7 @@ class CameraController extends ValueNotifier { /// Initializes the camera on the device. Future initialize() async { - final Completer _initializeCompleter = + final Completer initializeCompleter = Completer(); _deviceOrientationSubscription = CameraPlatform.instance @@ -224,7 +224,7 @@ class CameraController extends ValueNotifier { .onCameraInitialized(_cameraId) .first .then((CameraInitializedEvent event) { - _initializeCompleter.complete(event); + initializeCompleter.complete(event); }); await CameraPlatform.instance.initializeCamera( @@ -234,18 +234,18 @@ class CameraController extends ValueNotifier { value = value.copyWith( isInitialized: true, - previewSize: await _initializeCompleter.future + previewSize: await initializeCompleter.future .then((CameraInitializedEvent event) => Size( event.previewWidth, event.previewHeight, )), - exposureMode: await _initializeCompleter.future + exposureMode: await initializeCompleter.future .then((CameraInitializedEvent event) => event.exposureMode), - focusMode: await _initializeCompleter.future + focusMode: await initializeCompleter.future .then((CameraInitializedEvent event) => event.focusMode), - exposurePointSupported: await _initializeCompleter.future + exposurePointSupported: await initializeCompleter.future .then((CameraInitializedEvent event) => event.exposurePointSupported), - focusPointSupported: await _initializeCompleter.future + focusPointSupported: await initializeCompleter.future .then((CameraInitializedEvent event) => event.focusPointSupported), ); diff --git a/packages/camera/camera_android/example/pubspec.yaml b/packages/camera/camera_android/example/pubspec.yaml index 5fcc8093d29e..2e530e02ca71 100644 --- a/packages/camera/camera_android/example/pubspec.yaml +++ b/packages/camera/camera_android/example/pubspec.yaml @@ -14,6 +14,7 @@ dependencies: # The example app is bundled with the plugin so we use a path dependency on # the parent directory to use the current plugin's version. path: ../ + camera_platform_interface: ^2.2.0 flutter: sdk: flutter path_provider: ^2.0.0 diff --git a/packages/camera/camera_android/lib/src/android_camera.dart b/packages/camera/camera_android/lib/src/android_camera.dart index 3e9e52af04a7..36077eac8eed 100644 --- a/packages/camera/camera_android/lib/src/android_camera.dart +++ b/packages/camera/camera_android/lib/src/android_camera.dart @@ -126,10 +126,10 @@ class AndroidCamera extends CameraPlatform { return channel; }); - final Completer _completer = Completer(); + final Completer completer = Completer(); onCameraInitialized(cameraId).first.then((CameraInitializedEvent value) { - _completer.complete(); + completer.complete(); }); _channel.invokeMapMethod( @@ -147,14 +147,14 @@ class AndroidCamera extends CameraPlatform { if (error is! PlatformException) { throw error; } - _completer.completeError( + completer.completeError( CameraException(error.code, error.message), stackTrace, ); }, ); - return _completer.future; + return completer.future; } @override diff --git a/packages/camera/camera_android/pubspec.yaml b/packages/camera/camera_android/pubspec.yaml index 9f5a2f2b9c16..a464759c3c46 100644 --- a/packages/camera/camera_android/pubspec.yaml +++ b/packages/camera/camera_android/pubspec.yaml @@ -2,7 +2,7 @@ name: camera_android description: Android implementation of the camera plugin. repository: https://github.com/flutter/plugins/tree/main/packages/camera/camera_android issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 -version: 0.10.0+2 +version: 0.10.0+3 environment: sdk: ">=2.14.0 <3.0.0" diff --git a/packages/camera/camera_android_camerax/CHANGELOG.md b/packages/camera/camera_android_camerax/CHANGELOG.md index 0f305eb8b4fd..ce2fb9046c69 100644 --- a/packages/camera/camera_android_camerax/CHANGELOG.md +++ b/packages/camera/camera_android_camerax/CHANGELOG.md @@ -2,3 +2,5 @@ * Creates camera_android_camerax plugin for development. * Adds CameraInfo class and removes unnecessary code from plugin. +* Adds CameraSelector class. +* Adds ProcessCameraProvider class. diff --git a/packages/camera/camera_android_camerax/android/build.gradle b/packages/camera/camera_android_camerax/android/build.gradle index 5e9a9a8ec106..b4209bbe62a6 100644 --- a/packages/camera/camera_android_camerax/android/build.gradle +++ b/packages/camera/camera_android_camerax/android/build.gradle @@ -8,7 +8,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:7.2.2' + classpath 'com.android.tools.build:gradle:7.3.0' } } @@ -36,16 +36,6 @@ android { testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } -dependencies { - // CameraX core library using the camera2 implementation must use same version number. - def camerax_version = "1.2.0-beta01" - implementation "androidx.camera:camera-core:${camerax_version}" - implementation "androidx.camera:camera-camera2:${camerax_version}" - implementation "androidx.camera:camera-lifecycle:${camerax_version}" - testImplementation 'junit:junit:4.13.2' - testImplementation 'org.mockito:mockito-inline:4.7.0' - testImplementation 'androidx.test:core:1.4.0' -} testOptions { unitTests.includeAndroidResources = true unitTests.returnDefaultValues = true @@ -58,3 +48,16 @@ dependencies { } } } + +dependencies { + // CameraX core library using the camera2 implementation must use same version number. + def camerax_version = "1.2.0-beta02" + implementation "androidx.camera:camera-core:${camerax_version}" + implementation "androidx.camera:camera-camera2:${camerax_version}" + implementation "androidx.camera:camera-lifecycle:${camerax_version}" + implementation 'com.google.guava:guava:31.1-android' + testImplementation 'junit:junit:4.13.2' + testImplementation 'org.mockito:mockito-inline:4.7.0' + testImplementation 'androidx.test:core:1.4.0' + testImplementation 'org.robolectric:robolectric:4.8' +} diff --git a/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraAndroidCameraxPlugin.java b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraAndroidCameraxPlugin.java index 029a6dc4c8b7..b8fbaf539c32 100644 --- a/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraAndroidCameraxPlugin.java +++ b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraAndroidCameraxPlugin.java @@ -15,6 +15,7 @@ public final class CameraAndroidCameraxPlugin implements FlutterPlugin, ActivityAware { private InstanceManager instanceManager; private FlutterPluginBinding pluginBinding; + private ProcessCameraProviderHostApiImpl processCameraProviderHostApi; /** * Initialize this within the {@code #configureFlutterEngine} of a Flutter activity or fragment. @@ -37,6 +38,12 @@ void setUp(BinaryMessenger binaryMessenger, Context context) { binaryMessenger, new CameraInfoHostApiImpl(instanceManager)); GeneratedCameraXLibrary.JavaObjectHostApi.setup( binaryMessenger, new JavaObjectHostApiImpl(instanceManager)); + GeneratedCameraXLibrary.CameraSelectorHostApi.setup( + binaryMessenger, new CameraSelectorHostApiImpl(binaryMessenger, instanceManager)); + processCameraProviderHostApi = + new ProcessCameraProviderHostApiImpl(binaryMessenger, instanceManager, context); + GeneratedCameraXLibrary.ProcessCameraProviderHostApi.setup( + binaryMessenger, processCameraProviderHostApi); } @Override @@ -58,15 +65,33 @@ public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) { // Activity Lifecycle methods: @Override - public void onAttachedToActivity(@NonNull ActivityPluginBinding activityPluginBinding) {} + public void onAttachedToActivity(@NonNull ActivityPluginBinding activityPluginBinding) { + updateContext(activityPluginBinding.getActivity()); + } @Override - public void onDetachedFromActivityForConfigChanges() {} + public void onDetachedFromActivityForConfigChanges() { + updateContext(pluginBinding.getApplicationContext()); + } @Override public void onReattachedToActivityForConfigChanges( - @NonNull ActivityPluginBinding activityPluginBinding) {} + @NonNull ActivityPluginBinding activityPluginBinding) { + updateContext(activityPluginBinding.getActivity()); + } @Override - public void onDetachedFromActivity() {} + public void onDetachedFromActivity() { + updateContext(pluginBinding.getApplicationContext()); + } + + /** + * Updates context that is used to fetch the corresponding instance of a {@code + * ProcessCameraProvider}. + */ + private void updateContext(Context context) { + if (processCameraProviderHostApi != null) { + processCameraProviderHostApi.setContext(context); + } + } } diff --git a/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraInfoFlutterApiImpl.java b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraInfoFlutterApiImpl.java index b5ba9fc1ff3b..c538e420cc7e 100644 --- a/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraInfoFlutterApiImpl.java +++ b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraInfoFlutterApiImpl.java @@ -18,7 +18,6 @@ public CameraInfoFlutterApiImpl( } void create(CameraInfo cameraInfo, Reply reply) { - instanceManager.addHostCreatedInstance(cameraInfo); - create(instanceManager.getIdentifierForStrongReference(cameraInfo), reply); + create(instanceManager.addHostCreatedInstance(cameraInfo), reply); } } diff --git a/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraSelectorFlutterApiImpl.java b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraSelectorFlutterApiImpl.java new file mode 100644 index 000000000000..6ca3782d8b59 --- /dev/null +++ b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraSelectorFlutterApiImpl.java @@ -0,0 +1,23 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package io.flutter.plugins.camerax; + +import androidx.camera.core.CameraSelector; +import io.flutter.plugin.common.BinaryMessenger; +import io.flutter.plugins.camerax.GeneratedCameraXLibrary.CameraSelectorFlutterApi; + +public class CameraSelectorFlutterApiImpl extends CameraSelectorFlutterApi { + private final InstanceManager instanceManager; + + public CameraSelectorFlutterApiImpl( + BinaryMessenger binaryMessenger, InstanceManager instanceManager) { + super(binaryMessenger); + this.instanceManager = instanceManager; + } + + void create(CameraSelector cameraSelector, Long lensFacing, Reply reply) { + create(instanceManager.addHostCreatedInstance(cameraSelector), lensFacing, reply); + } +} diff --git a/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraSelectorHostApiImpl.java b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraSelectorHostApiImpl.java new file mode 100644 index 000000000000..9c559a72e63c --- /dev/null +++ b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraSelectorHostApiImpl.java @@ -0,0 +1,67 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package io.flutter.plugins.camerax; + +import androidx.annotation.NonNull; +import androidx.annotation.VisibleForTesting; +import androidx.camera.core.CameraInfo; +import androidx.camera.core.CameraSelector; +import io.flutter.plugin.common.BinaryMessenger; +import io.flutter.plugins.camerax.GeneratedCameraXLibrary.CameraSelectorHostApi; +import java.util.ArrayList; +import java.util.List; + +public class CameraSelectorHostApiImpl implements CameraSelectorHostApi { + private final BinaryMessenger binaryMessenger; + private final InstanceManager instanceManager; + + @VisibleForTesting public CameraXProxy cameraXProxy = new CameraXProxy(); + + public CameraSelectorHostApiImpl( + BinaryMessenger binaryMessenger, InstanceManager instanceManager) { + this.binaryMessenger = binaryMessenger; + this.instanceManager = instanceManager; + } + + @Override + public void create(@NonNull Long identifier, Long lensFacing) { + CameraSelector.Builder cameraSelectorBuilder = cameraXProxy.createCameraSelectorBuilder(); + CameraSelector cameraSelector; + + if (lensFacing != null) { + cameraSelector = cameraSelectorBuilder.requireLensFacing(Math.toIntExact(lensFacing)).build(); + } else { + cameraSelector = cameraSelectorBuilder.build(); + } + + instanceManager.addDartCreatedInstance(cameraSelector, identifier); + } + + @Override + public List filter(@NonNull Long identifier, @NonNull List cameraInfoIds) { + CameraSelector cameraSelector = (CameraSelector) instanceManager.getInstance(identifier); + List cameraInfosForFilter = new ArrayList(); + + for (Number cameraInfoAsNumber : cameraInfoIds) { + Long cameraInfoId = cameraInfoAsNumber.longValue(); + + CameraInfo cameraInfo = (CameraInfo) instanceManager.getInstance(cameraInfoId); + cameraInfosForFilter.add(cameraInfo); + } + + List filteredCameraInfos = cameraSelector.filter(cameraInfosForFilter); + final CameraInfoFlutterApiImpl cameraInfoFlutterApiImpl = + new CameraInfoFlutterApiImpl(binaryMessenger, instanceManager); + List filteredCameraInfosIds = new ArrayList(); + + for (CameraInfo cameraInfo : filteredCameraInfos) { + cameraInfoFlutterApiImpl.create(cameraInfo, result -> {}); + Long filteredCameraInfoId = instanceManager.getIdentifierForStrongReference(cameraInfo); + filteredCameraInfosIds.add(filteredCameraInfoId); + } + + return filteredCameraInfosIds; + } +} diff --git a/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraXProxy.java b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraXProxy.java new file mode 100644 index 000000000000..8063866d2fc6 --- /dev/null +++ b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/CameraXProxy.java @@ -0,0 +1,13 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package io.flutter.plugins.camerax; + +import androidx.camera.core.CameraSelector; + +public class CameraXProxy { + public CameraSelector.Builder createCameraSelectorBuilder() { + return new CameraSelector.Builder(); + } +} diff --git a/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/GeneratedCameraXLibrary.java b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/GeneratedCameraXLibrary.java index ec3b81a8e9d8..041564c3bfcb 100644 --- a/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/GeneratedCameraXLibrary.java +++ b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/GeneratedCameraXLibrary.java @@ -8,6 +8,7 @@ import android.util.Log; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import io.flutter.plugin.common.BasicMessageChannel; import io.flutter.plugin.common.BinaryMessenger; import io.flutter.plugin.common.MessageCodec; @@ -15,11 +16,19 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; +import java.util.List; import java.util.Map; /** Generated class from Pigeon. */ @SuppressWarnings({"unused", "unchecked", "CodeBlock2Expr", "RedundantSuppression"}) public class GeneratedCameraXLibrary { + + public interface Result { + void success(T result); + + void error(Throwable error); + } + private static class JavaObjectHostApiCodec extends StandardMessageCodec { public static final JavaObjectHostApiCodec INSTANCE = new JavaObjectHostApiCodec(); @@ -187,6 +196,255 @@ public void create(@NonNull Long identifierArg, Reply callback) { } } + private static class CameraSelectorHostApiCodec extends StandardMessageCodec { + public static final CameraSelectorHostApiCodec INSTANCE = new CameraSelectorHostApiCodec(); + + private CameraSelectorHostApiCodec() {} + } + + /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ + public interface CameraSelectorHostApi { + void create(@NonNull Long identifier, @Nullable Long lensFacing); + + @NonNull + List filter(@NonNull Long identifier, @NonNull List cameraInfoIds); + + /** The codec used by CameraSelectorHostApi. */ + static MessageCodec getCodec() { + return CameraSelectorHostApiCodec.INSTANCE; + } + + /** + * Sets up an instance of `CameraSelectorHostApi` to handle messages through the + * `binaryMessenger`. + */ + static void setup(BinaryMessenger binaryMessenger, CameraSelectorHostApi api) { + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, "dev.flutter.pigeon.CameraSelectorHostApi.create", getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + Map wrapped = new HashMap<>(); + try { + ArrayList args = (ArrayList) message; + Number identifierArg = (Number) args.get(0); + if (identifierArg == null) { + throw new NullPointerException("identifierArg unexpectedly null."); + } + Number lensFacingArg = (Number) args.get(1); + api.create( + (identifierArg == null) ? null : identifierArg.longValue(), + (lensFacingArg == null) ? null : lensFacingArg.longValue()); + wrapped.put("result", null); + } catch (Error | RuntimeException exception) { + wrapped.put("error", wrapError(exception)); + } + reply.reply(wrapped); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, "dev.flutter.pigeon.CameraSelectorHostApi.filter", getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + Map wrapped = new HashMap<>(); + try { + ArrayList args = (ArrayList) message; + Number identifierArg = (Number) args.get(0); + if (identifierArg == null) { + throw new NullPointerException("identifierArg unexpectedly null."); + } + List cameraInfoIdsArg = (List) args.get(1); + if (cameraInfoIdsArg == null) { + throw new NullPointerException("cameraInfoIdsArg unexpectedly null."); + } + List output = + api.filter( + (identifierArg == null) ? null : identifierArg.longValue(), + cameraInfoIdsArg); + wrapped.put("result", output); + } catch (Error | RuntimeException exception) { + wrapped.put("error", wrapError(exception)); + } + reply.reply(wrapped); + }); + } else { + channel.setMessageHandler(null); + } + } + } + } + + private static class CameraSelectorFlutterApiCodec extends StandardMessageCodec { + public static final CameraSelectorFlutterApiCodec INSTANCE = + new CameraSelectorFlutterApiCodec(); + + private CameraSelectorFlutterApiCodec() {} + } + + /** Generated class from Pigeon that represents Flutter messages that can be called from Java. */ + public static class CameraSelectorFlutterApi { + private final BinaryMessenger binaryMessenger; + + public CameraSelectorFlutterApi(BinaryMessenger argBinaryMessenger) { + this.binaryMessenger = argBinaryMessenger; + } + + public interface Reply { + void reply(T reply); + } + + static MessageCodec getCodec() { + return CameraSelectorFlutterApiCodec.INSTANCE; + } + + public void create( + @NonNull Long identifierArg, @Nullable Long lensFacingArg, Reply callback) { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, "dev.flutter.pigeon.CameraSelectorFlutterApi.create", getCodec()); + channel.send( + new ArrayList(Arrays.asList(identifierArg, lensFacingArg)), + channelReply -> { + callback.reply(null); + }); + } + } + + private static class ProcessCameraProviderHostApiCodec extends StandardMessageCodec { + public static final ProcessCameraProviderHostApiCodec INSTANCE = + new ProcessCameraProviderHostApiCodec(); + + private ProcessCameraProviderHostApiCodec() {} + } + + /** Generated interface from Pigeon that represents a handler of messages from Flutter. */ + public interface ProcessCameraProviderHostApi { + void getInstance(Result result); + + @NonNull + List getAvailableCameraInfos(@NonNull Long identifier); + + /** The codec used by ProcessCameraProviderHostApi. */ + static MessageCodec getCodec() { + return ProcessCameraProviderHostApiCodec.INSTANCE; + } + + /** + * Sets up an instance of `ProcessCameraProviderHostApi` to handle messages through the + * `binaryMessenger`. + */ + static void setup(BinaryMessenger binaryMessenger, ProcessCameraProviderHostApi api) { + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.ProcessCameraProviderHostApi.getInstance", + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + Map wrapped = new HashMap<>(); + try { + Result resultCallback = + new Result() { + public void success(Long result) { + wrapped.put("result", result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + wrapped.put("error", wrapError(error)); + reply.reply(wrapped); + } + }; + + api.getInstance(resultCallback); + } catch (Error | RuntimeException exception) { + wrapped.put("error", wrapError(exception)); + reply.reply(wrapped); + } + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.ProcessCameraProviderHostApi.getAvailableCameraInfos", + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + Map wrapped = new HashMap<>(); + try { + ArrayList args = (ArrayList) message; + Number identifierArg = (Number) args.get(0); + if (identifierArg == null) { + throw new NullPointerException("identifierArg unexpectedly null."); + } + List output = + api.getAvailableCameraInfos( + (identifierArg == null) ? null : identifierArg.longValue()); + wrapped.put("result", output); + } catch (Error | RuntimeException exception) { + wrapped.put("error", wrapError(exception)); + } + reply.reply(wrapped); + }); + } else { + channel.setMessageHandler(null); + } + } + } + } + + private static class ProcessCameraProviderFlutterApiCodec extends StandardMessageCodec { + public static final ProcessCameraProviderFlutterApiCodec INSTANCE = + new ProcessCameraProviderFlutterApiCodec(); + + private ProcessCameraProviderFlutterApiCodec() {} + } + + /** Generated class from Pigeon that represents Flutter messages that can be called from Java. */ + public static class ProcessCameraProviderFlutterApi { + private final BinaryMessenger binaryMessenger; + + public ProcessCameraProviderFlutterApi(BinaryMessenger argBinaryMessenger) { + this.binaryMessenger = argBinaryMessenger; + } + + public interface Reply { + void reply(T reply); + } + + static MessageCodec getCodec() { + return ProcessCameraProviderFlutterApiCodec.INSTANCE; + } + + public void create(@NonNull Long identifierArg, Reply callback) { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.ProcessCameraProviderFlutterApi.create", + getCodec()); + channel.send( + new ArrayList(Arrays.asList(identifierArg)), + channelReply -> { + callback.reply(null); + }); + } + } + private static Map wrapError(Throwable exception) { Map errorMap = new HashMap<>(); errorMap.put("message", exception.toString()); diff --git a/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/InstanceManager.java b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/InstanceManager.java index 8981227073b5..9b549d7bd1ea 100644 --- a/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/InstanceManager.java +++ b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/InstanceManager.java @@ -122,11 +122,16 @@ public void addDartCreatedInstance(Object instance, long identifier) { /** * Adds a new instance that was instantiated from the host platform. * + *

If an instance has already been added, the identifier of the instance will be returned. + * * @param instance the instance to be stored. * @return the unique identifier stored with instance. */ public long addHostCreatedInstance(Object instance) { assertManagerIsNotClosed(); + if (containsInstance(instance)) { + return getIdentifierForStrongReference(instance); + } final long identifier = nextIdentifier++; addInstance(instance, identifier); return identifier; diff --git a/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/ProcessCameraProviderFlutterApiImpl.java b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/ProcessCameraProviderFlutterApiImpl.java new file mode 100644 index 000000000000..90c94d0c26cb --- /dev/null +++ b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/ProcessCameraProviderFlutterApiImpl.java @@ -0,0 +1,23 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package io.flutter.plugins.camerax; + +import androidx.camera.lifecycle.ProcessCameraProvider; +import io.flutter.plugin.common.BinaryMessenger; +import io.flutter.plugins.camerax.GeneratedCameraXLibrary.ProcessCameraProviderFlutterApi; + +public class ProcessCameraProviderFlutterApiImpl extends ProcessCameraProviderFlutterApi { + public ProcessCameraProviderFlutterApiImpl( + BinaryMessenger binaryMessenger, InstanceManager instanceManager) { + super(binaryMessenger); + this.instanceManager = instanceManager; + } + + private final InstanceManager instanceManager; + + void create(ProcessCameraProvider processCameraProvider, Reply reply) { + create(instanceManager.addHostCreatedInstance(processCameraProvider), reply); + } +} diff --git a/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/ProcessCameraProviderHostApiImpl.java b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/ProcessCameraProviderHostApiImpl.java new file mode 100644 index 000000000000..19c5eb5b3f70 --- /dev/null +++ b/packages/camera/camera_android_camerax/android/src/main/java/io/flutter/plugins/camerax/ProcessCameraProviderHostApiImpl.java @@ -0,0 +1,87 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package io.flutter.plugins.camerax; + +import android.content.Context; +import androidx.annotation.NonNull; +import androidx.camera.core.CameraInfo; +import androidx.camera.lifecycle.ProcessCameraProvider; +import androidx.core.content.ContextCompat; +import com.google.common.util.concurrent.ListenableFuture; +import io.flutter.plugin.common.BinaryMessenger; +import io.flutter.plugins.camerax.GeneratedCameraXLibrary.ProcessCameraProviderHostApi; +import java.util.ArrayList; +import java.util.List; + +public class ProcessCameraProviderHostApiImpl implements ProcessCameraProviderHostApi { + private final BinaryMessenger binaryMessenger; + private final InstanceManager instanceManager; + + private Context context; + + public ProcessCameraProviderHostApiImpl( + BinaryMessenger binaryMessenger, InstanceManager instanceManager, Context context) { + this.binaryMessenger = binaryMessenger; + this.instanceManager = instanceManager; + this.context = context; + } + + /** + * Sets the context that the {@code ProcessCameraProvider} will use to attach the lifecycle of the + * camera to. + * + *

If using the camera plugin in an add-to-app context, ensure that a new instance of the + * {@code ProcessCameraProvider} is fetched via {@code #getInstance} anytime the context changes. + */ + public void setContext(Context context) { + this.context = context; + } + + /** + * Returns the instance of the ProcessCameraProvider to manage the lifecycle of the camera for the + * current {@code Context}. + */ + @Override + public void getInstance(GeneratedCameraXLibrary.Result result) { + ListenableFuture processCameraProviderFuture = + ProcessCameraProvider.getInstance(context); + + processCameraProviderFuture.addListener( + () -> { + try { + // Camera provider is now guaranteed to be available. + ProcessCameraProvider processCameraProvider = processCameraProviderFuture.get(); + + if (!instanceManager.containsInstance(processCameraProvider)) { + final ProcessCameraProviderFlutterApiImpl flutterApi = + new ProcessCameraProviderFlutterApiImpl(binaryMessenger, instanceManager); + flutterApi.create(processCameraProvider, reply -> {}); + } + result.success(instanceManager.getIdentifierForStrongReference(processCameraProvider)); + } catch (Exception e) { + result.error(e); + } + }, + ContextCompat.getMainExecutor(context)); + } + + /** Returns cameras available to the ProcessCameraProvider. */ + @Override + public List getAvailableCameraInfos(@NonNull Long identifier) { + ProcessCameraProvider processCameraProvider = + (ProcessCameraProvider) instanceManager.getInstance(identifier); + + List availableCameras = processCameraProvider.getAvailableCameraInfos(); + List availableCamerasIds = new ArrayList(); + final CameraInfoFlutterApiImpl cameraInfoFlutterApi = + new CameraInfoFlutterApiImpl(binaryMessenger, instanceManager); + + for (CameraInfo cameraInfo : availableCameras) { + cameraInfoFlutterApi.create(cameraInfo, result -> {}); + availableCamerasIds.add(instanceManager.getIdentifierForStrongReference(cameraInfo)); + } + return availableCamerasIds; + } +} diff --git a/packages/camera/camera_android_camerax/android/src/test/java/io/flutter/plugins/camerax/CameraSelectorTest.java b/packages/camera/camera_android_camerax/android/src/test/java/io/flutter/plugins/camerax/CameraSelectorTest.java new file mode 100644 index 000000000000..2b27e08b5790 --- /dev/null +++ b/packages/camera/camera_android_camerax/android/src/test/java/io/flutter/plugins/camerax/CameraSelectorTest.java @@ -0,0 +1,97 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package io.flutter.plugins.camerax; + +import static org.junit.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import androidx.camera.core.CameraInfo; +import androidx.camera.core.CameraSelector; +import io.flutter.plugin.common.BinaryMessenger; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; + +public class CameraSelectorTest { + @Rule public MockitoRule mockitoRule = MockitoJUnit.rule(); + + @Mock public CameraSelector mockCameraSelector; + @Mock public BinaryMessenger mockBinaryMessenger; + + InstanceManager testInstanceManager; + + @Before + public void setUp() { + testInstanceManager = InstanceManager.open(identifier -> {}); + } + + @After + public void tearDown() { + testInstanceManager.close(); + } + + @Test + public void createTest() { + final CameraSelectorHostApiImpl cameraSelectorHostApi = + new CameraSelectorHostApiImpl(mockBinaryMessenger, testInstanceManager); + final CameraXProxy mockCameraXProxy = mock(CameraXProxy.class); + final CameraSelector.Builder mockCameraSelectorBuilder = mock(CameraSelector.Builder.class); + + cameraSelectorHostApi.cameraXProxy = mockCameraXProxy; + when(mockCameraXProxy.createCameraSelectorBuilder()).thenReturn(mockCameraSelectorBuilder); + + when(mockCameraSelectorBuilder.requireLensFacing(1)).thenReturn(mockCameraSelectorBuilder); + when(mockCameraSelectorBuilder.build()).thenReturn(mockCameraSelector); + + cameraSelectorHostApi.create(0L, 1L); + + verify(mockCameraSelectorBuilder).requireLensFacing(CameraSelector.LENS_FACING_BACK); + assertEquals(testInstanceManager.getInstance(0L), mockCameraSelector); + } + + @Test + public void filterTest() { + final CameraSelectorHostApiImpl cameraSelectorHostApi = + new CameraSelectorHostApiImpl(mockBinaryMessenger, testInstanceManager); + final CameraInfo cameraInfo = mock(CameraInfo.class); + final List cameraInfosForFilter = Arrays.asList(cameraInfo); + final List cameraInfosIds = Arrays.asList(1L); + + testInstanceManager.addDartCreatedInstance(mockCameraSelector, 0); + testInstanceManager.addDartCreatedInstance(cameraInfo, 1); + + when(mockCameraSelector.filter(cameraInfosForFilter)).thenReturn(cameraInfosForFilter); + + assertEquals( + cameraSelectorHostApi.filter(0L, cameraInfosIds), + Arrays.asList(testInstanceManager.getIdentifierForStrongReference(cameraInfo))); + verify(mockCameraSelector).filter(cameraInfosForFilter); + } + + @Test + public void flutterApiCreateTest() { + final CameraSelectorFlutterApiImpl spyFlutterApi = + spy(new CameraSelectorFlutterApiImpl(mockBinaryMessenger, testInstanceManager)); + + spyFlutterApi.create(mockCameraSelector, 0L, reply -> {}); + + final long identifier = + Objects.requireNonNull( + testInstanceManager.getIdentifierForStrongReference(mockCameraSelector)); + verify(spyFlutterApi).create(eq(identifier), eq(0L), any()); + } +} diff --git a/packages/camera/camera_android_camerax/android/src/test/java/io/flutter/plugins/camerax/ProcessCameraProviderTest.java b/packages/camera/camera_android_camerax/android/src/test/java/io/flutter/plugins/camerax/ProcessCameraProviderTest.java new file mode 100644 index 000000000000..5008e4ef34b0 --- /dev/null +++ b/packages/camera/camera_android_camerax/android/src/test/java/io/flutter/plugins/camerax/ProcessCameraProviderTest.java @@ -0,0 +1,114 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package io.flutter.plugins.camerax; + +import static org.junit.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.content.Context; +import androidx.camera.core.CameraInfo; +import androidx.camera.lifecycle.ProcessCameraProvider; +import androidx.test.core.app.ApplicationProvider; +import com.google.common.util.concurrent.Futures; +import com.google.common.util.concurrent.ListenableFuture; +import io.flutter.plugin.common.BinaryMessenger; +import java.util.Arrays; +import java.util.Objects; +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Mock; +import org.mockito.MockedStatic; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; +import org.mockito.stubbing.Answer; +import org.robolectric.RobolectricTestRunner; + +@RunWith(RobolectricTestRunner.class) +public class ProcessCameraProviderTest { + @Rule public MockitoRule mockitoRule = MockitoJUnit.rule(); + + @Mock public ProcessCameraProvider processCameraProvider; + @Mock public BinaryMessenger mockBinaryMessenger; + + InstanceManager testInstanceManager; + private Context context; + + @Before + public void setUp() { + testInstanceManager = InstanceManager.open(identifier -> {}); + context = ApplicationProvider.getApplicationContext(); + } + + @After + public void tearDown() { + testInstanceManager.close(); + } + + @Test + public void getInstanceTest() { + final ProcessCameraProviderHostApiImpl processCameraProviderHostApi = + new ProcessCameraProviderHostApiImpl(mockBinaryMessenger, testInstanceManager, context); + final ListenableFuture processCameraProviderFuture = + spy(Futures.immediateFuture(processCameraProvider)); + final GeneratedCameraXLibrary.Result mockResult = + mock(GeneratedCameraXLibrary.Result.class); + + testInstanceManager.addDartCreatedInstance(processCameraProvider, 0); + + try (MockedStatic mockedProcessCameraProvider = + Mockito.mockStatic(ProcessCameraProvider.class)) { + mockedProcessCameraProvider + .when(() -> ProcessCameraProvider.getInstance(context)) + .thenAnswer( + (Answer>) + invocation -> processCameraProviderFuture); + + final ArgumentCaptor runnableCaptor = ArgumentCaptor.forClass(Runnable.class); + + processCameraProviderHostApi.getInstance(mockResult); + verify(processCameraProviderFuture).addListener(runnableCaptor.capture(), any()); + runnableCaptor.getValue().run(); + verify(mockResult).success(0L); + } + } + + @Test + public void getAvailableCameraInfosTest() { + final ProcessCameraProviderHostApiImpl processCameraProviderHostApi = + new ProcessCameraProviderHostApiImpl(mockBinaryMessenger, testInstanceManager, context); + final CameraInfo mockCameraInfo = mock(CameraInfo.class); + + testInstanceManager.addDartCreatedInstance(processCameraProvider, 0); + testInstanceManager.addDartCreatedInstance(mockCameraInfo, 1); + + when(processCameraProvider.getAvailableCameraInfos()).thenReturn(Arrays.asList(mockCameraInfo)); + + assertEquals(processCameraProviderHostApi.getAvailableCameraInfos(0L), Arrays.asList(1L)); + verify(processCameraProvider).getAvailableCameraInfos(); + } + + @Test + public void flutterApiCreateTest() { + final ProcessCameraProviderFlutterApiImpl spyFlutterApi = + spy(new ProcessCameraProviderFlutterApiImpl(mockBinaryMessenger, testInstanceManager)); + + spyFlutterApi.create(processCameraProvider, reply -> {}); + + final long identifier = + Objects.requireNonNull( + testInstanceManager.getIdentifierForStrongReference(processCameraProvider)); + verify(spyFlutterApi).create(eq(identifier), any()); + } +} diff --git a/packages/camera/camera_android_camerax/example/pubspec.yaml b/packages/camera/camera_android_camerax/example/pubspec.yaml index 2884e8685d8c..d9756f7ebd9b 100644 --- a/packages/camera/camera_android_camerax/example/pubspec.yaml +++ b/packages/camera/camera_android_camerax/example/pubspec.yaml @@ -14,6 +14,7 @@ dependencies: # The example app is bundled with the plugin so we use a path dependency on # the parent directory to use the current plugin's version. path: ../ + camera_platform_interface: ^2.2.0 flutter: sdk: flutter @@ -25,4 +26,3 @@ dev_dependencies: flutter: uses-material-design: true - \ No newline at end of file diff --git a/packages/camera/camera_android_camerax/lib/src/android_camera_camerax_flutter_api_impls.dart b/packages/camera/camera_android_camerax/lib/src/android_camera_camerax_flutter_api_impls.dart index 8190a1ce1161..9c6564a06c08 100644 --- a/packages/camera/camera_android_camerax/lib/src/android_camera_camerax_flutter_api_impls.dart +++ b/packages/camera/camera_android_camerax/lib/src/android_camera_camerax_flutter_api_impls.dart @@ -3,8 +3,10 @@ // found in the LICENSE file. import 'camera_info.dart'; +import 'camera_selector.dart'; import 'camerax_library.pigeon.dart'; import 'java_object.dart'; +import 'process_camera_provider.dart'; /// Handles initialization of Flutter APIs for the Android CameraX library. class AndroidCameraXCameraFlutterApis { @@ -12,11 +14,17 @@ class AndroidCameraXCameraFlutterApis { AndroidCameraXCameraFlutterApis({ JavaObjectFlutterApiImpl? javaObjectFlutterApi, CameraInfoFlutterApiImpl? cameraInfoFlutterApi, + CameraSelectorFlutterApiImpl? cameraSelectorFlutterApi, + ProcessCameraProviderFlutterApiImpl? processCameraProviderFlutterApi, }) { this.javaObjectFlutterApi = javaObjectFlutterApi ?? JavaObjectFlutterApiImpl(); this.cameraInfoFlutterApi = cameraInfoFlutterApi ?? CameraInfoFlutterApiImpl(); + this.cameraSelectorFlutterApi = + cameraSelectorFlutterApi ?? CameraSelectorFlutterApiImpl(); + this.processCameraProviderFlutterApi = processCameraProviderFlutterApi ?? + ProcessCameraProviderFlutterApiImpl(); } static bool _haveBeenSetUp = false; @@ -33,11 +41,20 @@ class AndroidCameraXCameraFlutterApis { /// Flutter Api for [CameraInfo]. late final CameraInfoFlutterApiImpl cameraInfoFlutterApi; + /// Flutter Api for [CameraSelector]. + late final CameraSelectorFlutterApiImpl cameraSelectorFlutterApi; + + /// Flutter Api for [ProcessCameraProvider]. + late final ProcessCameraProviderFlutterApiImpl + processCameraProviderFlutterApi; + /// Ensures all the Flutter APIs have been setup to receive calls from native code. void ensureSetUp() { if (!_haveBeenSetUp) { JavaObjectFlutterApi.setup(javaObjectFlutterApi); CameraInfoFlutterApi.setup(cameraInfoFlutterApi); + CameraSelectorFlutterApi.setup(cameraSelectorFlutterApi); + ProcessCameraProviderFlutterApi.setup(processCameraProviderFlutterApi); _haveBeenSetUp = true; } } diff --git a/packages/camera/camera_android_camerax/lib/src/camera_info.dart b/packages/camera/camera_android_camerax/lib/src/camera_info.dart index 3edc7b4afad2..d03426f40027 100644 --- a/packages/camera/camera_android_camerax/lib/src/camera_info.dart +++ b/packages/camera/camera_android_camerax/lib/src/camera_info.dart @@ -20,9 +20,7 @@ class CameraInfo extends JavaObject { binaryMessenger: binaryMessenger, instanceManager: instanceManager) { _api = CameraInfoHostApiImpl( - binaryMessenger: binaryMessenger, - instanceManager: instanceManager, - ); + binaryMessenger: binaryMessenger, instanceManager: instanceManager); AndroidCameraXCameraFlutterApis.instance.ensureSetUp(); } @@ -36,23 +34,18 @@ class CameraInfo extends JavaObject { /// Host API implementation of [CameraInfo]. class CameraInfoHostApiImpl extends CameraInfoHostApi { /// Constructs a [CameraInfoHostApiImpl]. - CameraInfoHostApiImpl({ - this.binaryMessenger, - InstanceManager? instanceManager, - }) : instanceManager = instanceManager ?? JavaObject.globalInstanceManager, - super(binaryMessenger: binaryMessenger); - - /// Sends binary data across the Flutter platform barrier. - /// - /// If it is null, the default BinaryMessenger will be used which routes to - /// the host platform. - final BinaryMessenger? binaryMessenger; + CameraInfoHostApiImpl( + {super.binaryMessenger, InstanceManager? instanceManager}) { + this.instanceManager = instanceManager ?? JavaObject.globalInstanceManager; + } /// Maintains instances stored to communicate with native language objects. - final InstanceManager instanceManager; + late final InstanceManager instanceManager; /// Gets sensor orientation degrees of [CameraInfo]. - Future getSensorRotationDegreesFromInstance(CameraInfo instance) async { + Future getSensorRotationDegreesFromInstance( + CameraInfo instance, + ) async { final int sensorRotationDegrees = await getSensorRotationDegrees( instanceManager.getIdentifier(instance)!); return sensorRotationDegrees; diff --git a/packages/camera/camera_android_camerax/lib/src/camera_selector.dart b/packages/camera/camera_android_camerax/lib/src/camera_selector.dart new file mode 100644 index 000000000000..dd08b9bc571d --- /dev/null +++ b/packages/camera/camera_android_camerax/lib/src/camera_selector.dart @@ -0,0 +1,177 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/services.dart'; + +import 'android_camera_camerax_flutter_api_impls.dart'; +import 'camera_info.dart'; +import 'camerax_library.pigeon.dart'; +import 'instance_manager.dart'; +import 'java_object.dart'; + +/// Selects a camera for use. +/// +/// See https://developer.android.com/reference/androidx/camera/core/CameraSelector. +class CameraSelector extends JavaObject { + /// Creates a [CameraSelector]. + CameraSelector( + {BinaryMessenger? binaryMessenger, + InstanceManager? instanceManager, + this.lensFacing}) + : super.detached( + binaryMessenger: binaryMessenger, + instanceManager: instanceManager) { + _api = CameraSelectorHostApiImpl( + binaryMessenger: binaryMessenger, instanceManager: instanceManager); + AndroidCameraXCameraFlutterApis.instance.ensureSetUp(); + _api.createFromInstance(this, lensFacing); + } + + /// Creates a detached [CameraSelector]. + CameraSelector.detached( + {BinaryMessenger? binaryMessenger, + InstanceManager? instanceManager, + this.lensFacing}) + : super.detached( + binaryMessenger: binaryMessenger, + instanceManager: instanceManager) { + _api = CameraSelectorHostApiImpl( + binaryMessenger: binaryMessenger, instanceManager: instanceManager); + AndroidCameraXCameraFlutterApis.instance.ensureSetUp(); + } + + late final CameraSelectorHostApiImpl _api; + + /// ID for front facing lens. + static const int LENS_FACING_FRONT = 0; + + /// ID for back facing lens. + static const int LENS_FACING_BACK = 1; + + /// Selector for default front facing camera. + static CameraSelector getDefaultFrontCamera({ + BinaryMessenger? binaryMessenger, + InstanceManager? instanceManager, + }) { + return CameraSelector( + binaryMessenger: binaryMessenger, + instanceManager: instanceManager, + lensFacing: LENS_FACING_FRONT, + ); + } + + /// Selector for default back facing camera. + static CameraSelector getDefaultBackCamera({ + BinaryMessenger? binaryMessenger, + InstanceManager? instanceManager, + }) { + return CameraSelector( + binaryMessenger: binaryMessenger, + instanceManager: instanceManager, + lensFacing: LENS_FACING_BACK, + ); + } + + /// Lens direction of this selector. + final int? lensFacing; + + /// Filters available cameras based on provided [CameraInfo]s. + Future> filter(List cameraInfos) { + return _api.filterFromInstance(this, cameraInfos); + } +} + +/// Host API implementation of [CameraSelector]. +class CameraSelectorHostApiImpl extends CameraSelectorHostApi { + /// Constructs a [CameraSelectorHostApiImpl]. + CameraSelectorHostApiImpl( + {this.binaryMessenger, InstanceManager? instanceManager}) + : super(binaryMessenger: binaryMessenger) { + this.instanceManager = instanceManager ?? JavaObject.globalInstanceManager; + } + + /// Receives binary data across the Flutter platform barrier. + /// + /// If it is null, the default BinaryMessenger will be used which routes to + /// the host platform. + final BinaryMessenger? binaryMessenger; + + /// Maintains instances stored to communicate with native language objects. + late final InstanceManager instanceManager; + + /// Creates a [CameraSelector] with the lens direction provided if specified. + void createFromInstance(CameraSelector instance, int? lensFacing) { + int? identifier = instanceManager.getIdentifier(instance); + identifier ??= instanceManager.addDartCreatedInstance(instance, + onCopy: (CameraSelector original) { + return CameraSelector.detached( + binaryMessenger: binaryMessenger, + instanceManager: instanceManager, + lensFacing: original.lensFacing); + }); + + create(identifier, lensFacing); + } + + /// Filters a list of [CameraInfo]s based on the [CameraSelector]. + Future> filterFromInstance( + CameraSelector instance, + List cameraInfos, + ) async { + int? identifier = instanceManager.getIdentifier(instance); + identifier ??= instanceManager.addDartCreatedInstance(instance, + onCopy: (CameraSelector original) { + return CameraSelector.detached( + binaryMessenger: binaryMessenger, + instanceManager: instanceManager, + lensFacing: original.lensFacing); + }); + + final List cameraInfoIds = (cameraInfos.map( + (CameraInfo info) => instanceManager.getIdentifier(info)!)).toList(); + final List filteredCameraInfoIds = + await filter(identifier, cameraInfoIds); + if (filteredCameraInfoIds.isEmpty) { + return []; + } + return (filteredCameraInfoIds.map((int? id) => + instanceManager.getInstanceWithWeakReference(id!)! as CameraInfo)) + .toList(); + } +} + +/// Flutter API implementation of [CameraSelector]. +class CameraSelectorFlutterApiImpl implements CameraSelectorFlutterApi { + /// Constructs a [CameraSelectorFlutterApiImpl]. + CameraSelectorFlutterApiImpl({ + this.binaryMessenger, + InstanceManager? instanceManager, + }) : instanceManager = instanceManager ?? JavaObject.globalInstanceManager; + + /// Receives binary data across the Flutter platform barrier. + /// + /// If it is null, the default BinaryMessenger will be used which routes to + /// the host platform. + final BinaryMessenger? binaryMessenger; + + /// Maintains instances stored to communicate with native language objects. + final InstanceManager instanceManager; + + @override + void create(int identifier, int? lensFacing) { + instanceManager.addHostCreatedInstance( + CameraSelector.detached( + binaryMessenger: binaryMessenger, + instanceManager: instanceManager, + lensFacing: lensFacing), + identifier, + onCopy: (CameraSelector original) { + return CameraSelector.detached( + binaryMessenger: binaryMessenger, + instanceManager: instanceManager, + lensFacing: original.lensFacing); + }, + ); + } +} diff --git a/packages/camera/camera_android_camerax/lib/src/camerax_library.pigeon.dart b/packages/camera/camera_android_camerax/lib/src/camerax_library.pigeon.dart index 8d421836a587..c0b052378def 100644 --- a/packages/camera/camera_android_camerax/lib/src/camerax_library.pigeon.dart +++ b/packages/camera/camera_android_camerax/lib/src/camerax_library.pigeon.dart @@ -158,3 +158,217 @@ abstract class CameraInfoFlutterApi { } } } + +class _CameraSelectorHostApiCodec extends StandardMessageCodec { + const _CameraSelectorHostApiCodec(); +} + +class CameraSelectorHostApi { + /// Constructor for [CameraSelectorHostApi]. The [binaryMessenger] named argument is + /// available for dependency injection. If it is left null, the default + /// BinaryMessenger will be used which routes to the host platform. + CameraSelectorHostApi({BinaryMessenger? binaryMessenger}) + : _binaryMessenger = binaryMessenger; + + final BinaryMessenger? _binaryMessenger; + + static const MessageCodec codec = _CameraSelectorHostApiCodec(); + + Future create(int arg_identifier, int? arg_lensFacing) async { + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.CameraSelectorHostApi.create', codec, + binaryMessenger: _binaryMessenger); + final Map? replyMap = + await channel.send([arg_identifier, arg_lensFacing]) + as Map?; + if (replyMap == null) { + throw PlatformException( + code: 'channel-error', + message: 'Unable to establish connection on channel.', + ); + } else if (replyMap['error'] != null) { + final Map error = + (replyMap['error'] as Map?)!; + throw PlatformException( + code: (error['code'] as String?)!, + message: error['message'] as String?, + details: error['details'], + ); + } else { + return; + } + } + + Future> filter( + int arg_identifier, List arg_cameraInfoIds) async { + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.CameraSelectorHostApi.filter', codec, + binaryMessenger: _binaryMessenger); + final Map? replyMap = + await channel.send([arg_identifier, arg_cameraInfoIds]) + as Map?; + if (replyMap == null) { + throw PlatformException( + code: 'channel-error', + message: 'Unable to establish connection on channel.', + ); + } else if (replyMap['error'] != null) { + final Map error = + (replyMap['error'] as Map?)!; + throw PlatformException( + code: (error['code'] as String?)!, + message: error['message'] as String?, + details: error['details'], + ); + } else if (replyMap['result'] == null) { + throw PlatformException( + code: 'null-error', + message: 'Host platform returned null value for non-null return value.', + ); + } else { + return (replyMap['result'] as List?)!.cast(); + } + } +} + +class _CameraSelectorFlutterApiCodec extends StandardMessageCodec { + const _CameraSelectorFlutterApiCodec(); +} + +abstract class CameraSelectorFlutterApi { + static const MessageCodec codec = _CameraSelectorFlutterApiCodec(); + + void create(int identifier, int? lensFacing); + static void setup(CameraSelectorFlutterApi? api, + {BinaryMessenger? binaryMessenger}) { + { + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.CameraSelectorFlutterApi.create', codec, + binaryMessenger: binaryMessenger); + if (api == null) { + channel.setMessageHandler(null); + } else { + channel.setMessageHandler((Object? message) async { + assert(message != null, + 'Argument for dev.flutter.pigeon.CameraSelectorFlutterApi.create was null.'); + final List args = (message as List?)!; + final int? arg_identifier = (args[0] as int?); + assert(arg_identifier != null, + 'Argument for dev.flutter.pigeon.CameraSelectorFlutterApi.create was null, expected non-null int.'); + final int? arg_lensFacing = (args[1] as int?); + api.create(arg_identifier!, arg_lensFacing); + return; + }); + } + } + } +} + +class _ProcessCameraProviderHostApiCodec extends StandardMessageCodec { + const _ProcessCameraProviderHostApiCodec(); +} + +class ProcessCameraProviderHostApi { + /// Constructor for [ProcessCameraProviderHostApi]. The [binaryMessenger] named argument is + /// available for dependency injection. If it is left null, the default + /// BinaryMessenger will be used which routes to the host platform. + ProcessCameraProviderHostApi({BinaryMessenger? binaryMessenger}) + : _binaryMessenger = binaryMessenger; + + final BinaryMessenger? _binaryMessenger; + + static const MessageCodec codec = + _ProcessCameraProviderHostApiCodec(); + + Future getInstance() async { + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.ProcessCameraProviderHostApi.getInstance', codec, + binaryMessenger: _binaryMessenger); + final Map? replyMap = + await channel.send(null) as Map?; + if (replyMap == null) { + throw PlatformException( + code: 'channel-error', + message: 'Unable to establish connection on channel.', + ); + } else if (replyMap['error'] != null) { + final Map error = + (replyMap['error'] as Map?)!; + throw PlatformException( + code: (error['code'] as String?)!, + message: error['message'] as String?, + details: error['details'], + ); + } else if (replyMap['result'] == null) { + throw PlatformException( + code: 'null-error', + message: 'Host platform returned null value for non-null return value.', + ); + } else { + return (replyMap['result'] as int?)!; + } + } + + Future> getAvailableCameraInfos(int arg_identifier) async { + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.ProcessCameraProviderHostApi.getAvailableCameraInfos', + codec, + binaryMessenger: _binaryMessenger); + final Map? replyMap = + await channel.send([arg_identifier]) as Map?; + if (replyMap == null) { + throw PlatformException( + code: 'channel-error', + message: 'Unable to establish connection on channel.', + ); + } else if (replyMap['error'] != null) { + final Map error = + (replyMap['error'] as Map?)!; + throw PlatformException( + code: (error['code'] as String?)!, + message: error['message'] as String?, + details: error['details'], + ); + } else if (replyMap['result'] == null) { + throw PlatformException( + code: 'null-error', + message: 'Host platform returned null value for non-null return value.', + ); + } else { + return (replyMap['result'] as List?)!.cast(); + } + } +} + +class _ProcessCameraProviderFlutterApiCodec extends StandardMessageCodec { + const _ProcessCameraProviderFlutterApiCodec(); +} + +abstract class ProcessCameraProviderFlutterApi { + static const MessageCodec codec = + _ProcessCameraProviderFlutterApiCodec(); + + void create(int identifier); + static void setup(ProcessCameraProviderFlutterApi? api, + {BinaryMessenger? binaryMessenger}) { + { + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.ProcessCameraProviderFlutterApi.create', codec, + binaryMessenger: binaryMessenger); + if (api == null) { + channel.setMessageHandler(null); + } else { + channel.setMessageHandler((Object? message) async { + assert(message != null, + 'Argument for dev.flutter.pigeon.ProcessCameraProviderFlutterApi.create was null.'); + final List args = (message as List?)!; + final int? arg_identifier = (args[0] as int?); + assert(arg_identifier != null, + 'Argument for dev.flutter.pigeon.ProcessCameraProviderFlutterApi.create was null, expected non-null int.'); + api.create(arg_identifier!); + return; + }); + } + } + } +} diff --git a/packages/camera/camera_android_camerax/lib/src/process_camera_provider.dart b/packages/camera/camera_android_camerax/lib/src/process_camera_provider.dart new file mode 100644 index 000000000000..e2b588d15faa --- /dev/null +++ b/packages/camera/camera_android_camerax/lib/src/process_camera_provider.dart @@ -0,0 +1,119 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/services.dart'; + +import 'android_camera_camerax_flutter_api_impls.dart'; +import 'camera_info.dart'; +import 'camerax_library.pigeon.dart'; +import 'instance_manager.dart'; +import 'java_object.dart'; + +/// Provides an object to manage the camera. +/// +/// See https://developer.android.com/reference/androidx/camera/lifecycle/ProcessCameraProvider. +class ProcessCameraProvider extends JavaObject { + /// Creates a detached [ProcessCameraProvider]. + ProcessCameraProvider.detached( + {BinaryMessenger? binaryMessenger, InstanceManager? instanceManager}) + : super.detached( + binaryMessenger: binaryMessenger, + instanceManager: instanceManager) { + _api = ProcessCameraProviderHostApiImpl( + binaryMessenger: binaryMessenger, instanceManager: instanceManager); + AndroidCameraXCameraFlutterApis.instance.ensureSetUp(); + } + + late final ProcessCameraProviderHostApiImpl _api; + + /// Gets an instance of [ProcessCameraProvider]. + static Future getInstance( + {BinaryMessenger? binaryMessenger, InstanceManager? instanceManager}) { + AndroidCameraXCameraFlutterApis.instance.ensureSetUp(); + final ProcessCameraProviderHostApiImpl api = + ProcessCameraProviderHostApiImpl( + binaryMessenger: binaryMessenger, instanceManager: instanceManager); + + return api.getInstancefromInstances(); + } + + /// Retrieves the cameras available to the device. + Future> getAvailableCameraInfos() { + return _api.getAvailableCameraInfosFromInstances(this); + } +} + +/// Host API implementation of [ProcessCameraProvider]. +class ProcessCameraProviderHostApiImpl extends ProcessCameraProviderHostApi { + /// Creates a [ProcessCameraProviderHostApiImpl]. + ProcessCameraProviderHostApiImpl( + {this.binaryMessenger, InstanceManager? instanceManager}) + : super(binaryMessenger: binaryMessenger) { + this.instanceManager = instanceManager ?? JavaObject.globalInstanceManager; + } + + /// Receives binary data across the Flutter platform barrier. + /// + /// If it is null, the default BinaryMessenger will be used which routes to + /// the host platform. + final BinaryMessenger? binaryMessenger; + + /// Maintains instances stored to communicate with native language objects. + late final InstanceManager instanceManager; + + /// Retrieves an instance of a ProcessCameraProvider from the context of + /// the FlutterActivity. + Future getInstancefromInstances() async { + return instanceManager.getInstanceWithWeakReference(await getInstance())! + as ProcessCameraProvider; + } + + /// Retrives the list of CameraInfos corresponding to the available cameras. + Future> getAvailableCameraInfosFromInstances( + ProcessCameraProvider instance) async { + int? identifier = instanceManager.getIdentifier(instance); + identifier ??= instanceManager.addDartCreatedInstance(instance, + onCopy: (ProcessCameraProvider original) { + return ProcessCameraProvider.detached( + binaryMessenger: binaryMessenger, instanceManager: instanceManager); + }); + + final List cameraInfos = await getAvailableCameraInfos(identifier); + return (cameraInfos.map((int? id) => + instanceManager.getInstanceWithWeakReference(id!)! as CameraInfo)) + .toList(); + } +} + +/// Flutter API Implementation of [ProcessCameraProvider]. +class ProcessCameraProviderFlutterApiImpl + implements ProcessCameraProviderFlutterApi { + /// Constructs a [ProcessCameraProviderFlutterApiImpl]. + ProcessCameraProviderFlutterApiImpl({ + this.binaryMessenger, + InstanceManager? instanceManager, + }) : instanceManager = instanceManager ?? JavaObject.globalInstanceManager; + + /// Receives binary data across the Flutter platform barrier. + /// + /// If it is null, the default BinaryMessenger will be used which routes to + /// the host platform. + final BinaryMessenger? binaryMessenger; + + /// Maintains instances stored to communicate with native language objects. + final InstanceManager instanceManager; + + @override + void create(int identifier) { + instanceManager.addHostCreatedInstance( + ProcessCameraProvider.detached( + binaryMessenger: binaryMessenger, instanceManager: instanceManager), + identifier, + onCopy: (ProcessCameraProvider original) { + return ProcessCameraProvider.detached( + binaryMessenger: binaryMessenger, instanceManager: instanceManager); + }, + ); + } +} diff --git a/packages/camera/camera_android_camerax/pigeons/camerax_library.dart b/packages/camera/camera_android_camerax/pigeons/camerax_library.dart index d36634a9cac3..4d7d96910246 100644 --- a/packages/camera/camera_android_camerax/pigeons/camerax_library.dart +++ b/packages/camera/camera_android_camerax/pigeons/camerax_library.dart @@ -45,3 +45,28 @@ abstract class CameraInfoHostApi { abstract class CameraInfoFlutterApi { void create(int identifier); } + +@HostApi(dartHostTestHandler: 'TestCameraSelectorHostApi') +abstract class CameraSelectorHostApi { + void create(int identifier, int? lensFacing); + + List filter(int identifier, List cameraInfoIds); +} + +@FlutterApi() +abstract class CameraSelectorFlutterApi { + void create(int identifier, int? lensFacing); +} + +@HostApi(dartHostTestHandler: 'TestProcessCameraProviderHostApi') +abstract class ProcessCameraProviderHostApi { + @async + int getInstance(); + + List getAvailableCameraInfos(int identifier); +} + +@FlutterApi() +abstract class ProcessCameraProviderFlutterApi { + void create(int identifier); +} diff --git a/packages/camera/camera_android_camerax/test/camera_selector_test.dart b/packages/camera/camera_android_camerax/test/camera_selector_test.dart new file mode 100644 index 000000000000..c4ccd6262376 --- /dev/null +++ b/packages/camera/camera_android_camerax/test/camera_selector_test.dart @@ -0,0 +1,121 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:camera_android_camerax/src/camera_info.dart'; +import 'package:camera_android_camerax/src/camera_selector.dart'; +import 'package:camera_android_camerax/src/camerax_library.pigeon.dart'; +import 'package:camera_android_camerax/src/instance_manager.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; + +import 'camera_selector_test.mocks.dart'; +import 'test_camerax_library.pigeon.dart'; + +@GenerateMocks([TestCameraSelectorHostApi]) +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + + group('CameraSelector', () { + tearDown(() => TestCameraSelectorHostApi.setup(null)); + + test('detachedCreateTest', () async { + final MockTestCameraSelectorHostApi mockApi = + MockTestCameraSelectorHostApi(); + TestCameraSelectorHostApi.setup(mockApi); + + final InstanceManager instanceManager = InstanceManager( + onWeakReferenceRemoved: (_) {}, + ); + CameraSelector.detached( + instanceManager: instanceManager, + ); + + verifyNever(mockApi.create(argThat(isA()), null)); + }); + + test('createTestWithoutLensSpecified', () async { + final MockTestCameraSelectorHostApi mockApi = + MockTestCameraSelectorHostApi(); + TestCameraSelectorHostApi.setup(mockApi); + + final InstanceManager instanceManager = InstanceManager( + onWeakReferenceRemoved: (_) {}, + ); + CameraSelector( + instanceManager: instanceManager, + ); + + verify(mockApi.create(argThat(isA()), null)); + }); + + test('createTestWithLensSpecified', () async { + final MockTestCameraSelectorHostApi mockApi = + MockTestCameraSelectorHostApi(); + TestCameraSelectorHostApi.setup(mockApi); + + final InstanceManager instanceManager = InstanceManager( + onWeakReferenceRemoved: (_) {}, + ); + CameraSelector( + instanceManager: instanceManager, + lensFacing: CameraSelector.LENS_FACING_BACK); + + verify( + mockApi.create(argThat(isA()), CameraSelector.LENS_FACING_BACK)); + }); + + test('filterTest', () async { + final MockTestCameraSelectorHostApi mockApi = + MockTestCameraSelectorHostApi(); + TestCameraSelectorHostApi.setup(mockApi); + + final InstanceManager instanceManager = InstanceManager( + onWeakReferenceRemoved: (_) {}, + ); + final CameraSelector cameraSelector = CameraSelector.detached( + instanceManager: instanceManager, + ); + const int cameraInfoId = 3; + final CameraInfo cameraInfo = + CameraInfo.detached(instanceManager: instanceManager); + + instanceManager.addHostCreatedInstance( + cameraSelector, + 0, + onCopy: (_) => CameraSelector.detached(), + ); + instanceManager.addHostCreatedInstance( + cameraInfo, + cameraInfoId, + onCopy: (_) => CameraInfo.detached(), + ); + + when(mockApi.filter(instanceManager.getIdentifier(cameraSelector), + [cameraInfoId])).thenReturn([cameraInfoId]); + expect(await cameraSelector.filter([cameraInfo]), + equals([cameraInfo])); + + verify(mockApi.filter(0, [cameraInfoId])); + }); + + test('flutterApiCreateTest', () { + final InstanceManager instanceManager = InstanceManager( + onWeakReferenceRemoved: (_) {}, + ); + final CameraSelectorFlutterApi flutterApi = CameraSelectorFlutterApiImpl( + instanceManager: instanceManager, + ); + + flutterApi.create(0, CameraSelector.LENS_FACING_BACK); + + expect(instanceManager.getInstanceWithWeakReference(0), + isA()); + expect( + (instanceManager.getInstanceWithWeakReference(0)! as CameraSelector) + .lensFacing, + equals(CameraSelector.LENS_FACING_BACK)); + }); + }); +} diff --git a/packages/camera/camera_android_camerax/test/camera_selector_test.mocks.dart b/packages/camera/camera_android_camerax/test/camera_selector_test.mocks.dart new file mode 100644 index 000000000000..456db1eaf822 --- /dev/null +++ b/packages/camera/camera_android_camerax/test/camera_selector_test.mocks.dart @@ -0,0 +1,38 @@ +// Mocks generated by Mockito 5.3.0 from annotations +// in camera_android_camerax/test/camera_selector_test.dart. +// Do not manually edit this file. + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'package:mockito/mockito.dart' as _i1; + +import 'test_camerax_library.pigeon.dart' as _i2; + +// ignore_for_file: type=lint +// ignore_for_file: avoid_redundant_argument_values +// ignore_for_file: avoid_setters_without_getters +// ignore_for_file: comment_references +// ignore_for_file: implementation_imports +// ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: prefer_const_constructors +// ignore_for_file: unnecessary_parenthesis +// ignore_for_file: camel_case_types +// ignore_for_file: subtype_of_sealed_class + +/// A class which mocks [TestCameraSelectorHostApi]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockTestCameraSelectorHostApi extends _i1.Mock + implements _i2.TestCameraSelectorHostApi { + MockTestCameraSelectorHostApi() { + _i1.throwOnMissingStub(this); + } + + @override + void create(int? identifier, int? lensFacing) => + super.noSuchMethod(Invocation.method(#create, [identifier, lensFacing]), + returnValueForMissingStub: null); + @override + List filter(int? identifier, List? cameraInfoIds) => (super + .noSuchMethod(Invocation.method(#filter, [identifier, cameraInfoIds]), + returnValue: []) as List); +} diff --git a/packages/camera/camera_android_camerax/test/process_camera_provider_test.dart b/packages/camera/camera_android_camerax/test/process_camera_provider_test.dart new file mode 100644 index 000000000000..65e7d00ddaea --- /dev/null +++ b/packages/camera/camera_android_camerax/test/process_camera_provider_test.dart @@ -0,0 +1,96 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:camera_android_camerax/src/camera_info.dart'; +import 'package:camera_android_camerax/src/instance_manager.dart'; +import 'package:camera_android_camerax/src/process_camera_provider.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; + +import 'process_camera_provider_test.mocks.dart'; +import 'test_camerax_library.pigeon.dart'; + +@GenerateMocks([TestProcessCameraProviderHostApi]) +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + + group('ProcessCameraProvider', () { + tearDown(() => TestProcessCameraProviderHostApi.setup(null)); + + test('getInstanceTest', () async { + final MockTestProcessCameraProviderHostApi mockApi = + MockTestProcessCameraProviderHostApi(); + TestProcessCameraProviderHostApi.setup(mockApi); + + final InstanceManager instanceManager = InstanceManager( + onWeakReferenceRemoved: (_) {}, + ); + final ProcessCameraProvider processCameraProvider = + ProcessCameraProvider.detached( + instanceManager: instanceManager, + ); + + instanceManager.addHostCreatedInstance( + processCameraProvider, + 0, + onCopy: (_) => ProcessCameraProvider.detached(), + ); + + when(mockApi.getInstance()).thenAnswer((_) async => 0); + expect( + await ProcessCameraProvider.getInstance( + instanceManager: instanceManager), + equals(processCameraProvider)); + verify(mockApi.getInstance()); + }); + + test('getAvailableCameraInfosTest', () async { + final MockTestProcessCameraProviderHostApi mockApi = + MockTestProcessCameraProviderHostApi(); + TestProcessCameraProviderHostApi.setup(mockApi); + + final InstanceManager instanceManager = InstanceManager( + onWeakReferenceRemoved: (_) {}, + ); + final ProcessCameraProvider processCameraProvider = + ProcessCameraProvider.detached( + instanceManager: instanceManager, + ); + + instanceManager.addHostCreatedInstance( + processCameraProvider, + 0, + onCopy: (_) => ProcessCameraProvider.detached(), + ); + final CameraInfo fakeAvailableCameraInfo = + CameraInfo.detached(instanceManager: instanceManager); + instanceManager.addHostCreatedInstance( + fakeAvailableCameraInfo, + 1, + onCopy: (_) => CameraInfo.detached(), + ); + + when(mockApi.getAvailableCameraInfos(0)).thenReturn([1]); + expect(await processCameraProvider.getAvailableCameraInfos(), + equals([fakeAvailableCameraInfo])); + verify(mockApi.getAvailableCameraInfos(0)); + }); + + test('flutterApiCreateTest', () { + final InstanceManager instanceManager = InstanceManager( + onWeakReferenceRemoved: (_) {}, + ); + final ProcessCameraProviderFlutterApiImpl flutterApi = + ProcessCameraProviderFlutterApiImpl( + instanceManager: instanceManager, + ); + + flutterApi.create(0); + + expect(instanceManager.getInstanceWithWeakReference(0), + isA()); + }); + }); +} diff --git a/packages/camera/camera_android_camerax/test/process_camera_provider_test.mocks.dart b/packages/camera/camera_android_camerax/test/process_camera_provider_test.mocks.dart new file mode 100644 index 000000000000..9fcfe690c062 --- /dev/null +++ b/packages/camera/camera_android_camerax/test/process_camera_provider_test.mocks.dart @@ -0,0 +1,40 @@ +// Mocks generated by Mockito 5.3.0 from annotations +// in camera_android_camerax/test/process_camera_provider_test.dart. +// Do not manually edit this file. + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'dart:async' as _i3; + +import 'package:mockito/mockito.dart' as _i1; + +import 'test_camerax_library.pigeon.dart' as _i2; + +// ignore_for_file: type=lint +// ignore_for_file: avoid_redundant_argument_values +// ignore_for_file: avoid_setters_without_getters +// ignore_for_file: comment_references +// ignore_for_file: implementation_imports +// ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: prefer_const_constructors +// ignore_for_file: unnecessary_parenthesis +// ignore_for_file: camel_case_types +// ignore_for_file: subtype_of_sealed_class + +/// A class which mocks [TestProcessCameraProviderHostApi]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockTestProcessCameraProviderHostApi extends _i1.Mock + implements _i2.TestProcessCameraProviderHostApi { + MockTestProcessCameraProviderHostApi() { + _i1.throwOnMissingStub(this); + } + + @override + _i3.Future getInstance() => + (super.noSuchMethod(Invocation.method(#getInstance, []), + returnValue: _i3.Future.value(0)) as _i3.Future); + @override + List getAvailableCameraInfos(int? identifier) => (super.noSuchMethod( + Invocation.method(#getAvailableCameraInfos, [identifier]), + returnValue: []) as List); +} diff --git a/packages/camera/camera_android_camerax/test/test_camerax_library.pigeon.dart b/packages/camera/camera_android_camerax/test/test_camerax_library.pigeon.dart index 59e76190188e..2196b73d7fdb 100644 --- a/packages/camera/camera_android_camerax/test/test_camerax_library.pigeon.dart +++ b/packages/camera/camera_android_camerax/test/test_camerax_library.pigeon.dart @@ -77,3 +77,111 @@ abstract class TestCameraInfoHostApi { } } } + +class _TestCameraSelectorHostApiCodec extends StandardMessageCodec { + const _TestCameraSelectorHostApiCodec(); +} + +abstract class TestCameraSelectorHostApi { + static const MessageCodec codec = _TestCameraSelectorHostApiCodec(); + + void create(int identifier, int? lensFacing); + List filter(int identifier, List cameraInfoIds); + static void setup(TestCameraSelectorHostApi? api, + {BinaryMessenger? binaryMessenger}) { + { + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.CameraSelectorHostApi.create', codec, + binaryMessenger: binaryMessenger); + if (api == null) { + channel.setMockMessageHandler(null); + } else { + channel.setMockMessageHandler((Object? message) async { + assert(message != null, + 'Argument for dev.flutter.pigeon.CameraSelectorHostApi.create was null.'); + final List args = (message as List?)!; + final int? arg_identifier = (args[0] as int?); + assert(arg_identifier != null, + 'Argument for dev.flutter.pigeon.CameraSelectorHostApi.create was null, expected non-null int.'); + final int? arg_lensFacing = (args[1] as int?); + api.create(arg_identifier!, arg_lensFacing); + return {}; + }); + } + } + { + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.CameraSelectorHostApi.filter', codec, + binaryMessenger: binaryMessenger); + if (api == null) { + channel.setMockMessageHandler(null); + } else { + channel.setMockMessageHandler((Object? message) async { + assert(message != null, + 'Argument for dev.flutter.pigeon.CameraSelectorHostApi.filter was null.'); + final List args = (message as List?)!; + final int? arg_identifier = (args[0] as int?); + assert(arg_identifier != null, + 'Argument for dev.flutter.pigeon.CameraSelectorHostApi.filter was null, expected non-null int.'); + final List? arg_cameraInfoIds = + (args[1] as List?)?.cast(); + assert(arg_cameraInfoIds != null, + 'Argument for dev.flutter.pigeon.CameraSelectorHostApi.filter was null, expected non-null List.'); + final List output = + api.filter(arg_identifier!, arg_cameraInfoIds!); + return {'result': output}; + }); + } + } + } +} + +class _TestProcessCameraProviderHostApiCodec extends StandardMessageCodec { + const _TestProcessCameraProviderHostApiCodec(); +} + +abstract class TestProcessCameraProviderHostApi { + static const MessageCodec codec = + _TestProcessCameraProviderHostApiCodec(); + + Future getInstance(); + List getAvailableCameraInfos(int identifier); + static void setup(TestProcessCameraProviderHostApi? api, + {BinaryMessenger? binaryMessenger}) { + { + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.ProcessCameraProviderHostApi.getInstance', codec, + binaryMessenger: binaryMessenger); + if (api == null) { + channel.setMockMessageHandler(null); + } else { + channel.setMockMessageHandler((Object? message) async { + // ignore message + final int output = await api.getInstance(); + return {'result': output}; + }); + } + } + { + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.ProcessCameraProviderHostApi.getAvailableCameraInfos', + codec, + binaryMessenger: binaryMessenger); + if (api == null) { + channel.setMockMessageHandler(null); + } else { + channel.setMockMessageHandler((Object? message) async { + assert(message != null, + 'Argument for dev.flutter.pigeon.ProcessCameraProviderHostApi.getAvailableCameraInfos was null.'); + final List args = (message as List?)!; + final int? arg_identifier = (args[0] as int?); + assert(arg_identifier != null, + 'Argument for dev.flutter.pigeon.ProcessCameraProviderHostApi.getAvailableCameraInfos was null, expected non-null int.'); + final List output = + api.getAvailableCameraInfos(arg_identifier!); + return {'result': output}; + }); + } + } + } +} diff --git a/packages/camera/camera_avfoundation/CHANGELOG.md b/packages/camera/camera_avfoundation/CHANGELOG.md index ab33c35dd8da..12d9a53ea248 100644 --- a/packages/camera/camera_avfoundation/CHANGELOG.md +++ b/packages/camera/camera_avfoundation/CHANGELOG.md @@ -1,5 +1,6 @@ -## NEXT +## 0.9.8+6 +* Updates code for `no_leading_underscores_for_local_identifiers` lint. * Updates minimum Flutter version to 2.10. ## 0.9.8+5 diff --git a/packages/camera/camera_avfoundation/example/integration_test/camera_test.dart b/packages/camera/camera_avfoundation/example/integration_test/camera_test.dart index 51eab634c84b..3e62edc2c495 100644 --- a/packages/camera/camera_avfoundation/example/integration_test/camera_test.dart +++ b/packages/camera/camera_avfoundation/example/integration_test/camera_test.dart @@ -213,19 +213,19 @@ void main() { ); await controller.initialize(); - final Completer _completer = Completer(); + final Completer completer = Completer(); await controller.startImageStream((CameraImageData image) { - if (!_completer.isCompleted) { + if (!completer.isCompleted) { Future(() async { await controller.stopImageStream(); await controller.dispose(); }).then((Object? value) { - _completer.complete(image); + completer.complete(image); }); } }); - return _completer.future; + return completer.future; } testWidgets( @@ -237,20 +237,20 @@ void main() { return; } - CameraImageData _image = await startStreaming(cameras, null); - expect(_image, isNotNull); - expect(_image.format.group, ImageFormatGroup.bgra8888); - expect(_image.planes.length, 1); + CameraImageData image = await startStreaming(cameras, null); + expect(image, isNotNull); + expect(image.format.group, ImageFormatGroup.bgra8888); + expect(image.planes.length, 1); - _image = await startStreaming(cameras, ImageFormatGroup.yuv420); - expect(_image, isNotNull); - expect(_image.format.group, ImageFormatGroup.yuv420); - expect(_image.planes.length, 2); + image = await startStreaming(cameras, ImageFormatGroup.yuv420); + expect(image, isNotNull); + expect(image.format.group, ImageFormatGroup.yuv420); + expect(image.planes.length, 2); - _image = await startStreaming(cameras, ImageFormatGroup.bgra8888); - expect(_image, isNotNull); - expect(_image.format.group, ImageFormatGroup.bgra8888); - expect(_image.planes.length, 1); + image = await startStreaming(cameras, ImageFormatGroup.bgra8888); + expect(image, isNotNull); + expect(image.format.group, ImageFormatGroup.bgra8888); + expect(image.planes.length, 1); }, ); } diff --git a/packages/camera/camera_avfoundation/example/lib/camera_controller.dart b/packages/camera/camera_avfoundation/example/lib/camera_controller.dart index 5a7a79c8d96c..09441cc5449c 100644 --- a/packages/camera/camera_avfoundation/example/lib/camera_controller.dart +++ b/packages/camera/camera_avfoundation/example/lib/camera_controller.dart @@ -203,7 +203,7 @@ class CameraController extends ValueNotifier { /// Initializes the camera on the device. Future initialize() async { - final Completer _initializeCompleter = + final Completer initializeCompleter = Completer(); _deviceOrientationSubscription = CameraPlatform.instance @@ -224,7 +224,7 @@ class CameraController extends ValueNotifier { .onCameraInitialized(_cameraId) .first .then((CameraInitializedEvent event) { - _initializeCompleter.complete(event); + initializeCompleter.complete(event); }); await CameraPlatform.instance.initializeCamera( @@ -234,18 +234,18 @@ class CameraController extends ValueNotifier { value = value.copyWith( isInitialized: true, - previewSize: await _initializeCompleter.future + previewSize: await initializeCompleter.future .then((CameraInitializedEvent event) => Size( event.previewWidth, event.previewHeight, )), - exposureMode: await _initializeCompleter.future + exposureMode: await initializeCompleter.future .then((CameraInitializedEvent event) => event.exposureMode), - focusMode: await _initializeCompleter.future + focusMode: await initializeCompleter.future .then((CameraInitializedEvent event) => event.focusMode), - exposurePointSupported: await _initializeCompleter.future + exposurePointSupported: await initializeCompleter.future .then((CameraInitializedEvent event) => event.exposurePointSupported), - focusPointSupported: await _initializeCompleter.future + focusPointSupported: await initializeCompleter.future .then((CameraInitializedEvent event) => event.focusPointSupported), ); diff --git a/packages/camera/camera_avfoundation/example/pubspec.yaml b/packages/camera/camera_avfoundation/example/pubspec.yaml index 55296a6bf4db..a9252cbd6d61 100644 --- a/packages/camera/camera_avfoundation/example/pubspec.yaml +++ b/packages/camera/camera_avfoundation/example/pubspec.yaml @@ -14,6 +14,7 @@ dependencies: # The example app is bundled with the plugin so we use a path dependency on # the parent directory to use the current plugin's version. path: ../ + camera_platform_interface: ^2.2.0 flutter: sdk: flutter path_provider: ^2.0.0 diff --git a/packages/camera/camera_avfoundation/lib/src/avfoundation_camera.dart b/packages/camera/camera_avfoundation/lib/src/avfoundation_camera.dart index 19054fe5c561..9bdadfb4536f 100644 --- a/packages/camera/camera_avfoundation/lib/src/avfoundation_camera.dart +++ b/packages/camera/camera_avfoundation/lib/src/avfoundation_camera.dart @@ -126,10 +126,10 @@ class AVFoundationCamera extends CameraPlatform { return channel; }); - final Completer _completer = Completer(); + final Completer completer = Completer(); onCameraInitialized(cameraId).first.then((CameraInitializedEvent value) { - _completer.complete(); + completer.complete(); }); _channel.invokeMapMethod( @@ -147,14 +147,14 @@ class AVFoundationCamera extends CameraPlatform { if (error is! PlatformException) { throw error; } - _completer.completeError( + completer.completeError( CameraException(error.code, error.message), stackTrace, ); }, ); - return _completer.future; + return completer.future; } @override diff --git a/packages/camera/camera_avfoundation/pubspec.yaml b/packages/camera/camera_avfoundation/pubspec.yaml index 4b5b67dd8943..f394d59e81d5 100644 --- a/packages/camera/camera_avfoundation/pubspec.yaml +++ b/packages/camera/camera_avfoundation/pubspec.yaml @@ -2,7 +2,7 @@ name: camera_avfoundation description: iOS implementation of the camera plugin. repository: https://github.com/flutter/plugins/tree/main/packages/camera/camera_avfoundation issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 -version: 0.9.8+5 +version: 0.9.8+6 environment: sdk: ">=2.14.0 <3.0.0" diff --git a/packages/camera/camera_platform_interface/CHANGELOG.md b/packages/camera/camera_platform_interface/CHANGELOG.md index 7411db738483..d410304970cf 100644 --- a/packages/camera/camera_platform_interface/CHANGELOG.md +++ b/packages/camera/camera_platform_interface/CHANGELOG.md @@ -1,5 +1,10 @@ -## NEXT +## 2.2.2 +* Updates code for `no_leading_underscores_for_local_identifiers` lint. + +## 2.2.1 + +* Updates imports for `prefer_relative_imports`. * Updates minimum Flutter version to 2.10. * Fixes avoid_redundant_argument_values lint warnings and minor typos. * Ignores unnecessary import warnings in preparation for [upcoming Flutter changes](https://github.com/flutter/flutter/pull/104231). diff --git a/packages/camera/camera_platform_interface/lib/src/events/device_event.dart b/packages/camera/camera_platform_interface/lib/src/events/device_event.dart index d6bb5df05980..65a378f16f12 100644 --- a/packages/camera/camera_platform_interface/lib/src/events/device_event.dart +++ b/packages/camera/camera_platform_interface/lib/src/events/device_event.dart @@ -2,10 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'package:camera_platform_interface/src/utils/utils.dart'; import 'package:flutter/foundation.dart' show immutable; import 'package:flutter/services.dart'; +import '../utils/utils.dart'; + /// Generic Event coming from the native side of Camera, /// not related to a specific camera module. /// diff --git a/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart b/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart index eb6e59d9b4a1..37c00d64ede2 100644 --- a/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart +++ b/packages/camera/camera_platform_interface/lib/src/method_channel/method_channel_camera.dart @@ -5,13 +5,13 @@ import 'dart:async'; import 'dart:math'; -import 'package:camera_platform_interface/camera_platform_interface.dart'; -import 'package:camera_platform_interface/src/utils/utils.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; import 'package:stream_transform/stream_transform.dart'; +import '../../camera_platform_interface.dart'; +import '../utils/utils.dart'; import 'type_conversion.dart'; const MethodChannel _channel = MethodChannel('plugins.flutter.io/camera'); @@ -118,10 +118,10 @@ class MethodChannelCamera extends CameraPlatform { return channel; }); - final Completer _completer = Completer(); + final Completer completer = Completer(); onCameraInitialized(cameraId).first.then((CameraInitializedEvent value) { - _completer.complete(); + completer.complete(); }); _channel.invokeMapMethod( @@ -139,14 +139,14 @@ class MethodChannelCamera extends CameraPlatform { if (error is! PlatformException) { throw error; } - _completer.completeError( + completer.completeError( CameraException(error.code, error.message), stackTrace, ); }, ); - return _completer.future; + return completer.future; } @override diff --git a/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart b/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart index eaa779a943db..b086dc87851f 100644 --- a/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart +++ b/packages/camera/camera_platform_interface/lib/src/platform_interface/camera_platform.dart @@ -5,12 +5,13 @@ import 'dart:async'; import 'dart:math'; -import 'package:camera_platform_interface/camera_platform_interface.dart'; -import 'package:camera_platform_interface/src/method_channel/method_channel_camera.dart'; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; import 'package:plugin_platform_interface/plugin_platform_interface.dart'; +import '../../camera_platform_interface.dart'; +import '../method_channel/method_channel_camera.dart'; + /// The interface that implementations of camera must implement. /// /// Platform implementations should extend this class rather than implement it as `camera` diff --git a/packages/camera/camera_platform_interface/lib/src/utils/utils.dart b/packages/camera/camera_platform_interface/lib/src/utils/utils.dart index 663ec6da7a97..d86880afd216 100644 --- a/packages/camera/camera_platform_interface/lib/src/utils/utils.dart +++ b/packages/camera/camera_platform_interface/lib/src/utils/utils.dart @@ -2,9 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'package:camera_platform_interface/camera_platform_interface.dart'; import 'package:flutter/services.dart'; +import '../../camera_platform_interface.dart'; + /// Parses a string into a corresponding CameraLensDirection. CameraLensDirection parseCameraLensDirection(String string) { switch (string) { diff --git a/packages/camera/camera_platform_interface/pubspec.yaml b/packages/camera/camera_platform_interface/pubspec.yaml index 1c874725e9ce..e87679261c5a 100644 --- a/packages/camera/camera_platform_interface/pubspec.yaml +++ b/packages/camera/camera_platform_interface/pubspec.yaml @@ -4,7 +4,7 @@ repository: https://github.com/flutter/plugins/tree/main/packages/camera/camera_ issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 # NOTE: We strongly prefer non-breaking changes, even at the expense of a # less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes -version: 2.2.0 +version: 2.2.2 environment: sdk: '>=2.12.0 <3.0.0' diff --git a/packages/camera/camera_web/CHANGELOG.md b/packages/camera/camera_web/CHANGELOG.md index c6254ac11d38..f4989cfd5bff 100644 --- a/packages/camera/camera_web/CHANGELOG.md +++ b/packages/camera/camera_web/CHANGELOG.md @@ -1,5 +1,6 @@ -## NEXT +## 0.3.0+1 +* Updates imports for `prefer_relative_imports`. * Updates minimum Flutter version to 2.10. * Fixes avoid_redundant_argument_values lint warnings and minor typos. * Ignores unnecessary import warnings in preparation for [upcoming Flutter changes](https://github.com/flutter/flutter/pull/106316). diff --git a/packages/camera/camera_web/example/pubspec.yaml b/packages/camera/camera_web/example/pubspec.yaml index 78ff61a5f883..e82bbe392ceb 100644 --- a/packages/camera/camera_web/example/pubspec.yaml +++ b/packages/camera/camera_web/example/pubspec.yaml @@ -10,8 +10,11 @@ dependencies: sdk: flutter dev_dependencies: + async: ^2.5.0 + camera_platform_interface: ^2.1.0 camera_web: path: ../ + cross_file: ^0.3.1 flutter_driver: sdk: flutter flutter_test: diff --git a/packages/camera/camera_web/lib/src/camera.dart b/packages/camera/camera_web/lib/src/camera.dart index 210a0df59eec..13ef21b1ea46 100644 --- a/packages/camera/camera_web/lib/src/camera.dart +++ b/packages/camera/camera_web/lib/src/camera.dart @@ -7,11 +7,11 @@ import 'dart:html' as html; import 'dart:ui'; import 'package:camera_platform_interface/camera_platform_interface.dart'; -import 'package:camera_web/src/camera_service.dart'; -import 'package:camera_web/src/types/types.dart'; import 'package:flutter/foundation.dart'; +import 'camera_service.dart'; import 'shims/dart_ui.dart' as ui; +import 'types/types.dart'; String _getViewType(int cameraId) => 'plugins.flutter.io/camera_$cameraId'; diff --git a/packages/camera/camera_web/lib/src/camera_service.dart b/packages/camera/camera_web/lib/src/camera_service.dart index 5f4a5fdde9a4..6e20c7d74f78 100644 --- a/packages/camera/camera_web/lib/src/camera_service.dart +++ b/packages/camera/camera_web/lib/src/camera_service.dart @@ -8,12 +8,13 @@ import 'dart:html' as html; import 'dart:ui'; import 'package:camera_platform_interface/camera_platform_interface.dart'; -import 'package:camera_web/src/camera.dart'; -import 'package:camera_web/src/shims/dart_js_util.dart'; -import 'package:camera_web/src/types/types.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; +import 'camera.dart'; +import 'shims/dart_js_util.dart'; +import 'types/types.dart'; + /// A service to fetch, map camera settings and /// obtain the camera stream. class CameraService { diff --git a/packages/camera/camera_web/lib/src/camera_web.dart b/packages/camera/camera_web/lib/src/camera_web.dart index 26f965d49e16..d440653cd424 100644 --- a/packages/camera/camera_web/lib/src/camera_web.dart +++ b/packages/camera/camera_web/lib/src/camera_web.dart @@ -7,14 +7,15 @@ import 'dart:html' as html; import 'dart:math'; import 'package:camera_platform_interface/camera_platform_interface.dart'; -import 'package:camera_web/src/camera.dart'; -import 'package:camera_web/src/camera_service.dart'; -import 'package:camera_web/src/types/types.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_web_plugins/flutter_web_plugins.dart'; import 'package:stream_transform/stream_transform.dart'; +import 'camera.dart'; +import 'camera_service.dart'; +import 'types/types.dart'; + // The default error message, when the error is an empty string. // See: https://developer.mozilla.org/en-US/docs/Web/API/MediaError/message const String _kDefaultErrorMessage = diff --git a/packages/camera/camera_web/lib/src/types/camera_web_exception.dart b/packages/camera/camera_web/lib/src/types/camera_web_exception.dart index c21106cc462e..e6c6d7a0fed0 100644 --- a/packages/camera/camera_web/lib/src/types/camera_web_exception.dart +++ b/packages/camera/camera_web/lib/src/types/camera_web_exception.dart @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'package:camera_web/src/types/types.dart'; +import 'types.dart'; /// An exception thrown when the camera with id [cameraId] reports /// an initialization, configuration or video streaming error, diff --git a/packages/camera/camera_web/pubspec.yaml b/packages/camera/camera_web/pubspec.yaml index 527b28367eaf..ef9c45c71796 100644 --- a/packages/camera/camera_web/pubspec.yaml +++ b/packages/camera/camera_web/pubspec.yaml @@ -2,7 +2,7 @@ name: camera_web description: A Flutter plugin for getting information about and controlling the camera on Web. repository: https://github.com/flutter/plugins/tree/main/packages/camera/camera_web issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 -version: 0.3.0 +version: 0.3.0+1 environment: sdk: ">=2.12.0 <3.0.0" diff --git a/packages/camera/camera_windows/CHANGELOG.md b/packages/camera/camera_windows/CHANGELOG.md index 10b08874092a..71c5d56524a6 100644 --- a/packages/camera/camera_windows/CHANGELOG.md +++ b/packages/camera/camera_windows/CHANGELOG.md @@ -1,5 +1,6 @@ -## NEXT +## 0.2.1+2 +* Updates code for `no_leading_underscores_for_local_identifiers` lint. * Updates minimum Flutter version to 2.10. ## 0.2.1+1 diff --git a/packages/camera/camera_windows/example/lib/main.dart b/packages/camera/camera_windows/example/lib/main.dart index 310630493111..d27edb860975 100644 --- a/packages/camera/camera_windows/example/lib/main.dart +++ b/packages/camera/camera_windows/example/lib/main.dart @@ -187,8 +187,8 @@ class _MyAppState extends State { } Future _takePicture() async { - final XFile _file = await CameraPlatform.instance.takePicture(_cameraId); - _showInSnackBar('Picture captured to: ${_file.path}'); + final XFile file = await CameraPlatform.instance.takePicture(_cameraId); + _showInSnackBar('Picture captured to: ${file.path}'); } Future _recordTimed(int seconds) async { @@ -228,10 +228,10 @@ class _MyAppState extends State { if (!_recording) { await CameraPlatform.instance.startVideoRecording(_cameraId); } else { - final XFile _file = + final XFile file = await CameraPlatform.instance.stopVideoRecording(_cameraId); - _showInSnackBar('Video captured to: ${_file.path}'); + _showInSnackBar('Video captured to: ${file.path}'); } if (mounted) { diff --git a/packages/camera/camera_windows/example/pubspec.yaml b/packages/camera/camera_windows/example/pubspec.yaml index e1d63a3f81e9..80ce958a0e84 100644 --- a/packages/camera/camera_windows/example/pubspec.yaml +++ b/packages/camera/camera_windows/example/pubspec.yaml @@ -19,6 +19,7 @@ dependencies: sdk: flutter dev_dependencies: + async: ^2.5.0 flutter_test: sdk: flutter integration_test: diff --git a/packages/camera/camera_windows/pubspec.yaml b/packages/camera/camera_windows/pubspec.yaml index 403cb459a6f7..1eab9fa108ef 100644 --- a/packages/camera/camera_windows/pubspec.yaml +++ b/packages/camera/camera_windows/pubspec.yaml @@ -2,7 +2,7 @@ name: camera_windows description: A Flutter plugin for getting information about and controlling the camera on Windows. repository: https://github.com/flutter/plugins/tree/main/packages/camera/camera_windows issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+camera%22 -version: 0.2.1+1 +version: 0.2.1+2 environment: sdk: ">=2.12.0 <3.0.0" diff --git a/packages/file_selector/file_selector/example/ios/Flutter/Debug.xcconfig b/packages/file_selector/file_selector/example/ios/Flutter/Debug.xcconfig index 592ceee85b89..ec97fc6f3021 100644 --- a/packages/file_selector/file_selector/example/ios/Flutter/Debug.xcconfig +++ b/packages/file_selector/file_selector/example/ios/Flutter/Debug.xcconfig @@ -1 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" #include "Generated.xcconfig" diff --git a/packages/file_selector/file_selector/example/ios/Flutter/Release.xcconfig b/packages/file_selector/file_selector/example/ios/Flutter/Release.xcconfig index 592ceee85b89..c4855bfe2000 100644 --- a/packages/file_selector/file_selector/example/ios/Flutter/Release.xcconfig +++ b/packages/file_selector/file_selector/example/ios/Flutter/Release.xcconfig @@ -1 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" #include "Generated.xcconfig" diff --git a/packages/file_selector/file_selector/example/ios/Podfile b/packages/file_selector/file_selector/example/ios/Podfile new file mode 100644 index 000000000000..88359b225fa1 --- /dev/null +++ b/packages/file_selector/file_selector/example/ios/Podfile @@ -0,0 +1,41 @@ +# Uncomment this line to define a global platform for your project +# platform :ios, '11.0' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_ios_podfile_setup + +target 'Runner' do + use_frameworks! + use_modular_headers! + + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_ios_build_settings(target) + end +end diff --git a/packages/file_selector/file_selector/example/lib/open_image_page.dart b/packages/file_selector/file_selector/example/lib/open_image_page.dart index 28afca065121..b72d4e5f562f 100644 --- a/packages/file_selector/file_selector/example/lib/open_image_page.dart +++ b/packages/file_selector/file_selector/example/lib/open_image_page.dart @@ -2,6 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +// TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 +// ignore_for_file: prefer_const_constructors, prefer_const_literals_to_create_immutables + import 'dart:io'; import 'package:file_selector/file_selector.dart'; diff --git a/packages/file_selector/file_selector/example/lib/open_multiple_images_page.dart b/packages/file_selector/file_selector/example/lib/open_multiple_images_page.dart index 22703425b47b..87549e046549 100644 --- a/packages/file_selector/file_selector/example/lib/open_multiple_images_page.dart +++ b/packages/file_selector/file_selector/example/lib/open_multiple_images_page.dart @@ -2,6 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +// TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 +// ignore_for_file: prefer_const_constructors, prefer_const_literals_to_create_immutables + import 'dart:io'; import 'package:file_selector/file_selector.dart'; diff --git a/packages/file_selector/file_selector/example/lib/open_text_page.dart b/packages/file_selector/file_selector/example/lib/open_text_page.dart index 27fb0b749c3b..04d48afc21e4 100644 --- a/packages/file_selector/file_selector/example/lib/open_text_page.dart +++ b/packages/file_selector/file_selector/example/lib/open_text_page.dart @@ -12,8 +12,12 @@ class OpenTextPage extends StatelessWidget { const OpenTextPage({Key? key}) : super(key: key); Future _openTextFile(BuildContext context) async { + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup typeGroup = XTypeGroup( label: 'text', + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_literals_to_create_immutables extensions: ['txt', 'json'], ); // This demonstrates using an initial directory for the prompt, which should diff --git a/packages/file_selector/file_selector/test/file_selector_test.dart b/packages/file_selector/file_selector/test/file_selector_test.dart index 887ab64c3c0c..0bef946142ee 100644 --- a/packages/file_selector/file_selector/test/file_selector_test.dart +++ b/packages/file_selector/file_selector/test/file_selector_test.dart @@ -2,6 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +// TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 +// ignore_for_file: prefer_const_literals_to_create_immutables + import 'package:file_selector/file_selector.dart'; import 'package:file_selector_platform_interface/file_selector_platform_interface.dart'; import 'package:flutter_test/flutter_test.dart'; @@ -13,10 +16,14 @@ void main() { const String confirmButtonText = 'Use this profile picture'; const String suggestedName = 'suggested_name'; final List acceptedTypeGroups = [ + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors XTypeGroup(label: 'documents', mimeTypes: [ 'application/msword', 'application/vnd.openxmlformats-officedocument.wordprocessing', ]), + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors XTypeGroup(label: 'images', extensions: [ 'jpg', 'png', diff --git a/packages/file_selector/file_selector_ios/example/lib/open_image_page.dart b/packages/file_selector/file_selector_ios/example/lib/open_image_page.dart index fd0f4e711d7f..eff6c4f7c028 100644 --- a/packages/file_selector/file_selector_ios/example/lib/open_image_page.dart +++ b/packages/file_selector/file_selector_ios/example/lib/open_image_page.dart @@ -15,9 +15,15 @@ class OpenImagePage extends StatelessWidget { const OpenImagePage({Key? key}) : super(key: key); Future _openImageFile(BuildContext context) async { + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup typeGroup = XTypeGroup( label: 'images', + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_literals_to_create_immutables extensions: ['jpg', 'png'], + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_literals_to_create_immutables macUTIs: ['public.image'], ); final XFile? file = await FileSelectorPlatform.instance diff --git a/packages/file_selector/file_selector_ios/example/lib/open_multiple_images_page.dart b/packages/file_selector/file_selector_ios/example/lib/open_multiple_images_page.dart index 29b27c1d637c..0035ebcba5eb 100644 --- a/packages/file_selector/file_selector_ios/example/lib/open_multiple_images_page.dart +++ b/packages/file_selector/file_selector_ios/example/lib/open_multiple_images_page.dart @@ -2,6 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +// TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 +// ignore_for_file: prefer_const_literals_to_create_immutables + import 'dart:io'; import 'package:file_selector_platform_interface/file_selector_platform_interface.dart'; @@ -15,11 +18,15 @@ class OpenMultipleImagesPage extends StatelessWidget { const OpenMultipleImagesPage({Key? key}) : super(key: key); Future _openImageFile(BuildContext context) async { + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup jpgsTypeGroup = XTypeGroup( label: 'JPEGs', extensions: ['jpg', 'jpeg'], macUTIs: ['public.jpeg'], ); + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup pngTypeGroup = XTypeGroup( label: 'PNGs', extensions: ['png'], diff --git a/packages/file_selector/file_selector_ios/example/lib/open_text_page.dart b/packages/file_selector/file_selector_ios/example/lib/open_text_page.dart index b747aa89611c..b91195ef4a3d 100644 --- a/packages/file_selector/file_selector_ios/example/lib/open_text_page.dart +++ b/packages/file_selector/file_selector_ios/example/lib/open_text_page.dart @@ -12,9 +12,15 @@ class OpenTextPage extends StatelessWidget { const OpenTextPage({Key? key}) : super(key: key); Future _openTextFile(BuildContext context) async { + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup typeGroup = XTypeGroup( label: 'text', + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_literals_to_create_immutables extensions: ['txt', 'json'], + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_literals_to_create_immutables macUTIs: ['public.text'], ); final XFile? file = await FileSelectorPlatform.instance diff --git a/packages/file_selector/file_selector_ios/test/file_selector_ios_test.dart b/packages/file_selector/file_selector_ios/test/file_selector_ios_test.dart index f9ef40628991..a388fe951a4c 100644 --- a/packages/file_selector/file_selector_ios/test/file_selector_ios_test.dart +++ b/packages/file_selector/file_selector_ios/test/file_selector_ios_test.dart @@ -2,6 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +// TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 +// ignore_for_file: prefer_const_literals_to_create_immutables + import 'package:file_selector_ios/file_selector_ios.dart'; import 'package:file_selector_ios/src/messages.g.dart'; import 'package:file_selector_platform_interface/file_selector_platform_interface.dart'; @@ -36,6 +39,8 @@ void main() { }); test('passes the accepted type groups correctly', () async { + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup group = XTypeGroup( label: 'text', extensions: ['txt'], @@ -43,6 +48,8 @@ void main() { macUTIs: ['public.text'], ); + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup groupTwo = XTypeGroup( label: 'image', extensions: ['jpg'], @@ -62,6 +69,8 @@ void main() { expect(config.allowMultiSelection, isFalse); }); test('throws for a type group that does not support iOS', () async { + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup group = XTypeGroup( label: 'images', webWildCards: ['images/*'], @@ -73,6 +82,8 @@ void main() { }); test('allows a wildcard group', () async { + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup group = XTypeGroup( label: 'text', ); @@ -88,6 +99,8 @@ void main() { }); test('passes the accepted type groups correctly', () async { + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup group = XTypeGroup( label: 'text', extensions: ['txt'], @@ -95,6 +108,8 @@ void main() { macUTIs: ['public.text'], ); + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup groupTwo = XTypeGroup( label: 'image', extensions: ['jpg'], @@ -114,6 +129,8 @@ void main() { expect(config.allowMultiSelection, isTrue); }); test('throws for a type group that does not support iOS', () async { + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup group = XTypeGroup( label: 'images', webWildCards: ['images/*'], @@ -125,6 +142,8 @@ void main() { }); test('allows a wildcard group', () async { + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup group = XTypeGroup( label: 'text', ); diff --git a/packages/file_selector/file_selector_linux/example/lib/open_image_page.dart b/packages/file_selector/file_selector_linux/example/lib/open_image_page.dart index 9e1d2074d5f2..1925b27002df 100644 --- a/packages/file_selector/file_selector_linux/example/lib/open_image_page.dart +++ b/packages/file_selector/file_selector_linux/example/lib/open_image_page.dart @@ -15,8 +15,12 @@ class OpenImagePage extends StatelessWidget { const OpenImagePage({Key? key}) : super(key: key); Future _openImageFile(BuildContext context) async { + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup typeGroup = XTypeGroup( label: 'images', + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_literals_to_create_immutables extensions: ['jpg', 'png'], ); final XFile? file = await FileSelectorPlatform.instance diff --git a/packages/file_selector/file_selector_linux/example/lib/open_multiple_images_page.dart b/packages/file_selector/file_selector_linux/example/lib/open_multiple_images_page.dart index 21da8c22fa4d..ee7e7d1a967d 100644 --- a/packages/file_selector/file_selector_linux/example/lib/open_multiple_images_page.dart +++ b/packages/file_selector/file_selector_linux/example/lib/open_multiple_images_page.dart @@ -15,12 +15,20 @@ class OpenMultipleImagesPage extends StatelessWidget { const OpenMultipleImagesPage({Key? key}) : super(key: key); Future _openImageFile(BuildContext context) async { + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup jpgsTypeGroup = XTypeGroup( label: 'JPEGs', + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_literals_to_create_immutables extensions: ['jpg', 'jpeg'], ); + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup pngTypeGroup = XTypeGroup( label: 'PNGs', + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_literals_to_create_immutables extensions: ['png'], ); final List files = await FileSelectorPlatform.instance diff --git a/packages/file_selector/file_selector_linux/example/lib/open_text_page.dart b/packages/file_selector/file_selector_linux/example/lib/open_text_page.dart index 05c6d166fb6f..d5e8d462de1d 100644 --- a/packages/file_selector/file_selector_linux/example/lib/open_text_page.dart +++ b/packages/file_selector/file_selector_linux/example/lib/open_text_page.dart @@ -12,8 +12,12 @@ class OpenTextPage extends StatelessWidget { const OpenTextPage({Key? key}) : super(key: key); Future _openTextFile(BuildContext context) async { + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup typeGroup = XTypeGroup( label: 'text', + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_literals_to_create_immutables extensions: ['txt', 'json'], ); final XFile? file = await FileSelectorPlatform.instance diff --git a/packages/file_selector/file_selector_linux/test/file_selector_linux_test.dart b/packages/file_selector/file_selector_linux/test/file_selector_linux_test.dart index 67b99298adc3..54111c27140e 100644 --- a/packages/file_selector/file_selector_linux/test/file_selector_linux_test.dart +++ b/packages/file_selector/file_selector_linux/test/file_selector_linux_test.dart @@ -2,6 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +// TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 +// ignore_for_file: prefer_const_literals_to_create_immutables + import 'package:file_selector_linux/file_selector_linux.dart'; import 'package:file_selector_platform_interface/file_selector_platform_interface.dart'; import 'package:flutter/services.dart'; @@ -29,6 +32,8 @@ void main() { group('#openFile', () { test('passes the accepted type groups correctly', () async { + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup group = XTypeGroup( label: 'text', extensions: ['txt'], @@ -36,6 +41,8 @@ void main() { macUTIs: ['public.text'], ); + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup groupTwo = XTypeGroup( label: 'image', extensions: ['jpg'], @@ -101,6 +108,8 @@ void main() { }); test('throws for a type group that does not support Linux', () async { + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup group = XTypeGroup( label: 'images', webWildCards: ['images/*'], @@ -112,6 +121,8 @@ void main() { }); test('passes a wildcard group correctly', () async { + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup group = XTypeGroup( label: 'any', ); @@ -139,6 +150,8 @@ void main() { group('#openFiles', () { test('passes the accepted type groups correctly', () async { + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup group = XTypeGroup( label: 'text', extensions: ['txt'], @@ -146,6 +159,8 @@ void main() { macUTIs: ['public.text'], ); + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup groupTwo = XTypeGroup( label: 'image', extensions: ['jpg'], @@ -211,6 +226,8 @@ void main() { }); test('throws for a type group that does not support Linux', () async { + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup group = XTypeGroup( label: 'images', webWildCards: ['images/*'], @@ -222,6 +239,8 @@ void main() { }); test('passes a wildcard group correctly', () async { + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup group = XTypeGroup( label: 'any', ); @@ -249,6 +268,8 @@ void main() { group('#getSavePath', () { test('passes the accepted type groups correctly', () async { + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup group = XTypeGroup( label: 'text', extensions: ['txt'], @@ -256,6 +277,8 @@ void main() { macUTIs: ['public.text'], ); + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup groupTwo = XTypeGroup( label: 'image', extensions: ['jpg'], @@ -322,6 +345,8 @@ void main() { }); test('throws for a type group that does not support Linux', () async { + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup group = XTypeGroup( label: 'images', webWildCards: ['images/*'], @@ -333,6 +358,8 @@ void main() { }); test('passes a wildcard group correctly', () async { + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup group = XTypeGroup( label: 'any', ); diff --git a/packages/file_selector/file_selector_macos/CHANGELOG.md b/packages/file_selector/file_selector_macos/CHANGELOG.md index ec09997a52d2..f9241da91476 100644 --- a/packages/file_selector/file_selector_macos/CHANGELOG.md +++ b/packages/file_selector/file_selector_macos/CHANGELOG.md @@ -1,5 +1,6 @@ -## NEXT +## 0.9.0+2 +* Updates imports for `prefer_relative_imports`. * Updates minimum Flutter version to 2.10. ## 0.9.0+1 diff --git a/packages/file_selector/file_selector_macos/example/lib/main.dart b/packages/file_selector/file_selector_macos/example/lib/main.dart index cbe268e1c7ab..3e447104ef9f 100644 --- a/packages/file_selector/file_selector_macos/example/lib/main.dart +++ b/packages/file_selector/file_selector_macos/example/lib/main.dart @@ -2,14 +2,15 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'package:example/get_directory_page.dart'; -import 'package:example/home_page.dart'; -import 'package:example/open_image_page.dart'; -import 'package:example/open_multiple_images_page.dart'; -import 'package:example/open_text_page.dart'; -import 'package:example/save_text_page.dart'; import 'package:flutter/material.dart'; +import 'get_directory_page.dart'; +import 'home_page.dart'; +import 'open_image_page.dart'; +import 'open_multiple_images_page.dart'; +import 'open_text_page.dart'; +import 'save_text_page.dart'; + void main() { runApp(const MyApp()); } diff --git a/packages/file_selector/file_selector_macos/example/lib/open_image_page.dart b/packages/file_selector/file_selector_macos/example/lib/open_image_page.dart index 9e1d2074d5f2..1925b27002df 100644 --- a/packages/file_selector/file_selector_macos/example/lib/open_image_page.dart +++ b/packages/file_selector/file_selector_macos/example/lib/open_image_page.dart @@ -15,8 +15,12 @@ class OpenImagePage extends StatelessWidget { const OpenImagePage({Key? key}) : super(key: key); Future _openImageFile(BuildContext context) async { + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup typeGroup = XTypeGroup( label: 'images', + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_literals_to_create_immutables extensions: ['jpg', 'png'], ); final XFile? file = await FileSelectorPlatform.instance diff --git a/packages/file_selector/file_selector_macos/example/lib/open_multiple_images_page.dart b/packages/file_selector/file_selector_macos/example/lib/open_multiple_images_page.dart index 21da8c22fa4d..ee7e7d1a967d 100644 --- a/packages/file_selector/file_selector_macos/example/lib/open_multiple_images_page.dart +++ b/packages/file_selector/file_selector_macos/example/lib/open_multiple_images_page.dart @@ -15,12 +15,20 @@ class OpenMultipleImagesPage extends StatelessWidget { const OpenMultipleImagesPage({Key? key}) : super(key: key); Future _openImageFile(BuildContext context) async { + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup jpgsTypeGroup = XTypeGroup( label: 'JPEGs', + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_literals_to_create_immutables extensions: ['jpg', 'jpeg'], ); + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup pngTypeGroup = XTypeGroup( label: 'PNGs', + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_literals_to_create_immutables extensions: ['png'], ); final List files = await FileSelectorPlatform.instance diff --git a/packages/file_selector/file_selector_macos/example/lib/open_text_page.dart b/packages/file_selector/file_selector_macos/example/lib/open_text_page.dart index 05c6d166fb6f..d5e8d462de1d 100644 --- a/packages/file_selector/file_selector_macos/example/lib/open_text_page.dart +++ b/packages/file_selector/file_selector_macos/example/lib/open_text_page.dart @@ -12,8 +12,12 @@ class OpenTextPage extends StatelessWidget { const OpenTextPage({Key? key}) : super(key: key); Future _openTextFile(BuildContext context) async { + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup typeGroup = XTypeGroup( label: 'text', + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_literals_to_create_immutables extensions: ['txt', 'json'], ); final XFile? file = await FileSelectorPlatform.instance diff --git a/packages/file_selector/file_selector_macos/pubspec.yaml b/packages/file_selector/file_selector_macos/pubspec.yaml index 34d418490a14..b921cc8e8070 100644 --- a/packages/file_selector/file_selector_macos/pubspec.yaml +++ b/packages/file_selector/file_selector_macos/pubspec.yaml @@ -2,7 +2,7 @@ name: file_selector_macos description: macOS implementation of the file_selector plugin. repository: https://github.com/flutter/plugins/tree/main/packages/file_selector/file_selector_macos issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+file_selector%22 -version: 0.9.0+1 +version: 0.9.0+2 environment: sdk: ">=2.12.0 <3.0.0" diff --git a/packages/file_selector/file_selector_macos/test/file_selector_macos_test.dart b/packages/file_selector/file_selector_macos/test/file_selector_macos_test.dart index 40ab58534abd..29702a5421b1 100644 --- a/packages/file_selector/file_selector_macos/test/file_selector_macos_test.dart +++ b/packages/file_selector/file_selector_macos/test/file_selector_macos_test.dart @@ -2,6 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +// TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 +// ignore_for_file: prefer_const_literals_to_create_immutables + import 'package:file_selector_macos/file_selector_macos.dart'; import 'package:file_selector_platform_interface/file_selector_platform_interface.dart'; import 'package:flutter/services.dart'; @@ -30,6 +33,8 @@ void main() { group('openFile', () { test('passes the accepted type groups correctly', () async { + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup group = XTypeGroup( label: 'text', extensions: ['txt'], @@ -37,6 +42,8 @@ void main() { macUTIs: ['public.text'], ); + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup groupTwo = XTypeGroup( label: 'image', extensions: ['jpg'], @@ -96,6 +103,8 @@ void main() { }); test('throws for a type group that does not support macOS', () async { + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup group = XTypeGroup( label: 'images', webWildCards: ['images/*'], @@ -107,6 +116,8 @@ void main() { }); test('allows a wildcard group', () async { + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup group = XTypeGroup( label: 'text', ); @@ -118,6 +129,8 @@ void main() { group('openFiles', () { test('passes the accepted type groups correctly', () async { + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup group = XTypeGroup( label: 'text', extensions: ['txt'], @@ -125,6 +138,8 @@ void main() { macUTIs: ['public.text'], ); + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup groupTwo = XTypeGroup( label: 'image', extensions: ['jpg'], @@ -184,6 +199,8 @@ void main() { }); test('throws for a type group that does not support macOS', () async { + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup group = XTypeGroup( label: 'images', webWildCards: ['images/*'], @@ -195,6 +212,8 @@ void main() { }); test('allows a wildcard group', () async { + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup group = XTypeGroup( label: 'text', ); @@ -206,6 +225,8 @@ void main() { group('getSavePath', () { test('passes the accepted type groups correctly', () async { + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup group = XTypeGroup( label: 'text', extensions: ['txt'], @@ -213,6 +234,8 @@ void main() { macUTIs: ['public.text'], ); + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup groupTwo = XTypeGroup( label: 'image', extensions: ['jpg'], @@ -273,6 +296,8 @@ void main() { }); test('throws for a type group that does not support macOS', () async { + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup group = XTypeGroup( label: 'images', webWildCards: ['images/*'], @@ -284,6 +309,8 @@ void main() { }); test('allows a wildcard group', () async { + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup group = XTypeGroup( label: 'text', ); @@ -326,18 +353,24 @@ void main() { test('ignores all type groups if any of them is a wildcard', () async { await plugin.getSavePath(acceptedTypeGroups: [ + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors XTypeGroup( label: 'text', extensions: ['txt'], mimeTypes: ['text/plain'], macUTIs: ['public.text'], ), + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors XTypeGroup( label: 'image', extensions: ['jpg'], mimeTypes: ['image/jpg'], macUTIs: ['public.image'], ), + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors XTypeGroup( label: 'any', ), diff --git a/packages/file_selector/file_selector_platform_interface/CHANGELOG.md b/packages/file_selector/file_selector_platform_interface/CHANGELOG.md index e6949b09fa3b..ad1fe2cb6cef 100644 --- a/packages/file_selector/file_selector_platform_interface/CHANGELOG.md +++ b/packages/file_selector/file_selector_platform_interface/CHANGELOG.md @@ -1,5 +1,10 @@ -## NEXT +## 2.2.0 +* Makes `XTypeGroup`'s constructor constant. + +## 2.1.1 + +* Updates imports for `prefer_relative_imports`. * Updates minimum Flutter version to 2.10. ## 2.1.0 diff --git a/packages/file_selector/file_selector_platform_interface/lib/src/method_channel/method_channel_file_selector.dart b/packages/file_selector/file_selector_platform_interface/lib/src/method_channel/method_channel_file_selector.dart index c6d0f4a56155..d6aebd01730f 100644 --- a/packages/file_selector/file_selector_platform_interface/lib/src/method_channel/method_channel_file_selector.dart +++ b/packages/file_selector/file_selector_platform_interface/lib/src/method_channel/method_channel_file_selector.dart @@ -2,10 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'package:file_selector_platform_interface/file_selector_platform_interface.dart'; import 'package:flutter/foundation.dart' show visibleForTesting; import 'package:flutter/services.dart'; +import '../../file_selector_platform_interface.dart'; + const MethodChannel _channel = MethodChannel('plugins.flutter.io/file_selector'); diff --git a/packages/file_selector/file_selector_platform_interface/lib/src/platform_interface/file_selector_interface.dart b/packages/file_selector/file_selector_platform_interface/lib/src/platform_interface/file_selector_interface.dart index a23957af9110..eb4563c47917 100644 --- a/packages/file_selector/file_selector_platform_interface/lib/src/platform_interface/file_selector_interface.dart +++ b/packages/file_selector/file_selector_platform_interface/lib/src/platform_interface/file_selector_interface.dart @@ -4,9 +4,9 @@ import 'dart:async'; -import 'package:file_selector_platform_interface/file_selector_platform_interface.dart'; import 'package:plugin_platform_interface/plugin_platform_interface.dart'; +import '../../file_selector_platform_interface.dart'; import '../method_channel/method_channel_file_selector.dart'; /// The interface that implementations of file_selector must implement. diff --git a/packages/file_selector/file_selector_platform_interface/lib/src/types/x_type_group/x_type_group.dart b/packages/file_selector/file_selector_platform_interface/lib/src/types/x_type_group/x_type_group.dart index 506dc1ce2de9..00cd56563c32 100644 --- a/packages/file_selector/file_selector_platform_interface/lib/src/types/x_type_group/x_type_group.dart +++ b/packages/file_selector/file_selector_platform_interface/lib/src/types/x_type_group/x_type_group.dart @@ -1,37 +1,43 @@ // Copyright 2013 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'package:flutter/foundation.dart' show immutable; -/// A set of allowed XTypes +/// A set of allowed XTypes. +@immutable class XTypeGroup { /// Creates a new group with the given label and file extensions. /// /// A group with none of the type options provided indicates that any type is /// allowed. - XTypeGroup({ + const XTypeGroup({ this.label, List? extensions, this.mimeTypes, this.macUTIs, this.webWildCards, - }) : extensions = _removeLeadingDots(extensions); + }) : _extensions = extensions; - /// The 'name' or reference to this group of types + /// The 'name' or reference to this group of types. final String? label; - /// The extensions for this group - final List? extensions; - - /// The MIME types for this group + /// The MIME types for this group. final List? mimeTypes; - /// The UTIs for this group + /// The UTIs for this group. final List? macUTIs; - /// The web wild cards for this group (ex: image/*, video/*) + /// The web wild cards for this group (ex: image/*, video/*). final List? webWildCards; - /// Converts this object into a JSON formatted object + final List? _extensions; + + /// The extensions for this group. + List? get extensions { + return _removeLeadingDots(_extensions); + } + + /// Converts this object into a JSON formatted object. Map toJSON() { return { 'label': label, diff --git a/packages/file_selector/file_selector_platform_interface/pubspec.yaml b/packages/file_selector/file_selector_platform_interface/pubspec.yaml index ae24a4b93b5d..c4500061a3a1 100644 --- a/packages/file_selector/file_selector_platform_interface/pubspec.yaml +++ b/packages/file_selector/file_selector_platform_interface/pubspec.yaml @@ -4,7 +4,7 @@ repository: https://github.com/flutter/plugins/tree/main/packages/file_selector/ issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+file_selector%22 # NOTE: We strongly prefer non-breaking changes, even at the expense of a # less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes -version: 2.1.0 +version: 2.2.0 environment: sdk: ">=2.12.0 <3.0.0" diff --git a/packages/file_selector/file_selector_platform_interface/test/method_channel_file_selector_test.dart b/packages/file_selector/file_selector_platform_interface/test/method_channel_file_selector_test.dart index 33f9fbf45a8b..0f5f3a17ae0c 100644 --- a/packages/file_selector/file_selector_platform_interface/test/method_channel_file_selector_test.dart +++ b/packages/file_selector/file_selector_platform_interface/test/method_channel_file_selector_test.dart @@ -26,14 +26,14 @@ void main() { group('#openFile', () { test('passes the accepted type groups correctly', () async { - final XTypeGroup group = XTypeGroup( + const XTypeGroup group = XTypeGroup( label: 'text', extensions: ['txt'], mimeTypes: ['text/plain'], macUTIs: ['public.text'], ); - final XTypeGroup groupTwo = XTypeGroup( + const XTypeGroup groupTwo = XTypeGroup( label: 'image', extensions: ['jpg'], mimeTypes: ['image/jpg'], @@ -91,14 +91,14 @@ void main() { }); group('#openFiles', () { test('passes the accepted type groups correctly', () async { - final XTypeGroup group = XTypeGroup( + const XTypeGroup group = XTypeGroup( label: 'text', extensions: ['txt'], mimeTypes: ['text/plain'], macUTIs: ['public.text'], ); - final XTypeGroup groupTwo = XTypeGroup( + const XTypeGroup groupTwo = XTypeGroup( label: 'image', extensions: ['jpg'], mimeTypes: ['image/jpg'], @@ -157,14 +157,14 @@ void main() { group('#getSavePath', () { test('passes the accepted type groups correctly', () async { - final XTypeGroup group = XTypeGroup( + const XTypeGroup group = XTypeGroup( label: 'text', extensions: ['txt'], mimeTypes: ['text/plain'], macUTIs: ['public.text'], ); - final XTypeGroup groupTwo = XTypeGroup( + const XTypeGroup groupTwo = XTypeGroup( label: 'image', extensions: ['jpg'], mimeTypes: ['image/jpg'], diff --git a/packages/file_selector/file_selector_platform_interface/test/x_type_group_test.dart b/packages/file_selector/file_selector_platform_interface/test/x_type_group_test.dart index e09605c109c5..107cdc3a2538 100644 --- a/packages/file_selector/file_selector_platform_interface/test/x_type_group_test.dart +++ b/packages/file_selector/file_selector_platform_interface/test/x_type_group_test.dart @@ -31,7 +31,7 @@ void main() { }); test('A wildcard group can be created', () { - final XTypeGroup group = XTypeGroup( + const XTypeGroup group = XTypeGroup( label: 'Any', ); @@ -44,7 +44,7 @@ void main() { }); test('allowsAny treats empty arrays the same as null', () { - final XTypeGroup group = XTypeGroup( + const XTypeGroup group = XTypeGroup( label: 'Any', extensions: [], mimeTypes: [], @@ -56,13 +56,13 @@ void main() { }); test('allowsAny returns false if anything is set', () { - final XTypeGroup extensionOnly = + const XTypeGroup extensionOnly = XTypeGroup(label: 'extensions', extensions: ['txt']); - final XTypeGroup mimeOnly = + const XTypeGroup mimeOnly = XTypeGroup(label: 'mime', mimeTypes: ['text/plain']); - final XTypeGroup utiOnly = + const XTypeGroup utiOnly = XTypeGroup(label: 'utis', macUTIs: ['public.text']); - final XTypeGroup webOnly = + const XTypeGroup webOnly = XTypeGroup(label: 'web', webWildCards: ['.txt']); expect(extensionOnly.allowsAny, false); diff --git a/packages/file_selector/file_selector_web/CHANGELOG.md b/packages/file_selector/file_selector_web/CHANGELOG.md index 873a76e60a25..69ca20363866 100644 --- a/packages/file_selector/file_selector_web/CHANGELOG.md +++ b/packages/file_selector/file_selector_web/CHANGELOG.md @@ -1,5 +1,6 @@ -## NEXT +## 0.9.0+1 +* Updates imports for `prefer_relative_imports`. * Updates minimum Flutter version to 2.10. * Fixes avoid_redundant_argument_values lint warnings and minor typos. diff --git a/packages/file_selector/file_selector_web/example/integration_test/file_selector_web_test.dart b/packages/file_selector/file_selector_web/example/integration_test/file_selector_web_test.dart index d3d058122aa6..5f476d937977 100644 --- a/packages/file_selector/file_selector_web/example/integration_test/file_selector_web_test.dart +++ b/packages/file_selector/file_selector_web/example/integration_test/file_selector_web_test.dart @@ -2,6 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +// TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 +// ignore_for_file: prefer_const_literals_to_create_immutables + import 'dart:html'; import 'dart:typed_data'; @@ -26,6 +29,8 @@ void main() { final FileSelectorWeb plugin = FileSelectorWeb(domHelper: mockDomHelper); + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup typeGroup = XTypeGroup( label: 'images', extensions: ['jpg', 'jpeg'], @@ -56,6 +61,8 @@ void main() { final FileSelectorWeb plugin = FileSelectorWeb(domHelper: mockDomHelper); + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup typeGroup = XTypeGroup( label: 'files', extensions: ['.txt'], diff --git a/packages/file_selector/file_selector_web/example/pubspec.yaml b/packages/file_selector/file_selector_web/example/pubspec.yaml index 042f412b816b..3a36ce5c74f3 100644 --- a/packages/file_selector/file_selector_web/example/pubspec.yaml +++ b/packages/file_selector/file_selector_web/example/pubspec.yaml @@ -6,12 +6,13 @@ environment: flutter: ">=2.10.0" dependencies: + file_selector_platform_interface: ^2.1.0 + file_selector_web: + path: ../ flutter: sdk: flutter dev_dependencies: - file_selector_web: - path: ../ flutter_driver: sdk: flutter flutter_test: diff --git a/packages/file_selector/file_selector_web/lib/file_selector_web.dart b/packages/file_selector/file_selector_web/lib/file_selector_web.dart index 915a2a806496..748bb3aa0df0 100644 --- a/packages/file_selector/file_selector_web/lib/file_selector_web.dart +++ b/packages/file_selector/file_selector_web/lib/file_selector_web.dart @@ -5,11 +5,12 @@ import 'dart:async'; import 'package:file_selector_platform_interface/file_selector_platform_interface.dart'; -import 'package:file_selector_web/src/dom_helper.dart'; -import 'package:file_selector_web/src/utils.dart'; import 'package:flutter/foundation.dart' show visibleForTesting; import 'package:flutter_web_plugins/flutter_web_plugins.dart'; +import 'src/dom_helper.dart'; +import 'src/utils.dart'; + /// The web implementation of [FileSelectorPlatform]. /// /// This class implements the `package:file_selector` functionality for the web. diff --git a/packages/file_selector/file_selector_web/pubspec.yaml b/packages/file_selector/file_selector_web/pubspec.yaml index c1854aea4a88..38229588fd27 100644 --- a/packages/file_selector/file_selector_web/pubspec.yaml +++ b/packages/file_selector/file_selector_web/pubspec.yaml @@ -2,7 +2,7 @@ name: file_selector_web description: Web platform implementation of file_selector repository: https://github.com/flutter/plugins/tree/main/packages/file_selector/file_selector_web issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+file_selector%22 -version: 0.9.0 +version: 0.9.0+1 environment: sdk: ">=2.12.0 <3.0.0" diff --git a/packages/file_selector/file_selector_web/test/utils_test.dart b/packages/file_selector/file_selector_web/test/utils_test.dart index 3281c4cdca8d..dcb7c3d8c627 100644 --- a/packages/file_selector/file_selector_web/test/utils_test.dart +++ b/packages/file_selector/file_selector_web/test/utils_test.dart @@ -2,6 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +// TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 +// ignore_for_file: prefer_const_literals_to_create_immutables + import 'package:file_selector_platform_interface/file_selector_platform_interface.dart'; import 'package:file_selector_web/src/utils.dart'; import 'package:flutter_test/flutter_test.dart'; @@ -11,8 +14,14 @@ void main() { group('acceptedTypesToString', () { test('works', () { final List acceptedTypes = [ + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors XTypeGroup(label: 'images', webWildCards: ['images/*']), + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors XTypeGroup(label: 'jpgs', extensions: ['jpg', 'jpeg']), + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors XTypeGroup(label: 'pngs', mimeTypes: ['image/png']), ]; final String accepts = acceptedTypesToString(acceptedTypes); @@ -27,7 +36,11 @@ void main() { test('works with extensions', () { final List acceptedTypes = [ + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors XTypeGroup(label: 'jpgs', extensions: ['jpeg', 'jpg']), + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors XTypeGroup(label: 'pngs', extensions: ['png']), ]; final String accepts = acceptedTypesToString(acceptedTypes); @@ -36,8 +49,12 @@ void main() { test('works with mime types', () { final List acceptedTypes = [ + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors XTypeGroup( label: 'jpgs', mimeTypes: ['image/jpeg', 'image/jpg']), + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors XTypeGroup(label: 'pngs', mimeTypes: ['image/png']), ]; final String accepts = acceptedTypesToString(acceptedTypes); @@ -46,8 +63,14 @@ void main() { test('works with web wild cards', () { final List acceptedTypes = [ + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors XTypeGroup(label: 'images', webWildCards: ['image/*']), + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors XTypeGroup(label: 'audios', webWildCards: ['audio/*']), + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors XTypeGroup(label: 'videos', webWildCards: ['video/*']), ]; final String accepts = acceptedTypesToString(acceptedTypes); @@ -56,6 +79,8 @@ void main() { test('throws for a type group that does not support web', () { final List acceptedTypes = [ + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors XTypeGroup(label: 'text', macUTIs: ['public.text']), ]; expect(() => acceptedTypesToString(acceptedTypes), throwsArgumentError); diff --git a/packages/file_selector/file_selector_windows/CHANGELOG.md b/packages/file_selector/file_selector_windows/CHANGELOG.md index e0e6152e9b2f..1221bbd4d508 100644 --- a/packages/file_selector/file_selector_windows/CHANGELOG.md +++ b/packages/file_selector/file_selector_windows/CHANGELOG.md @@ -1,5 +1,6 @@ -## NEXT +## 0.9.1+3 +* Updates imports for `prefer_relative_imports`. * Updates minimum Flutter version to 2.10. ## 0.9.1+2 diff --git a/packages/file_selector/file_selector_windows/example/lib/main.dart b/packages/file_selector/file_selector_windows/example/lib/main.dart index cbe268e1c7ab..3e447104ef9f 100644 --- a/packages/file_selector/file_selector_windows/example/lib/main.dart +++ b/packages/file_selector/file_selector_windows/example/lib/main.dart @@ -2,14 +2,15 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'package:example/get_directory_page.dart'; -import 'package:example/home_page.dart'; -import 'package:example/open_image_page.dart'; -import 'package:example/open_multiple_images_page.dart'; -import 'package:example/open_text_page.dart'; -import 'package:example/save_text_page.dart'; import 'package:flutter/material.dart'; +import 'get_directory_page.dart'; +import 'home_page.dart'; +import 'open_image_page.dart'; +import 'open_multiple_images_page.dart'; +import 'open_text_page.dart'; +import 'save_text_page.dart'; + void main() { runApp(const MyApp()); } diff --git a/packages/file_selector/file_selector_windows/example/lib/open_image_page.dart b/packages/file_selector/file_selector_windows/example/lib/open_image_page.dart index 9e1d2074d5f2..1925b27002df 100644 --- a/packages/file_selector/file_selector_windows/example/lib/open_image_page.dart +++ b/packages/file_selector/file_selector_windows/example/lib/open_image_page.dart @@ -15,8 +15,12 @@ class OpenImagePage extends StatelessWidget { const OpenImagePage({Key? key}) : super(key: key); Future _openImageFile(BuildContext context) async { + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup typeGroup = XTypeGroup( label: 'images', + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_literals_to_create_immutables extensions: ['jpg', 'png'], ); final XFile? file = await FileSelectorPlatform.instance diff --git a/packages/file_selector/file_selector_windows/example/lib/open_multiple_images_page.dart b/packages/file_selector/file_selector_windows/example/lib/open_multiple_images_page.dart index 21da8c22fa4d..ee7e7d1a967d 100644 --- a/packages/file_selector/file_selector_windows/example/lib/open_multiple_images_page.dart +++ b/packages/file_selector/file_selector_windows/example/lib/open_multiple_images_page.dart @@ -15,12 +15,20 @@ class OpenMultipleImagesPage extends StatelessWidget { const OpenMultipleImagesPage({Key? key}) : super(key: key); Future _openImageFile(BuildContext context) async { + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup jpgsTypeGroup = XTypeGroup( label: 'JPEGs', + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_literals_to_create_immutables extensions: ['jpg', 'jpeg'], ); + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup pngTypeGroup = XTypeGroup( label: 'PNGs', + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_literals_to_create_immutables extensions: ['png'], ); final List files = await FileSelectorPlatform.instance diff --git a/packages/file_selector/file_selector_windows/example/lib/open_text_page.dart b/packages/file_selector/file_selector_windows/example/lib/open_text_page.dart index 05c6d166fb6f..d5e8d462de1d 100644 --- a/packages/file_selector/file_selector_windows/example/lib/open_text_page.dart +++ b/packages/file_selector/file_selector_windows/example/lib/open_text_page.dart @@ -12,8 +12,12 @@ class OpenTextPage extends StatelessWidget { const OpenTextPage({Key? key}) : super(key: key); Future _openTextFile(BuildContext context) async { + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup typeGroup = XTypeGroup( label: 'text', + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_literals_to_create_immutables extensions: ['txt', 'json'], ); final XFile? file = await FileSelectorPlatform.instance diff --git a/packages/file_selector/file_selector_windows/pubspec.yaml b/packages/file_selector/file_selector_windows/pubspec.yaml index 52b9f97174b4..7859822701e1 100644 --- a/packages/file_selector/file_selector_windows/pubspec.yaml +++ b/packages/file_selector/file_selector_windows/pubspec.yaml @@ -2,7 +2,7 @@ name: file_selector_windows description: Windows implementation of the file_selector plugin. repository: https://github.com/flutter/plugins/tree/main/packages/file_selector/file_selector_windows issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+file_selector%22 -version: 0.9.1+2 +version: 0.9.1+3 environment: sdk: ">=2.12.0 <3.0.0" diff --git a/packages/file_selector/file_selector_windows/test/file_selector_windows_test.dart b/packages/file_selector/file_selector_windows/test/file_selector_windows_test.dart index 79277fae472b..2d8dc4b78688 100644 --- a/packages/file_selector/file_selector_windows/test/file_selector_windows_test.dart +++ b/packages/file_selector/file_selector_windows/test/file_selector_windows_test.dart @@ -2,6 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +// TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 +// ignore_for_file: prefer_const_literals_to_create_immutables + import 'package:file_selector_platform_interface/file_selector_platform_interface.dart'; import 'package:file_selector_windows/file_selector_windows.dart'; import 'package:file_selector_windows/src/messages.g.dart'; @@ -47,6 +50,8 @@ void main() { }); test('passes the accepted type groups correctly', () async { + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup group = XTypeGroup( label: 'text', extensions: ['txt'], @@ -54,6 +59,8 @@ void main() { macUTIs: ['public.text'], ); + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup groupTwo = XTypeGroup( label: 'image', extensions: ['jpg'], @@ -86,6 +93,8 @@ void main() { }); test('throws for a type group that does not support Windows', () async { + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup group = XTypeGroup( label: 'text', mimeTypes: ['text/plain'], @@ -97,6 +106,8 @@ void main() { }); test('allows a wildcard group', () async { + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup group = XTypeGroup( label: 'text', ); @@ -125,6 +136,8 @@ void main() { }); test('passes the accepted type groups correctly', () async { + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup group = XTypeGroup( label: 'text', extensions: ['txt'], @@ -132,6 +145,8 @@ void main() { macUTIs: ['public.text'], ); + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup groupTwo = XTypeGroup( label: 'image', extensions: ['jpg'], @@ -164,6 +179,8 @@ void main() { }); test('throws for a type group that does not support Windows', () async { + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup group = XTypeGroup( label: 'text', mimeTypes: ['text/plain'], @@ -175,6 +192,8 @@ void main() { }); test('allows a wildcard group', () async { + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup group = XTypeGroup( label: 'text', ); @@ -231,6 +250,8 @@ void main() { }); test('passes the accepted type groups correctly', () async { + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup group = XTypeGroup( label: 'text', extensions: ['txt'], @@ -238,6 +259,8 @@ void main() { macUTIs: ['public.text'], ); + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup groupTwo = XTypeGroup( label: 'image', extensions: ['jpg'], @@ -277,6 +300,8 @@ void main() { }); test('throws for a type group that does not support Windows', () async { + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup group = XTypeGroup( label: 'text', mimeTypes: ['text/plain'], @@ -288,6 +313,8 @@ void main() { }); test('allows a wildcard group', () async { + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors final XTypeGroup group = XTypeGroup( label: 'text', ); diff --git a/packages/google_maps_flutter/google_maps_flutter/CHANGELOG.md b/packages/google_maps_flutter/google_maps_flutter/CHANGELOG.md index 291ba6230a60..3707aa86e95a 100644 --- a/packages/google_maps_flutter/google_maps_flutter/CHANGELOG.md +++ b/packages/google_maps_flutter/google_maps_flutter/CHANGELOG.md @@ -1,3 +1,11 @@ +## NEXT + +* Updates code for `no_leading_underscores_for_local_identifiers` lint. + +## 2.2.1 + +* Updates imports for `prefer_relative_imports`. + ## 2.2.0 * Deprecates `AndroidGoogleMapsFlutter.useAndroidViewSurface` in favor of diff --git a/packages/google_maps_flutter/google_maps_flutter/example/lib/main.dart b/packages/google_maps_flutter/google_maps_flutter/example/lib/main.dart index b11f29977f23..60d4fdd95dcf 100644 --- a/packages/google_maps_flutter/google_maps_flutter/example/lib/main.dart +++ b/packages/google_maps_flutter/google_maps_flutter/example/lib/main.dart @@ -3,11 +3,11 @@ // found in the LICENSE file. import 'package:flutter/material.dart'; - import 'package:google_maps_flutter_android/google_maps_flutter_android.dart'; -import 'package:google_maps_flutter_example/lite_mode.dart'; import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; + import 'animate_camera.dart'; +import 'lite_mode.dart'; import 'map_click.dart'; import 'map_coordinates.dart'; import 'map_ui.dart'; diff --git a/packages/google_maps_flutter/google_maps_flutter/example/pubspec.yaml b/packages/google_maps_flutter/google_maps_flutter/example/pubspec.yaml index 77e9b9497410..ad1ff2cad0a7 100644 --- a/packages/google_maps_flutter/google_maps_flutter/example/pubspec.yaml +++ b/packages/google_maps_flutter/google_maps_flutter/example/pubspec.yaml @@ -25,6 +25,8 @@ dev_dependencies: espresso: ^0.1.0+2 flutter_driver: sdk: flutter + flutter_test: + sdk: flutter integration_test: sdk: flutter diff --git a/packages/google_maps_flutter/google_maps_flutter/pubspec.yaml b/packages/google_maps_flutter/google_maps_flutter/pubspec.yaml index dd8c82d4d4e5..540f5d810966 100644 --- a/packages/google_maps_flutter/google_maps_flutter/pubspec.yaml +++ b/packages/google_maps_flutter/google_maps_flutter/pubspec.yaml @@ -2,7 +2,7 @@ name: google_maps_flutter description: A Flutter plugin for integrating Google Maps in iOS and Android applications. repository: https://github.com/flutter/plugins/tree/main/packages/google_maps_flutter/google_maps_flutter issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+maps%22 -version: 2.2.0 +version: 2.2.1 environment: sdk: ">=2.14.0 <3.0.0" diff --git a/packages/google_maps_flutter/google_maps_flutter/test/polygon_updates_test.dart b/packages/google_maps_flutter/google_maps_flutter/test/polygon_updates_test.dart index cb7263c02e05..34959832b36b 100644 --- a/packages/google_maps_flutter/google_maps_flutter/test/polygon_updates_test.dart +++ b/packages/google_maps_flutter/google_maps_flutter/test/polygon_updates_test.dart @@ -123,10 +123,10 @@ void main() { }); testWidgets('Mutate a polygon', (WidgetTester tester) async { - final List _points = [const LatLng(0.0, 0.0)]; + final List points = [const LatLng(0.0, 0.0)]; final Polygon p1 = Polygon( polygonId: const PolygonId('polygon_1'), - points: _points, + points: points, ); await tester.pumpWidget(_mapWithPolygons({p1})); diff --git a/packages/google_maps_flutter/google_maps_flutter/test/polyline_updates_test.dart b/packages/google_maps_flutter/google_maps_flutter/test/polyline_updates_test.dart index a2dad92f8eb4..f9d091695383 100644 --- a/packages/google_maps_flutter/google_maps_flutter/test/polyline_updates_test.dart +++ b/packages/google_maps_flutter/google_maps_flutter/test/polyline_updates_test.dart @@ -117,10 +117,10 @@ void main() { }); testWidgets('Mutate a polyline', (WidgetTester tester) async { - final List _points = [const LatLng(0.0, 0.0)]; + final List points = [const LatLng(0.0, 0.0)]; final Polyline p1 = Polyline( polylineId: const PolylineId('polyline_1'), - points: _points, + points: points, ); await tester.pumpWidget(_mapWithPolylines({p1})); diff --git a/packages/google_maps_flutter/google_maps_flutter_android/CHANGELOG.md b/packages/google_maps_flutter/google_maps_flutter_android/CHANGELOG.md index 01c98f388e61..6fbd8d7e0b17 100644 --- a/packages/google_maps_flutter/google_maps_flutter_android/CHANGELOG.md +++ b/packages/google_maps_flutter/google_maps_flutter_android/CHANGELOG.md @@ -1,3 +1,11 @@ +## 2.3.2 + +* Update `com.google.android.gms:play-services-maps` to 18.1.0. + +## 2.3.1 + +* Updates imports for `prefer_relative_imports`. + ## 2.3.0 * Switches the default for `useAndroidViewSurface` to true, and adds diff --git a/packages/google_maps_flutter/google_maps_flutter_android/android/build.gradle b/packages/google_maps_flutter/google_maps_flutter_android/android/build.gradle index ecc85217c5bf..06599fc94c49 100644 --- a/packages/google_maps_flutter/google_maps_flutter_android/android/build.gradle +++ b/packages/google_maps_flutter/google_maps_flutter_android/android/build.gradle @@ -35,7 +35,7 @@ android { dependencies { implementation "androidx.annotation:annotation:1.1.0" - implementation 'com.google.android.gms:play-services-maps:18.0.2' + implementation 'com.google.android.gms:play-services-maps:18.1.0' androidTestImplementation 'androidx.test:runner:1.2.0' androidTestImplementation 'androidx.test:rules:1.4.0' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' diff --git a/packages/google_maps_flutter/google_maps_flutter_android/android/src/test/java/io/flutter/plugins/googlemaps/PolygonControllerTest.java b/packages/google_maps_flutter/google_maps_flutter_android/android/src/test/java/io/flutter/plugins/googlemaps/PolygonControllerTest.java index 5c73a3f3e449..271c63bdc25c 100644 --- a/packages/google_maps_flutter/google_maps_flutter_android/android/src/test/java/io/flutter/plugins/googlemaps/PolygonControllerTest.java +++ b/packages/google_maps_flutter/google_maps_flutter_android/android/src/test/java/io/flutter/plugins/googlemaps/PolygonControllerTest.java @@ -7,7 +7,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; -import com.google.android.gms.internal.maps.zzaa; +import com.google.android.gms.internal.maps.zzad; import com.google.android.gms.maps.model.Polygon; import org.junit.Test; import org.mockito.Mockito; @@ -16,7 +16,7 @@ public class PolygonControllerTest { @Test public void controller_SetsStrokeDensity() { - final zzaa z = mock(zzaa.class); + final zzad z = mock(zzad.class); final Polygon polygon = spy(new Polygon(z)); final float density = 5; diff --git a/packages/google_maps_flutter/google_maps_flutter_android/android/src/test/java/io/flutter/plugins/googlemaps/PolylineControllerTest.java b/packages/google_maps_flutter/google_maps_flutter_android/android/src/test/java/io/flutter/plugins/googlemaps/PolylineControllerTest.java index db570174e215..abb98627b35a 100644 --- a/packages/google_maps_flutter/google_maps_flutter_android/android/src/test/java/io/flutter/plugins/googlemaps/PolylineControllerTest.java +++ b/packages/google_maps_flutter/google_maps_flutter_android/android/src/test/java/io/flutter/plugins/googlemaps/PolylineControllerTest.java @@ -7,7 +7,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; -import com.google.android.gms.internal.maps.zzad; +import com.google.android.gms.internal.maps.zzag; import com.google.android.gms.maps.model.Polyline; import org.junit.Test; import org.mockito.Mockito; @@ -16,7 +16,7 @@ public class PolylineControllerTest { @Test public void controller_SetsStrokeDensity() { - final zzad z = mock(zzad.class); + final zzag z = mock(zzag.class); final Polyline polyline = spy(new Polyline(z)); final float density = 5; diff --git a/packages/google_maps_flutter/google_maps_flutter_android/example/lib/main.dart b/packages/google_maps_flutter/google_maps_flutter_android/example/lib/main.dart index 6b96e6f0dff8..4adec524f87b 100644 --- a/packages/google_maps_flutter/google_maps_flutter_android/example/lib/main.dart +++ b/packages/google_maps_flutter/google_maps_flutter_android/example/lib/main.dart @@ -4,10 +4,10 @@ import 'package:flutter/material.dart'; import 'package:google_maps_flutter_android/google_maps_flutter_android.dart'; -import 'package:google_maps_flutter_example/lite_mode.dart'; import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; import 'animate_camera.dart'; +import 'lite_mode.dart'; import 'map_click.dart'; import 'map_coordinates.dart'; import 'map_ui.dart'; diff --git a/packages/google_maps_flutter/google_maps_flutter_android/example/pubspec.yaml b/packages/google_maps_flutter/google_maps_flutter_android/example/pubspec.yaml index cd7123050a38..bc9a4dd03657 100644 --- a/packages/google_maps_flutter/google_maps_flutter_android/example/pubspec.yaml +++ b/packages/google_maps_flutter/google_maps_flutter_android/example/pubspec.yaml @@ -25,6 +25,8 @@ dev_dependencies: espresso: ^0.1.0+2 flutter_driver: sdk: flutter + flutter_test: + sdk: flutter integration_test: sdk: flutter diff --git a/packages/google_maps_flutter/google_maps_flutter_android/pubspec.yaml b/packages/google_maps_flutter/google_maps_flutter_android/pubspec.yaml index c820f31d1c46..798380b5854d 100644 --- a/packages/google_maps_flutter/google_maps_flutter_android/pubspec.yaml +++ b/packages/google_maps_flutter/google_maps_flutter_android/pubspec.yaml @@ -2,7 +2,7 @@ name: google_maps_flutter_android description: Android implementation of the google_maps_flutter plugin. repository: https://github.com/flutter/plugins/tree/main/packages/google_maps_flutter/google_maps_flutter_android issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+maps%22 -version: 2.3.0 +version: 2.3.2 environment: sdk: ">=2.14.0 <3.0.0" diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/CHANGELOG.md b/packages/google_maps_flutter/google_maps_flutter_ios/CHANGELOG.md index e3a033f3df07..7788e9146809 100644 --- a/packages/google_maps_flutter/google_maps_flutter_ios/CHANGELOG.md +++ b/packages/google_maps_flutter/google_maps_flutter_ios/CHANGELOG.md @@ -1,5 +1,6 @@ -## NEXT +## 2.1.12 +* Updates imports for `prefer_relative_imports`. * Updates minimum Flutter version to 2.10. * Fixes violations of new analysis option use_named_constants. * Fixes avoid_redundant_argument_values lint warnings and minor typos. diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/lib/main.dart b/packages/google_maps_flutter/google_maps_flutter_ios/example/lib/main.dart index c02e4afe428d..de75162b09dd 100644 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/lib/main.dart +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/lib/main.dart @@ -3,9 +3,9 @@ // found in the LICENSE file. import 'package:flutter/material.dart'; -import 'package:google_maps_flutter_example/lite_mode.dart'; import 'animate_camera.dart'; +import 'lite_mode.dart'; import 'map_click.dart'; import 'map_coordinates.dart'; import 'map_ui.dart'; diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/example/pubspec.yaml b/packages/google_maps_flutter/google_maps_flutter_ios/example/pubspec.yaml index d9d8d5899bdd..ae61f5d92f3c 100644 --- a/packages/google_maps_flutter/google_maps_flutter_ios/example/pubspec.yaml +++ b/packages/google_maps_flutter/google_maps_flutter_ios/example/pubspec.yaml @@ -18,10 +18,13 @@ dependencies: # The example app is bundled with the plugin so we use a path dependency on # the parent directory to use the current plugin's version. path: ../ + google_maps_flutter_platform_interface: ^2.2.1 dev_dependencies: flutter_driver: sdk: flutter + flutter_test: + sdk: flutter integration_test: sdk: flutter diff --git a/packages/google_maps_flutter/google_maps_flutter_ios/pubspec.yaml b/packages/google_maps_flutter/google_maps_flutter_ios/pubspec.yaml index f1e613806eb9..7ca13a9273f2 100644 --- a/packages/google_maps_flutter/google_maps_flutter_ios/pubspec.yaml +++ b/packages/google_maps_flutter/google_maps_flutter_ios/pubspec.yaml @@ -2,7 +2,7 @@ name: google_maps_flutter_ios description: iOS implementation of the google_maps_flutter plugin. repository: https://github.com/flutter/plugins/tree/main/packages/google_maps_flutter/google_maps_flutter_ios issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+maps%22 -version: 2.1.11 +version: 2.1.12 environment: sdk: ">=2.14.0 <3.0.0" diff --git a/packages/google_maps_flutter/google_maps_flutter_platform_interface/CHANGELOG.md b/packages/google_maps_flutter/google_maps_flutter_platform_interface/CHANGELOG.md index 5ef9142beea8..a41d1fe487f3 100644 --- a/packages/google_maps_flutter/google_maps_flutter_platform_interface/CHANGELOG.md +++ b/packages/google_maps_flutter/google_maps_flutter_platform_interface/CHANGELOG.md @@ -1,5 +1,10 @@ -## NEXT +## 2.2.4 +* Updates code for `no_leading_underscores_for_local_identifiers` lint. + +## 2.2.3 + +* Updates imports for `prefer_relative_imports`. * Updates minimum Flutter version to 2.10. ## 2.2.2 diff --git a/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/events/map_event.dart b/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/events/map_event.dart index 8759126d4b67..5961406c155c 100644 --- a/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/events/map_event.dart +++ b/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/events/map_event.dart @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; +import '../../google_maps_flutter_platform_interface.dart'; /// Generic Event coming from the native side of Maps. /// diff --git a/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/method_channel/method_channel_google_maps_flutter.dart b/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/method_channel/method_channel_google_maps_flutter.dart index a34ee48ac79a..e17510f90624 100644 --- a/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/method_channel/method_channel_google_maps_flutter.dart +++ b/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/method_channel/method_channel_google_maps_flutter.dart @@ -12,9 +12,9 @@ import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter/services.dart'; -import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; import 'package:stream_transform/stream_transform.dart'; +import '../../google_maps_flutter_platform_interface.dart'; import '../types/tile_overlay_updates.dart'; import '../types/utils/map_configuration_serialization.dart'; diff --git a/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/platform_interface/google_maps_flutter_platform.dart b/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/platform_interface/google_maps_flutter_platform.dart index d4621a70c249..147d64f715b7 100644 --- a/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/platform_interface/google_maps_flutter_platform.dart +++ b/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/platform_interface/google_maps_flutter_platform.dart @@ -12,10 +12,11 @@ import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; -import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; -import 'package:google_maps_flutter_platform_interface/src/types/utils/map_configuration_serialization.dart'; import 'package:plugin_platform_interface/plugin_platform_interface.dart'; +import '../../google_maps_flutter_platform_interface.dart'; +import '../types/utils/map_configuration_serialization.dart'; + /// The interface that platform-specific implementations of `google_maps_flutter` must extend. /// /// Avoid `implements` of this interface. Using `implements` makes adding any new diff --git a/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/platform_interface/google_maps_inspector_platform.dart b/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/platform_interface/google_maps_inspector_platform.dart index 70e332907939..1e07b97c300d 100644 --- a/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/platform_interface/google_maps_inspector_platform.dart +++ b/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/platform_interface/google_maps_inspector_platform.dart @@ -2,9 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart'; import 'package:plugin_platform_interface/plugin_platform_interface.dart'; +import '../../google_maps_flutter_platform_interface.dart'; + /// The interface that platform-specific implementations of /// `google_maps_flutter` can extend to support state inpsection in tests. /// diff --git a/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/types/maps_object_updates.dart b/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/types/maps_object_updates.dart index 0051afcefbab..efc319b60ced 100644 --- a/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/types/maps_object_updates.dart +++ b/packages/google_maps_flutter/google_maps_flutter_platform_interface/lib/src/types/maps_object_updates.dart @@ -31,7 +31,7 @@ class MapsObjectUpdates> { /// /// It is a programming error to call this with an ID that is not guaranteed /// to be in [currentObjects]. - T _idToCurrentObject(MapsObjectId id) { + T idToCurrentObject(MapsObjectId id) { return currentObjects[id]!; } @@ -39,7 +39,7 @@ class MapsObjectUpdates> { _objectsToAdd = currentObjectIds .difference(previousObjectIds) - .map(_idToCurrentObject) + .map(idToCurrentObject) .toSet(); // Returns `true` if [current] is not equals to previous one with the @@ -51,7 +51,7 @@ class MapsObjectUpdates> { _objectsToChange = currentObjectIds .intersection(previousObjectIds) - .map(_idToCurrentObject) + .map(idToCurrentObject) .where(hasChanged) .toSet(); } diff --git a/packages/google_maps_flutter/google_maps_flutter_platform_interface/pubspec.yaml b/packages/google_maps_flutter/google_maps_flutter_platform_interface/pubspec.yaml index 160819912a0a..5639ee8c6ad7 100644 --- a/packages/google_maps_flutter/google_maps_flutter_platform_interface/pubspec.yaml +++ b/packages/google_maps_flutter/google_maps_flutter_platform_interface/pubspec.yaml @@ -4,7 +4,7 @@ repository: https://github.com/flutter/plugins/tree/main/packages/google_maps_fl issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+maps%22 # NOTE: We strongly prefer non-breaking changes, even at the expense of a # less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes -version: 2.2.2 +version: 2.2.4 environment: sdk: '>=2.12.0 <3.0.0' diff --git a/packages/google_maps_flutter/google_maps_flutter_web/CHANGELOG.md b/packages/google_maps_flutter/google_maps_flutter_web/CHANGELOG.md index 541ac49f0a16..2333f7d16028 100644 --- a/packages/google_maps_flutter/google_maps_flutter_web/CHANGELOG.md +++ b/packages/google_maps_flutter/google_maps_flutter_web/CHANGELOG.md @@ -1,5 +1,10 @@ ## NEXT +* Updates code for `no_leading_underscores_for_local_identifiers` lint. + +## 0.4.0+3 + +* Updates imports for `prefer_relative_imports`. * Updates minimum Flutter version to 2.10. ## 0.4.0+2 diff --git a/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/google_maps_controller_test.dart b/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/google_maps_controller_test.dart index 4294f8715524..0226234ea97a 100644 --- a/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/google_maps_controller_test.dart +++ b/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/google_maps_controller_test.dart @@ -37,7 +37,7 @@ void main() { late StreamController> stream; // Creates a controller with the default mapId and stream controller, and any `options` needed. - GoogleMapController _createController({ + GoogleMapController createController({ CameraPosition initialCameraPosition = const CameraPosition(target: LatLng(0, 0)), MapObjects mapObjects = const MapObjects(), @@ -60,7 +60,7 @@ void main() { group('construct/dispose', () { setUp(() { - controller = _createController(); + controller = createController(); }); testWidgets('constructor creates widget', (WidgetTester tester) async { @@ -223,7 +223,7 @@ void main() { }); testWidgets('listens to map events', (WidgetTester tester) async { - controller = _createController(); + controller = createController(); controller.debugSetOverrides( createMap: (_, __) => map, circles: circles, @@ -262,7 +262,7 @@ void main() { testWidgets("binds geometry controllers to map's", (WidgetTester tester) async { - controller = _createController(); + controller = createController(); controller.debugSetOverrides( createMap: (_, __) => map, circles: circles, @@ -280,7 +280,7 @@ void main() { }); testWidgets('renders initial geometry', (WidgetTester tester) async { - controller = _createController( + controller = createController( mapObjects: MapObjects(circles: { const Circle( circleId: CircleId('circle-1'), @@ -360,7 +360,7 @@ void main() { testWidgets('empty infoWindow does not create InfoWindow instance.', (WidgetTester tester) async { - controller = _createController( + controller = createController( mapObjects: MapObjects(markers: { const Marker(markerId: MarkerId('marker-1')), })); @@ -383,7 +383,7 @@ void main() { capturedOptions = null; }); testWidgets('translates initial options', (WidgetTester tester) async { - controller = _createController( + controller = createController( mapConfiguration: const MapConfiguration( mapType: MapType.satellite, zoomControlsEnabled: true, @@ -406,7 +406,7 @@ void main() { testWidgets('disables gestureHandling with scrollGesturesEnabled false', (WidgetTester tester) async { - controller = _createController( + controller = createController( mapConfiguration: const MapConfiguration( scrollGesturesEnabled: false, )); @@ -426,7 +426,7 @@ void main() { testWidgets('disables gestureHandling with zoomGesturesEnabled false', (WidgetTester tester) async { - controller = _createController( + controller = createController( mapConfiguration: const MapConfiguration( zoomGesturesEnabled: false, )); @@ -446,7 +446,7 @@ void main() { testWidgets('sets initial position when passed', (WidgetTester tester) async { - controller = _createController( + controller = createController( initialCameraPosition: const CameraPosition( target: LatLng(43.308, -5.6910), zoom: 12, @@ -469,14 +469,14 @@ void main() { group('Traffic Layer', () { testWidgets('by default is disabled', (WidgetTester tester) async { - controller = _createController(); + controller = createController(); controller.init(); expect(controller.trafficLayer, isNull); }); testWidgets('initializes with traffic layer', (WidgetTester tester) async { - controller = _createController( + controller = createController( mapConfiguration: const MapConfiguration( trafficEnabled: true, )); @@ -498,7 +498,7 @@ void main() { ..zoom = 10 ..center = gmaps.LatLng(0, 0), ); - controller = _createController(); + controller = createController(); controller.debugSetOverrides(createMap: (_, __) => map); controller.init(); }); @@ -572,7 +572,7 @@ void main() { // These are the methods that get forwarded to other controllers, so we just verify calls. group('Pass-through methods', () { setUp(() { - controller = _createController(); + controller = createController(); }); testWidgets('updateCircles', (WidgetTester tester) async { diff --git a/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/google_maps_plugin_test.dart b/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/google_maps_plugin_test.dart index b4786c73b711..9bd1a68c6207 100644 --- a/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/google_maps_plugin_test.dart +++ b/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/google_maps_plugin_test.dart @@ -381,7 +381,7 @@ void main() { }); // Dispatches a few events in the global streamController, and expects *only* the passed event to be there. - Future _testStreamFiltering( + Future testStreamFiltering( Stream> stream, MapEvent event) async { Timer.run(() { streamController.add(_OtherMapEvent(mapId)); @@ -403,7 +403,7 @@ void main() { final Stream stream = plugin.onCameraMoveStarted(mapId: mapId); - await _testStreamFiltering(stream, event); + await testStreamFiltering(stream, event); }); testWidgets('onCameraMoveStarted', (WidgetTester tester) async { final CameraMoveEvent event = CameraMoveEvent( @@ -416,7 +416,7 @@ void main() { final Stream stream = plugin.onCameraMove(mapId: mapId); - await _testStreamFiltering(stream, event); + await testStreamFiltering(stream, event); }); testWidgets('onCameraIdle', (WidgetTester tester) async { final CameraIdleEvent event = CameraIdleEvent(mapId); @@ -424,7 +424,7 @@ void main() { final Stream stream = plugin.onCameraIdle(mapId: mapId); - await _testStreamFiltering(stream, event); + await testStreamFiltering(stream, event); }); // Marker events testWidgets('onMarkerTap', (WidgetTester tester) async { @@ -435,7 +435,7 @@ void main() { final Stream stream = plugin.onMarkerTap(mapId: mapId); - await _testStreamFiltering(stream, event); + await testStreamFiltering(stream, event); }); testWidgets('onInfoWindowTap', (WidgetTester tester) async { final InfoWindowTapEvent event = InfoWindowTapEvent( @@ -446,7 +446,7 @@ void main() { final Stream stream = plugin.onInfoWindowTap(mapId: mapId); - await _testStreamFiltering(stream, event); + await testStreamFiltering(stream, event); }); testWidgets('onMarkerDragStart', (WidgetTester tester) async { final MarkerDragStartEvent event = MarkerDragStartEvent( @@ -458,7 +458,7 @@ void main() { final Stream stream = plugin.onMarkerDragStart(mapId: mapId); - await _testStreamFiltering(stream, event); + await testStreamFiltering(stream, event); }); testWidgets('onMarkerDrag', (WidgetTester tester) async { final MarkerDragEvent event = MarkerDragEvent( @@ -470,7 +470,7 @@ void main() { final Stream stream = plugin.onMarkerDrag(mapId: mapId); - await _testStreamFiltering(stream, event); + await testStreamFiltering(stream, event); }); testWidgets('onMarkerDragEnd', (WidgetTester tester) async { final MarkerDragEndEvent event = MarkerDragEndEvent( @@ -482,7 +482,7 @@ void main() { final Stream stream = plugin.onMarkerDragEnd(mapId: mapId); - await _testStreamFiltering(stream, event); + await testStreamFiltering(stream, event); }); // Geometry testWidgets('onPolygonTap', (WidgetTester tester) async { @@ -494,7 +494,7 @@ void main() { final Stream stream = plugin.onPolygonTap(mapId: mapId); - await _testStreamFiltering(stream, event); + await testStreamFiltering(stream, event); }); testWidgets('onPolylineTap', (WidgetTester tester) async { final PolylineTapEvent event = PolylineTapEvent( @@ -505,7 +505,7 @@ void main() { final Stream stream = plugin.onPolylineTap(mapId: mapId); - await _testStreamFiltering(stream, event); + await testStreamFiltering(stream, event); }); testWidgets('onCircleTap', (WidgetTester tester) async { final CircleTapEvent event = CircleTapEvent( @@ -515,7 +515,7 @@ void main() { final Stream stream = plugin.onCircleTap(mapId: mapId); - await _testStreamFiltering(stream, event); + await testStreamFiltering(stream, event); }); // Map taps testWidgets('onTap', (WidgetTester tester) async { @@ -526,7 +526,7 @@ void main() { final Stream stream = plugin.onTap(mapId: mapId); - await _testStreamFiltering(stream, event); + await testStreamFiltering(stream, event); }); testWidgets('onLongPress', (WidgetTester tester) async { final MapLongPressEvent event = MapLongPressEvent( @@ -537,7 +537,7 @@ void main() { final Stream stream = plugin.onLongPress(mapId: mapId); - await _testStreamFiltering(stream, event); + await testStreamFiltering(stream, event); }); }); }); diff --git a/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/marker_test.dart b/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/marker_test.dart index e07ade03bba3..6591b0ca08d7 100644 --- a/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/marker_test.dart +++ b/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/marker_test.dart @@ -16,32 +16,32 @@ void main() { // Since onTap/DragEnd events happen asynchronously, we need to store when the event // is fired. We use a completer so the test can wait for the future to be completed. - late Completer _methodCalledCompleter; + late Completer methodCalledCompleter; - /// This is the future value of the [_methodCalledCompleter]. Reinitialized + /// This is the future value of the [methodCalledCompleter]. Reinitialized /// in the [setUp] method, and completed (as `true`) by [onTap] and [onDragEnd] /// when those methods are called from the MarkerController. late Future methodCalled; void onTap() { - _methodCalledCompleter.complete(true); + methodCalledCompleter.complete(true); } void onDragStart(gmaps.LatLng _) { - _methodCalledCompleter.complete(true); + methodCalledCompleter.complete(true); } void onDrag(gmaps.LatLng _) { - _methodCalledCompleter.complete(true); + methodCalledCompleter.complete(true); } void onDragEnd(gmaps.LatLng _) { - _methodCalledCompleter.complete(true); + methodCalledCompleter.complete(true); } setUp(() { - _methodCalledCompleter = Completer(); - methodCalled = _methodCalledCompleter.future; + methodCalledCompleter = Completer(); + methodCalled = methodCalledCompleter.future; }); group('MarkerController', () { diff --git a/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/shape_test.dart b/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/shape_test.dart index d1426760ceae..11af181cffc2 100644 --- a/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/shape_test.dart +++ b/packages/google_maps_flutter/google_maps_flutter_web/example/integration_test/shape_test.dart @@ -15,20 +15,20 @@ void main() { // Since onTap events happen asynchronously, we need to store when the event // is fired. We use a completer so the test can wait for the future to be completed. - late Completer _methodCalledCompleter; + late Completer methodCalledCompleter; - /// This is the future value of the [_methodCalledCompleter]. Reinitialized + /// This is the future value of the [methodCalledCompleter]. Reinitialized /// in the [setUp] method, and completed (as `true`) by [onTap], when it gets /// called by the corresponding Shape Controller. late Future methodCalled; void onTap() { - _methodCalledCompleter.complete(true); + methodCalledCompleter.complete(true); } setUp(() { - _methodCalledCompleter = Completer(); - methodCalled = _methodCalledCompleter.future; + methodCalledCompleter = Completer(); + methodCalled = methodCalledCompleter.future; }); group('CircleController', () { diff --git a/packages/google_maps_flutter/google_maps_flutter_web/example/pubspec.yaml b/packages/google_maps_flutter/google_maps_flutter_web/example/pubspec.yaml index 8ec25c6bee72..7e25b6e3b483 100644 --- a/packages/google_maps_flutter/google_maps_flutter_web/example/pubspec.yaml +++ b/packages/google_maps_flutter/google_maps_flutter_web/example/pubspec.yaml @@ -9,6 +9,7 @@ environment: dependencies: flutter: sdk: flutter + google_maps_flutter_platform_interface: ^2.2.1 google_maps_flutter_web: path: ../ diff --git a/packages/google_maps_flutter/google_maps_flutter_web/lib/src/types.dart b/packages/google_maps_flutter/google_maps_flutter_web/lib/src/types.dart index 84c66264db7b..d4e87799f4b3 100644 --- a/packages/google_maps_flutter/google_maps_flutter_web/lib/src/types.dart +++ b/packages/google_maps_flutter/google_maps_flutter_web/lib/src/types.dart @@ -3,7 +3,8 @@ // found in the LICENSE file. import 'package:google_maps/google_maps.dart' as gmaps; -import 'package:google_maps_flutter_web/google_maps_flutter_web.dart'; + +import '../../google_maps_flutter_web.dart'; /// A void function that handles a [gmaps.LatLng] as a parameter. /// diff --git a/packages/google_maps_flutter/google_maps_flutter_web/pubspec.yaml b/packages/google_maps_flutter/google_maps_flutter_web/pubspec.yaml index cb4063e315bc..572d9110be8e 100644 --- a/packages/google_maps_flutter/google_maps_flutter_web/pubspec.yaml +++ b/packages/google_maps_flutter/google_maps_flutter_web/pubspec.yaml @@ -2,7 +2,7 @@ name: google_maps_flutter_web description: Web platform implementation of google_maps_flutter repository: https://github.com/flutter/plugins/tree/main/packages/google_maps_flutter/google_maps_flutter_web issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+maps%22 -version: 0.4.0+2 +version: 0.4.0+3 environment: sdk: ">=2.12.0 <3.0.0" diff --git a/packages/google_sign_in/google_sign_in/example/pubspec.yaml b/packages/google_sign_in/google_sign_in/example/pubspec.yaml index 2ade7d324201..b836ffea4664 100644 --- a/packages/google_sign_in/google_sign_in/example/pubspec.yaml +++ b/packages/google_sign_in/google_sign_in/example/pubspec.yaml @@ -22,6 +22,8 @@ dev_dependencies: espresso: ^0.1.0+2 flutter_driver: sdk: flutter + flutter_test: + sdk: flutter integration_test: sdk: flutter diff --git a/packages/google_sign_in/google_sign_in_android/CHANGELOG.md b/packages/google_sign_in/google_sign_in_android/CHANGELOG.md index b10c578cd125..342166a8a6af 100644 --- a/packages/google_sign_in/google_sign_in_android/CHANGELOG.md +++ b/packages/google_sign_in/google_sign_in_android/CHANGELOG.md @@ -2,6 +2,7 @@ * Corrects typos in plugin error logs and removes not actionable warnings. * Updates minimum Flutter version to 2.10. +* Updates play-services-auth version to 20.3.0. ## 6.1.0 diff --git a/packages/google_sign_in/google_sign_in_android/android/build.gradle b/packages/google_sign_in/google_sign_in_android/android/build.gradle index 0c891918aa08..3384029d666a 100644 --- a/packages/google_sign_in/google_sign_in_android/android/build.gradle +++ b/packages/google_sign_in/google_sign_in_android/android/build.gradle @@ -48,7 +48,7 @@ android { } dependencies { - implementation 'com.google.android.gms:play-services-auth:20.0.1' + implementation 'com.google.android.gms:play-services-auth:20.3.0' implementation 'com.google.guava:guava:28.1-android' testImplementation 'junit:junit:4.13.2' testImplementation 'org.mockito:mockito-inline:4.7.0' diff --git a/packages/google_sign_in/google_sign_in_android/example/pubspec.yaml b/packages/google_sign_in/google_sign_in_android/example/pubspec.yaml index b7b104c3307e..f81df99b7d28 100644 --- a/packages/google_sign_in/google_sign_in_android/example/pubspec.yaml +++ b/packages/google_sign_in/google_sign_in_android/example/pubspec.yaml @@ -23,6 +23,8 @@ dev_dependencies: espresso: ^0.1.0+2 flutter_driver: sdk: flutter + flutter_test: + sdk: flutter integration_test: sdk: flutter diff --git a/packages/google_sign_in/google_sign_in_ios/example/pubspec.yaml b/packages/google_sign_in/google_sign_in_ios/example/pubspec.yaml index a6c97a5678cb..aedc4b01aade 100644 --- a/packages/google_sign_in/google_sign_in_ios/example/pubspec.yaml +++ b/packages/google_sign_in/google_sign_in_ios/example/pubspec.yaml @@ -22,6 +22,8 @@ dependencies: dev_dependencies: flutter_driver: sdk: flutter + flutter_test: + sdk: flutter integration_test: sdk: flutter diff --git a/packages/google_sign_in/google_sign_in_web/CHANGELOG.md b/packages/google_sign_in/google_sign_in_web/CHANGELOG.md index 51842e4319a0..2816e7284b30 100644 --- a/packages/google_sign_in/google_sign_in_web/CHANGELOG.md +++ b/packages/google_sign_in/google_sign_in_web/CHANGELOG.md @@ -1,5 +1,6 @@ ## NEXT +* Updates code for `no_leading_underscores_for_local_identifiers` lint. * Updates minimum Flutter version to 2.10. ## 0.10.2 diff --git a/packages/google_sign_in/google_sign_in_web/example/integration_test/auth2_legacy_init_test.dart b/packages/google_sign_in/google_sign_in_web/example/integration_test/auth2_legacy_init_test.dart index 12f8f2f3f167..5dada90397fa 100644 --- a/packages/google_sign_in/google_sign_in_web/example/integration_test/auth2_legacy_init_test.dart +++ b/packages/google_sign_in/google_sign_in_web/example/integration_test/auth2_legacy_init_test.dart @@ -71,7 +71,7 @@ void main() { group('other methods also throw catchable exceptions on initialize fail', () { // This function ensures that initialize gets called, but for some reason, // we ignored that it has thrown stuff... - Future _discardInit() async { + Future discardInit() async { try { await plugin.init( hostedDomain: 'foo', @@ -89,23 +89,23 @@ void main() { }); testWidgets('signInSilently throws', (WidgetTester tester) async { - await _discardInit(); + await discardInit(); await expectLater( plugin.signInSilently(), throwsA(isA())); }); testWidgets('signIn throws', (WidgetTester tester) async { - await _discardInit(); + await discardInit(); await expectLater(plugin.signIn(), throwsA(isA())); }); testWidgets('getTokens throws', (WidgetTester tester) async { - await _discardInit(); + await discardInit(); await expectLater(plugin.getTokens(email: 'test@example.com'), throwsA(isA())); }); testWidgets('requestScopes', (WidgetTester tester) async { - await _discardInit(); + await discardInit(); await expectLater(plugin.requestScopes(['newScope']), throwsA(isA())); }); diff --git a/packages/google_sign_in/google_sign_in_web/example/integration_test/auth2_test.dart b/packages/google_sign_in/google_sign_in_web/example/integration_test/auth2_test.dart index 81d9f1489a23..3e803b83fa0c 100644 --- a/packages/google_sign_in/google_sign_in_web/example/integration_test/auth2_test.dart +++ b/packages/google_sign_in/google_sign_in_web/example/integration_test/auth2_test.dart @@ -66,7 +66,7 @@ void main() { () { // This function ensures that initWithParams gets called, but for some // reason, we ignored that it has thrown stuff... - Future _discardInit() async { + Future discardInit() async { try { await plugin.initWithParams(const SignInInitParameters( hostedDomain: 'foo', @@ -84,23 +84,23 @@ void main() { }); testWidgets('signInSilently throws', (WidgetTester tester) async { - await _discardInit(); + await discardInit(); await expectLater( plugin.signInSilently(), throwsA(isA())); }); testWidgets('signIn throws', (WidgetTester tester) async { - await _discardInit(); + await discardInit(); await expectLater(plugin.signIn(), throwsA(isA())); }); testWidgets('getTokens throws', (WidgetTester tester) async { - await _discardInit(); + await discardInit(); await expectLater(plugin.getTokens(email: 'test@example.com'), throwsA(isA())); }); testWidgets('requestScopes', (WidgetTester tester) async { - await _discardInit(); + await discardInit(); await expectLater(plugin.requestScopes(['newScope']), throwsA(isA())); }); diff --git a/packages/google_sign_in/google_sign_in_web/example/pubspec.yaml b/packages/google_sign_in/google_sign_in_web/example/pubspec.yaml index ea4b1002d79f..e5abdacf944d 100644 --- a/packages/google_sign_in/google_sign_in_web/example/pubspec.yaml +++ b/packages/google_sign_in/google_sign_in_web/example/pubspec.yaml @@ -16,6 +16,7 @@ dev_dependencies: sdk: flutter flutter_test: sdk: flutter + google_sign_in_platform_interface: ^2.2.0 http: ^0.13.0 integration_test: sdk: flutter diff --git a/packages/image_picker/image_picker/example/pubspec.yaml b/packages/image_picker/image_picker/example/pubspec.yaml index b511cde0a554..e9511e27ab6d 100755 --- a/packages/image_picker/image_picker/example/pubspec.yaml +++ b/packages/image_picker/image_picker/example/pubspec.yaml @@ -23,6 +23,8 @@ dev_dependencies: espresso: ^0.2.0 flutter_driver: sdk: flutter + flutter_test: + sdk: flutter integration_test: sdk: flutter diff --git a/packages/image_picker/image_picker_android/example/pubspec.yaml b/packages/image_picker/image_picker_android/example/pubspec.yaml index ac4cb232f02d..02ef8a02af4c 100755 --- a/packages/image_picker/image_picker_android/example/pubspec.yaml +++ b/packages/image_picker/image_picker_android/example/pubspec.yaml @@ -24,6 +24,8 @@ dev_dependencies: espresso: ^0.2.0 flutter_driver: sdk: flutter + flutter_test: + sdk: flutter integration_test: sdk: flutter diff --git a/packages/image_picker/image_picker_for_web/CHANGELOG.md b/packages/image_picker/image_picker_for_web/CHANGELOG.md index 99d3dbc11121..8a5c089ef807 100644 --- a/packages/image_picker/image_picker_for_web/CHANGELOG.md +++ b/packages/image_picker/image_picker_for_web/CHANGELOG.md @@ -1,5 +1,10 @@ -## NEXT +## 2.1.10 +* Updates code for `no_leading_underscores_for_local_identifiers` lint. + +## 2.1.9 + +* Updates imports for `prefer_relative_imports`. * Updates minimum Flutter version to 2.10. * Fixes violations of new analysis option use_named_constants. diff --git a/packages/image_picker/image_picker_for_web/example/pubspec.yaml b/packages/image_picker/image_picker_for_web/example/pubspec.yaml index bb226e0c9c10..c39bd81f9de0 100644 --- a/packages/image_picker/image_picker_for_web/example/pubspec.yaml +++ b/packages/image_picker/image_picker_for_web/example/pubspec.yaml @@ -10,6 +10,7 @@ dependencies: sdk: flutter image_picker_for_web: path: ../ + image_picker_platform_interface: ^2.2.0 dev_dependencies: flutter_driver: diff --git a/packages/image_picker/image_picker_for_web/lib/image_picker_for_web.dart b/packages/image_picker/image_picker_for_web/lib/image_picker_for_web.dart index 88d439c5487f..bb261f76f320 100644 --- a/packages/image_picker/image_picker_for_web/lib/image_picker_for_web.dart +++ b/packages/image_picker/image_picker_for_web/lib/image_picker_for_web.dart @@ -7,9 +7,10 @@ import 'dart:html' as html; import 'package:flutter/foundation.dart' show visibleForTesting; import 'package:flutter_web_plugins/flutter_web_plugins.dart'; -import 'package:image_picker_for_web/src/image_resizer.dart'; import 'package:image_picker_platform_interface/image_picker_platform_interface.dart'; +import 'src/image_resizer.dart'; + const String _kImagePickerInputsDomId = '__image_picker_web-file-input'; const String _kAcceptImageMimeType = 'image/*'; const String _kAcceptVideoMimeType = 'video/3gpp,video/x-m4v,video/mp4,video/*'; @@ -243,35 +244,35 @@ class ImagePickerPlugin extends ImagePickerPlatform { /// Monitors an and returns the selected file. Future _getSelectedFile(html.FileUploadInputElement input) { - final Completer _completer = Completer(); + final Completer completer = Completer(); // Observe the input until we can return something input.onChange.first.then((html.Event event) { final List? files = _handleOnChangeEvent(event); - if (!_completer.isCompleted && files != null) { - _completer.complete(PickedFile( + if (!completer.isCompleted && files != null) { + completer.complete(PickedFile( html.Url.createObjectUrl(files.first), )); } }); input.onError.first.then((html.Event event) { - if (!_completer.isCompleted) { - _completer.completeError(event); + if (!completer.isCompleted) { + completer.completeError(event); } }); // Note that we don't bother detaching from these streams, since the // "input" gets re-created in the DOM every time the user needs to // pick a file. - return _completer.future; + return completer.future; } /// Monitors an and returns the selected file(s). Future> _getSelectedXFiles(html.FileUploadInputElement input) { - final Completer> _completer = Completer>(); + final Completer> completer = Completer>(); // Observe the input until we can return something input.onChange.first.then((html.Event event) { final List? files = _handleOnChangeEvent(event); - if (!_completer.isCompleted && files != null) { - _completer.complete(files.map((html.File file) { + if (!completer.isCompleted && files != null) { + completer.complete(files.map((html.File file) { return XFile( html.Url.createObjectUrl(file), name: file.name, @@ -285,14 +286,14 @@ class ImagePickerPlugin extends ImagePickerPlatform { } }); input.onError.first.then((html.Event event) { - if (!_completer.isCompleted) { - _completer.completeError(event); + if (!completer.isCompleted) { + completer.completeError(event); } }); // Note that we don't bother detaching from these streams, since the // "input" gets re-created in the DOM every time the user needs to // pick a file. - return _completer.future; + return completer.future; } /// Initializes a DOM container where we can host input elements. diff --git a/packages/image_picker/image_picker_for_web/lib/src/image_resizer.dart b/packages/image_picker/image_picker_for_web/lib/src/image_resizer.dart index ba794acae3be..7cca935c6c91 100644 --- a/packages/image_picker/image_picker_for_web/lib/src/image_resizer.dart +++ b/packages/image_picker/image_picker_for_web/lib/src/image_resizer.dart @@ -7,9 +7,10 @@ import 'dart:html' as html; import 'dart:math'; import 'dart:ui'; -import 'package:image_picker_for_web/src/image_resizer_utils.dart'; import 'package:image_picker_platform_interface/image_picker_platform_interface.dart'; +import 'image_resizer_utils.dart'; + /// Helper class that resizes images. class ImageResizer { /// Resizes the image if needed. diff --git a/packages/image_picker/image_picker_for_web/pubspec.yaml b/packages/image_picker/image_picker_for_web/pubspec.yaml index e19147b6306e..c2e0975dda57 100644 --- a/packages/image_picker/image_picker_for_web/pubspec.yaml +++ b/packages/image_picker/image_picker_for_web/pubspec.yaml @@ -2,7 +2,7 @@ name: image_picker_for_web description: Web platform implementation of image_picker repository: https://github.com/flutter/plugins/tree/main/packages/image_picker/image_picker_for_web issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+image_picker%22 -version: 2.1.8 +version: 2.1.10 environment: sdk: ">=2.12.0 <3.0.0" diff --git a/packages/image_picker/image_picker_ios/example/pubspec.yaml b/packages/image_picker/image_picker_ios/example/pubspec.yaml index bca58a553682..856f775cc641 100755 --- a/packages/image_picker/image_picker_ios/example/pubspec.yaml +++ b/packages/image_picker/image_picker_ios/example/pubspec.yaml @@ -22,6 +22,8 @@ dependencies: dev_dependencies: flutter_driver: sdk: flutter + flutter_test: + sdk: flutter integration_test: sdk: flutter diff --git a/packages/image_picker/image_picker_platform_interface/CHANGELOG.md b/packages/image_picker/image_picker_platform_interface/CHANGELOG.md index 8defffe95a7a..05b03a37cb98 100644 --- a/packages/image_picker/image_picker_platform_interface/CHANGELOG.md +++ b/packages/image_picker/image_picker_platform_interface/CHANGELOG.md @@ -1,5 +1,6 @@ -## NEXT +## 2.6.2 +* Updates imports for `prefer_relative_imports`. * Updates minimum Flutter version to 2.10. * Fixes avoid_redundant_argument_values lint warnings and minor typos. diff --git a/packages/image_picker/image_picker_platform_interface/lib/src/method_channel/method_channel_image_picker.dart b/packages/image_picker/image_picker_platform_interface/lib/src/method_channel/method_channel_image_picker.dart index 80d33807b70d..c2c39f93fe18 100644 --- a/packages/image_picker/image_picker_platform_interface/lib/src/method_channel/method_channel_image_picker.dart +++ b/packages/image_picker/image_picker_platform_interface/lib/src/method_channel/method_channel_image_picker.dart @@ -7,7 +7,7 @@ import 'dart:async'; import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; -import 'package:image_picker_platform_interface/image_picker_platform_interface.dart'; +import '../../image_picker_platform_interface.dart'; const MethodChannel _channel = MethodChannel('plugins.flutter.io/image_picker'); diff --git a/packages/image_picker/image_picker_platform_interface/lib/src/platform_interface/image_picker_platform.dart b/packages/image_picker/image_picker_platform_interface/lib/src/platform_interface/image_picker_platform.dart index f704025f581b..9572742e62e0 100644 --- a/packages/image_picker/image_picker_platform_interface/lib/src/platform_interface/image_picker_platform.dart +++ b/packages/image_picker/image_picker_platform_interface/lib/src/platform_interface/image_picker_platform.dart @@ -5,10 +5,11 @@ import 'dart:async'; import 'package:cross_file/cross_file.dart'; -import 'package:image_picker_platform_interface/src/method_channel/method_channel_image_picker.dart'; -import 'package:image_picker_platform_interface/src/types/types.dart'; import 'package:plugin_platform_interface/plugin_platform_interface.dart'; +import '../method_channel/method_channel_image_picker.dart'; +import '../types/types.dart'; + /// The interface that implementations of image_picker must implement. /// /// Platform implementations should extend this class rather than implement it as `image_picker` diff --git a/packages/image_picker/image_picker_platform_interface/lib/src/types/image_picker_options.dart b/packages/image_picker/image_picker_platform_interface/lib/src/types/image_picker_options.dart index cdc89a920178..0d85c918f649 100644 --- a/packages/image_picker/image_picker_platform_interface/lib/src/types/image_picker_options.dart +++ b/packages/image_picker/image_picker_platform_interface/lib/src/types/image_picker_options.dart @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'package:image_picker_platform_interface/src/types/types.dart'; +import 'types.dart'; /// Specifies options for picking a single image from the device's camera or gallery. class ImagePickerOptions { diff --git a/packages/image_picker/image_picker_platform_interface/lib/src/types/lost_data_response.dart b/packages/image_picker/image_picker_platform_interface/lib/src/types/lost_data_response.dart index 65f5d7e15c90..10af812a3109 100644 --- a/packages/image_picker/image_picker_platform_interface/lib/src/types/lost_data_response.dart +++ b/packages/image_picker/image_picker_platform_interface/lib/src/types/lost_data_response.dart @@ -4,7 +4,8 @@ import 'package:cross_file/cross_file.dart'; import 'package:flutter/services.dart'; -import 'package:image_picker_platform_interface/src/types/types.dart'; + +import 'types.dart'; /// The response object of [ImagePicker.getLostData]. /// diff --git a/packages/image_picker/image_picker_platform_interface/lib/src/types/multi_image_picker_options.dart b/packages/image_picker/image_picker_platform_interface/lib/src/types/multi_image_picker_options.dart index 4d7971c59a81..c860297ce33f 100644 --- a/packages/image_picker/image_picker_platform_interface/lib/src/types/multi_image_picker_options.dart +++ b/packages/image_picker/image_picker_platform_interface/lib/src/types/multi_image_picker_options.dart @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'package:image_picker_platform_interface/src/types/image_options.dart'; +import 'image_options.dart'; /// Specifies options for picking multiple images from the device's gallery. class MultiImagePickerOptions { diff --git a/packages/image_picker/image_picker_platform_interface/lib/src/types/picked_file/lost_data.dart b/packages/image_picker/image_picker_platform_interface/lib/src/types/picked_file/lost_data.dart index 64f6a1f27538..ddd36b62c023 100644 --- a/packages/image_picker/image_picker_platform_interface/lib/src/types/picked_file/lost_data.dart +++ b/packages/image_picker/image_picker_platform_interface/lib/src/types/picked_file/lost_data.dart @@ -3,7 +3,8 @@ // found in the LICENSE file. import 'package:flutter/services.dart'; -import 'package:image_picker_platform_interface/src/types/types.dart'; + +import '../types.dart'; /// The response object of [ImagePicker.retrieveLostData]. /// diff --git a/packages/image_picker/image_picker_platform_interface/pubspec.yaml b/packages/image_picker/image_picker_platform_interface/pubspec.yaml index f4b745f2c1bf..eb4d2b649eac 100644 --- a/packages/image_picker/image_picker_platform_interface/pubspec.yaml +++ b/packages/image_picker/image_picker_platform_interface/pubspec.yaml @@ -4,7 +4,7 @@ repository: https://github.com/flutter/plugins/tree/main/packages/image_picker/i issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+image_picker%22 # NOTE: We strongly prefer non-breaking changes, even at the expense of a # less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes -version: 2.6.1 +version: 2.6.2 environment: sdk: ">=2.12.0 <3.0.0" diff --git a/packages/image_picker/image_picker_windows/example/pubspec.yaml b/packages/image_picker/image_picker_windows/example/pubspec.yaml index 1a48e6ddc14b..b87000a6caff 100644 --- a/packages/image_picker/image_picker_windows/example/pubspec.yaml +++ b/packages/image_picker/image_picker_windows/example/pubspec.yaml @@ -10,6 +10,7 @@ environment: dependencies: flutter: sdk: flutter + image_picker_platform_interface: ^2.4.3 image_picker_windows: # When depending on this package from a real application you should use: # image_picker_windows: ^x.y.z diff --git a/packages/image_picker/image_picker_windows/lib/image_picker_windows.dart b/packages/image_picker/image_picker_windows/lib/image_picker_windows.dart index 0c6d6fbd6d66..10880d12ae6b 100644 --- a/packages/image_picker/image_picker_windows/lib/image_picker_windows.dart +++ b/packages/image_picker/image_picker_windows/lib/image_picker_windows.dart @@ -119,6 +119,8 @@ class ImagePickerWindows extends ImagePickerPlatform { 'ImageSource.gallery is currently the only supported source on Windows'); } final XTypeGroup typeGroup = + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors XTypeGroup(label: 'images', extensions: imageFormats); final XFile? file = await fileSelector .openFile(acceptedTypeGroups: [typeGroup]); @@ -143,6 +145,8 @@ class ImagePickerWindows extends ImagePickerPlatform { 'ImageSource.gallery is currently the only supported source on Windows'); } final XTypeGroup typeGroup = + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors XTypeGroup(label: 'videos', extensions: videoFormats); final XFile? file = await fileSelector .openFile(acceptedTypeGroups: [typeGroup]); @@ -159,6 +163,8 @@ class ImagePickerWindows extends ImagePickerPlatform { int? imageQuality, }) async { final XTypeGroup typeGroup = + // TODO(stuartmorgan): https://github.com/flutter/flutter/issues/111906 + // ignore: prefer_const_constructors XTypeGroup(label: 'images', extensions: imageFormats); final List files = await fileSelector .openFiles(acceptedTypeGroups: [typeGroup]); diff --git a/packages/in_app_purchase/in_app_purchase/example/android/app/build.gradle b/packages/in_app_purchase/in_app_purchase/example/android/app/build.gradle index d0c62753faa1..9bb39660cf05 100644 --- a/packages/in_app_purchase/in_app_purchase/example/android/app/build.gradle +++ b/packages/in_app_purchase/in_app_purchase/example/android/app/build.gradle @@ -109,7 +109,7 @@ dependencies { implementation 'com.android.billingclient:billing:3.0.2' testImplementation 'junit:junit:4.13.2' testImplementation 'org.mockito:mockito-core:4.7.0' - testImplementation 'org.json:json:20180813' + testImplementation 'org.json:json:20220924' androidTestImplementation 'androidx.test:runner:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' } diff --git a/packages/in_app_purchase/in_app_purchase/example/pubspec.yaml b/packages/in_app_purchase/in_app_purchase/example/pubspec.yaml index 0b4ea28bc7f6..74ad9aafb768 100644 --- a/packages/in_app_purchase/in_app_purchase/example/pubspec.yaml +++ b/packages/in_app_purchase/in_app_purchase/example/pubspec.yaml @@ -16,12 +16,15 @@ dependencies: # The example app is bundled with the plugin so we use a path dependency on # the parent directory to use the current plugin's version. path: ../ + in_app_purchase_android: ^0.2.1 + in_app_purchase_storekit: ^0.3.0+1 shared_preferences: ^2.0.0 dev_dependencies: flutter_driver: sdk: flutter - + flutter_test: + sdk: flutter integration_test: sdk: flutter diff --git a/packages/in_app_purchase/in_app_purchase_android/CHANGELOG.md b/packages/in_app_purchase/in_app_purchase_android/CHANGELOG.md index 8733a1c4133c..6540fdfedafe 100644 --- a/packages/in_app_purchase/in_app_purchase_android/CHANGELOG.md +++ b/packages/in_app_purchase/in_app_purchase_android/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.2.3+5 + +* Updates imports for `prefer_relative_imports`. + ## 0.2.3+4 * Updates minimum Flutter version to 2.10. diff --git a/packages/in_app_purchase/in_app_purchase_android/example/pubspec.yaml b/packages/in_app_purchase/in_app_purchase_android/example/pubspec.yaml index 69e3ca755993..af760a3ada46 100644 --- a/packages/in_app_purchase/in_app_purchase_android/example/pubspec.yaml +++ b/packages/in_app_purchase/in_app_purchase_android/example/pubspec.yaml @@ -22,6 +22,8 @@ dependencies: dev_dependencies: flutter_driver: sdk: flutter + flutter_test: + sdk: flutter integration_test: sdk: flutter diff --git a/packages/in_app_purchase/in_app_purchase_android/lib/src/in_app_purchase_android_platform.dart b/packages/in_app_purchase/in_app_purchase_android/lib/src/in_app_purchase_android_platform.dart index 14dd69364497..d73ca8ef2e00 100644 --- a/packages/in_app_purchase/in_app_purchase_android/lib/src/in_app_purchase_android_platform.dart +++ b/packages/in_app_purchase/in_app_purchase_android/lib/src/in_app_purchase_android_platform.dart @@ -6,10 +6,10 @@ import 'dart:async'; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; -import 'package:in_app_purchase_android/in_app_purchase_android.dart'; import 'package:in_app_purchase_platform_interface/in_app_purchase_platform_interface.dart'; import '../billing_client_wrappers.dart'; +import '../in_app_purchase_android.dart'; /// [IAPError.code] code for failed purchases. const String kPurchaseErrorCode = 'purchase_error'; diff --git a/packages/in_app_purchase/in_app_purchase_android/lib/src/in_app_purchase_android_platform_addition.dart b/packages/in_app_purchase/in_app_purchase_android/lib/src/in_app_purchase_android_platform_addition.dart index db53ff4077d2..d5657d1a38d8 100644 --- a/packages/in_app_purchase/in_app_purchase_android/lib/src/in_app_purchase_android_platform_addition.dart +++ b/packages/in_app_purchase/in_app_purchase_android/lib/src/in_app_purchase_android_platform_addition.dart @@ -3,10 +3,10 @@ // found in the LICENSE file. import 'package:flutter/services.dart'; -import 'package:in_app_purchase_android/in_app_purchase_android.dart'; import 'package:in_app_purchase_platform_interface/in_app_purchase_platform_interface.dart'; import '../billing_client_wrappers.dart'; +import '../in_app_purchase_android.dart'; /// Contains InApp Purchase features that are only available on PlayStore. class InAppPurchaseAndroidPlatformAddition diff --git a/packages/in_app_purchase/in_app_purchase_android/lib/src/types/google_play_product_details.dart b/packages/in_app_purchase/in_app_purchase_android/lib/src/types/google_play_product_details.dart index 15ed16c7e2ec..7affa242055b 100644 --- a/packages/in_app_purchase/in_app_purchase_android/lib/src/types/google_play_product_details.dart +++ b/packages/in_app_purchase/in_app_purchase_android/lib/src/types/google_play_product_details.dart @@ -2,9 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'package:in_app_purchase_android/billing_client_wrappers.dart'; import 'package:in_app_purchase_platform_interface/in_app_purchase_platform_interface.dart'; +import '../../billing_client_wrappers.dart'; + /// The class represents the information of a product as registered in at /// Google Play store front. class GooglePlayProductDetails extends ProductDetails { diff --git a/packages/in_app_purchase/in_app_purchase_android/pubspec.yaml b/packages/in_app_purchase/in_app_purchase_android/pubspec.yaml index a0563f1434b8..8c57a982937b 100644 --- a/packages/in_app_purchase/in_app_purchase_android/pubspec.yaml +++ b/packages/in_app_purchase/in_app_purchase_android/pubspec.yaml @@ -2,7 +2,7 @@ name: in_app_purchase_android description: An implementation for the Android platform of the Flutter `in_app_purchase` plugin. This uses the Android BillingClient APIs. repository: https://github.com/flutter/plugins/tree/main/packages/in_app_purchase/in_app_purchase_android issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+in_app_purchase%22 -version: 0.2.3+4 +version: 0.2.3+5 environment: sdk: ">=2.14.0 <3.0.0" diff --git a/packages/in_app_purchase/in_app_purchase_platform_interface/CHANGELOG.md b/packages/in_app_purchase/in_app_purchase_platform_interface/CHANGELOG.md index f2a76ae55db2..17ba02986088 100644 --- a/packages/in_app_purchase/in_app_purchase_platform_interface/CHANGELOG.md +++ b/packages/in_app_purchase/in_app_purchase_platform_interface/CHANGELOG.md @@ -1,5 +1,6 @@ -## NEXT +## 1.3.2 +* Updates imports for `prefer_relative_imports`. * Updates minimum Flutter version to 2.10. * Removes unnecessary imports. diff --git a/packages/in_app_purchase/in_app_purchase_platform_interface/lib/src/in_app_purchase_platform_addition.dart b/packages/in_app_purchase/in_app_purchase_platform_interface/lib/src/in_app_purchase_platform_addition.dart index 746675549295..e93787e95d43 100644 --- a/packages/in_app_purchase/in_app_purchase_platform_interface/lib/src/in_app_purchase_platform_addition.dart +++ b/packages/in_app_purchase/in_app_purchase_platform_interface/lib/src/in_app_purchase_platform_addition.dart @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'package:in_app_purchase_platform_interface/in_app_purchase_platform_interface.dart'; +import '../in_app_purchase_platform_interface.dart'; // ignore: avoid_classes_with_only_static_members /// The interface that platform implementations must implement when they want to diff --git a/packages/in_app_purchase/in_app_purchase_platform_interface/lib/src/in_app_purchase_platform_addition_provider.dart b/packages/in_app_purchase/in_app_purchase_platform_interface/lib/src/in_app_purchase_platform_addition_provider.dart index 642bbb419c6e..adeaa3e53397 100644 --- a/packages/in_app_purchase/in_app_purchase_platform_interface/lib/src/in_app_purchase_platform_addition_provider.dart +++ b/packages/in_app_purchase/in_app_purchase_platform_interface/lib/src/in_app_purchase_platform_addition_provider.dart @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'package:in_app_purchase_platform_interface/src/in_app_purchase_platform_addition.dart'; +import 'in_app_purchase_platform_addition.dart'; /// The [InAppPurchasePlatformAdditionProvider] is responsible for providing /// a platform-specific [InAppPurchasePlatformAddition]. diff --git a/packages/in_app_purchase/in_app_purchase_platform_interface/pubspec.yaml b/packages/in_app_purchase/in_app_purchase_platform_interface/pubspec.yaml index e181c8a5ab49..46e38b0a03fa 100644 --- a/packages/in_app_purchase/in_app_purchase_platform_interface/pubspec.yaml +++ b/packages/in_app_purchase/in_app_purchase_platform_interface/pubspec.yaml @@ -4,7 +4,7 @@ repository: https://github.com/flutter/plugins/tree/main/packages/in_app_purchas issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+in_app_purchase%22 # NOTE: We strongly prefer non-breaking changes, even at the expense of a # less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes -version: 1.3.1 +version: 1.3.2 environment: sdk: ">=2.12.0 <3.0.0" diff --git a/packages/in_app_purchase/in_app_purchase_storekit/CHANGELOG.md b/packages/in_app_purchase/in_app_purchase_storekit/CHANGELOG.md index 2952c4b31abf..52f59efacd6a 100644 --- a/packages/in_app_purchase/in_app_purchase_storekit/CHANGELOG.md +++ b/packages/in_app_purchase/in_app_purchase_storekit/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.3.2+2 + +* Updates imports for `prefer_relative_imports`. + ## 0.3.2+1 * Updates minimum Flutter version to 2.10. diff --git a/packages/in_app_purchase/in_app_purchase_storekit/example/lib/main.dart b/packages/in_app_purchase/in_app_purchase_storekit/example/lib/main.dart index aa03190b0454..09058ea2e89a 100644 --- a/packages/in_app_purchase/in_app_purchase_storekit/example/lib/main.dart +++ b/packages/in_app_purchase/in_app_purchase_storekit/example/lib/main.dart @@ -7,9 +7,9 @@ import 'dart:async'; import 'package:flutter/material.dart'; import 'package:in_app_purchase_platform_interface/in_app_purchase_platform_interface.dart'; import 'package:in_app_purchase_storekit/in_app_purchase_storekit.dart'; -import 'package:in_app_purchase_storekit_example/example_payment_queue_delegate.dart'; import 'consumable_store.dart'; +import 'example_payment_queue_delegate.dart'; void main() { WidgetsFlutterBinding.ensureInitialized(); diff --git a/packages/in_app_purchase/in_app_purchase_storekit/example/pubspec.yaml b/packages/in_app_purchase/in_app_purchase_storekit/example/pubspec.yaml index 9e4f88b79bc5..e71b85d4b447 100644 --- a/packages/in_app_purchase/in_app_purchase_storekit/example/pubspec.yaml +++ b/packages/in_app_purchase/in_app_purchase_storekit/example/pubspec.yaml @@ -22,6 +22,8 @@ dependencies: dev_dependencies: flutter_driver: sdk: flutter + flutter_test: + sdk: flutter integration_test: sdk: flutter diff --git a/packages/in_app_purchase/in_app_purchase_storekit/lib/src/in_app_purchase_storekit_platform_addition.dart b/packages/in_app_purchase/in_app_purchase_storekit/lib/src/in_app_purchase_storekit_platform_addition.dart index 87655df53d34..070c138b32e6 100644 --- a/packages/in_app_purchase/in_app_purchase_storekit/lib/src/in_app_purchase_storekit_platform_addition.dart +++ b/packages/in_app_purchase/in_app_purchase_storekit/lib/src/in_app_purchase_storekit_platform_addition.dart @@ -3,7 +3,7 @@ // found in the LICENSE file. import 'package:in_app_purchase_platform_interface/in_app_purchase_platform_interface.dart'; -import 'package:in_app_purchase_storekit/in_app_purchase_storekit.dart'; +import '../in_app_purchase_storekit.dart'; import '../store_kit_wrappers.dart'; diff --git a/packages/in_app_purchase/in_app_purchase_storekit/lib/src/store_kit_wrappers/sk_payment_queue_delegate_wrapper.dart b/packages/in_app_purchase/in_app_purchase_storekit/lib/src/store_kit_wrappers/sk_payment_queue_delegate_wrapper.dart index eb88953096e6..1d98dd3f4250 100644 --- a/packages/in_app_purchase/in_app_purchase_storekit/lib/src/store_kit_wrappers/sk_payment_queue_delegate_wrapper.dart +++ b/packages/in_app_purchase/in_app_purchase_storekit/lib/src/store_kit_wrappers/sk_payment_queue_delegate_wrapper.dart @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'package:in_app_purchase_storekit/store_kit_wrappers.dart'; +import '../../store_kit_wrappers.dart'; /// A wrapper around /// [`SKPaymentQueueDelegate`](https://developer.apple.com/documentation/storekit/skpaymentqueuedelegate?language=objc). diff --git a/packages/in_app_purchase/in_app_purchase_storekit/lib/src/store_kit_wrappers/sk_payment_queue_wrapper.dart b/packages/in_app_purchase/in_app_purchase_storekit/lib/src/store_kit_wrappers/sk_payment_queue_wrapper.dart index 70db7da2e275..78e16e22416c 100644 --- a/packages/in_app_purchase/in_app_purchase_storekit/lib/src/store_kit_wrappers/sk_payment_queue_wrapper.dart +++ b/packages/in_app_purchase/in_app_purchase_storekit/lib/src/store_kit_wrappers/sk_payment_queue_wrapper.dart @@ -7,9 +7,9 @@ import 'dart:async'; import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; -import 'package:in_app_purchase_storekit/store_kit_wrappers.dart'; import 'package:json_annotation/json_annotation.dart'; +import '../../store_kit_wrappers.dart'; import '../channel.dart'; import '../in_app_purchase_storekit_platform.dart'; diff --git a/packages/in_app_purchase/in_app_purchase_storekit/pubspec.yaml b/packages/in_app_purchase/in_app_purchase_storekit/pubspec.yaml index 076837198c76..f2193e53b591 100644 --- a/packages/in_app_purchase/in_app_purchase_storekit/pubspec.yaml +++ b/packages/in_app_purchase/in_app_purchase_storekit/pubspec.yaml @@ -2,7 +2,7 @@ name: in_app_purchase_storekit description: An implementation for the iOS platform of the Flutter `in_app_purchase` plugin. This uses the StoreKit Framework. repository: https://github.com/flutter/plugins/tree/main/packages/in_app_purchase/in_app_purchase_storekit issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+in_app_purchase%22 -version: 0.3.2+1 +version: 0.3.2+2 environment: sdk: ">=2.14.0 <3.0.0" diff --git a/packages/ios_platform_images/example/pubspec.yaml b/packages/ios_platform_images/example/pubspec.yaml index 34bd431e97fc..6045b3f67cfc 100644 --- a/packages/ios_platform_images/example/pubspec.yaml +++ b/packages/ios_platform_images/example/pubspec.yaml @@ -10,10 +10,6 @@ dependencies: cupertino_icons: ^1.0.2 flutter: sdk: flutter - -dev_dependencies: - flutter_test: - sdk: flutter ios_platform_images: # When depending on this package from a real application you should use: # ios_platform_images: ^x.y.z @@ -22,5 +18,9 @@ dev_dependencies: # the parent directory to use the current plugin's version. path: ../ +dev_dependencies: + flutter_test: + sdk: flutter + flutter: uses-material-design: true diff --git a/packages/local_auth/local_auth/example/pubspec.yaml b/packages/local_auth/local_auth/example/pubspec.yaml index 14331dab78bf..f7dc2fc5b9e7 100644 --- a/packages/local_auth/local_auth/example/pubspec.yaml +++ b/packages/local_auth/local_auth/example/pubspec.yaml @@ -16,11 +16,15 @@ dependencies: # The example app is bundled with the plugin so we use a path dependency on # the parent directory to use the current plugin's version. path: ../ + local_auth_android: ^1.0.0 + local_auth_ios: ^1.0.1 dev_dependencies: build_runner: ^2.1.10 flutter_driver: sdk: flutter + flutter_test: + sdk: flutter integration_test: sdk: flutter diff --git a/packages/local_auth/local_auth_android/CHANGELOG.md b/packages/local_auth/local_auth_android/CHANGELOG.md index 5a94fac16fe8..a26846d5ed01 100644 --- a/packages/local_auth/local_auth_android/CHANGELOG.md +++ b/packages/local_auth/local_auth_android/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.0.13 + +* Updates imports for `prefer_relative_imports`. + ## 1.0.12 * Updates androidx.fragment version to 1.5.2. diff --git a/packages/local_auth/local_auth_android/example/pubspec.yaml b/packages/local_auth/local_auth_android/example/pubspec.yaml index b1c68d49e555..c95b89ad0c2a 100644 --- a/packages/local_auth/local_auth_android/example/pubspec.yaml +++ b/packages/local_auth/local_auth_android/example/pubspec.yaml @@ -21,6 +21,8 @@ dependencies: dev_dependencies: flutter_driver: sdk: flutter + flutter_test: + sdk: flutter integration_test: sdk: flutter diff --git a/packages/local_auth/local_auth_android/lib/local_auth_android.dart b/packages/local_auth/local_auth_android/lib/local_auth_android.dart index dfe785cc176f..e2134173691e 100644 --- a/packages/local_auth/local_auth_android/lib/local_auth_android.dart +++ b/packages/local_auth/local_auth_android/lib/local_auth_android.dart @@ -3,9 +3,10 @@ // found in the LICENSE file. import 'package:flutter/services.dart'; -import 'package:local_auth_android/types/auth_messages_android.dart'; import 'package:local_auth_platform_interface/local_auth_platform_interface.dart'; +import 'types/auth_messages_android.dart'; + export 'package:local_auth_android/types/auth_messages_android.dart'; export 'package:local_auth_platform_interface/types/auth_messages.dart'; export 'package:local_auth_platform_interface/types/auth_options.dart'; diff --git a/packages/local_auth/local_auth_android/pubspec.yaml b/packages/local_auth/local_auth_android/pubspec.yaml index d621874106b3..35c2d3af983c 100644 --- a/packages/local_auth/local_auth_android/pubspec.yaml +++ b/packages/local_auth/local_auth_android/pubspec.yaml @@ -2,7 +2,7 @@ name: local_auth_android description: Android implementation of the local_auth plugin. repository: https://github.com/flutter/plugins/tree/main/packages/local_auth/local_auth_android issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+local_auth%22 -version: 1.0.12 +version: 1.0.13 environment: sdk: ">=2.14.0 <3.0.0" diff --git a/packages/local_auth/local_auth_ios/CHANGELOG.md b/packages/local_auth/local_auth_ios/CHANGELOG.md index 748db7a7e695..e67f2a4e2ef1 100644 --- a/packages/local_auth/local_auth_ios/CHANGELOG.md +++ b/packages/local_auth/local_auth_ios/CHANGELOG.md @@ -1,5 +1,6 @@ -## NEXT +## 1.0.10 +* Updates imports for `prefer_relative_imports`. * Updates minimum Flutter version to 2.10. ## 1.0.9 diff --git a/packages/local_auth/local_auth_ios/example/pubspec.yaml b/packages/local_auth/local_auth_ios/example/pubspec.yaml index 52a95010d43b..720d5a732bd5 100644 --- a/packages/local_auth/local_auth_ios/example/pubspec.yaml +++ b/packages/local_auth/local_auth_ios/example/pubspec.yaml @@ -21,6 +21,8 @@ dependencies: dev_dependencies: flutter_driver: sdk: flutter + flutter_test: + sdk: flutter integration_test: sdk: flutter diff --git a/packages/local_auth/local_auth_ios/lib/local_auth_ios.dart b/packages/local_auth/local_auth_ios/lib/local_auth_ios.dart index d9df89a656a8..217fd39d9901 100644 --- a/packages/local_auth/local_auth_ios/lib/local_auth_ios.dart +++ b/packages/local_auth/local_auth_ios/lib/local_auth_ios.dart @@ -3,9 +3,10 @@ // found in the LICENSE file. import 'package:flutter/services.dart'; -import 'package:local_auth_ios/types/auth_messages_ios.dart'; import 'package:local_auth_platform_interface/local_auth_platform_interface.dart'; +import 'types/auth_messages_ios.dart'; + export 'package:local_auth_ios/types/auth_messages_ios.dart'; export 'package:local_auth_platform_interface/types/auth_messages.dart'; export 'package:local_auth_platform_interface/types/auth_options.dart'; diff --git a/packages/local_auth/local_auth_ios/pubspec.yaml b/packages/local_auth/local_auth_ios/pubspec.yaml index 18c39187b411..9cdeef963c34 100644 --- a/packages/local_auth/local_auth_ios/pubspec.yaml +++ b/packages/local_auth/local_auth_ios/pubspec.yaml @@ -2,7 +2,7 @@ name: local_auth_ios description: iOS implementation of the local_auth plugin. repository: https://github.com/flutter/plugins/tree/main/packages/local_auth/local_auth_ios issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+local_auth%22 -version: 1.0.9 +version: 1.0.10 environment: sdk: ">=2.14.0 <3.0.0" diff --git a/packages/local_auth/local_auth_platform_interface/CHANGELOG.md b/packages/local_auth/local_auth_platform_interface/CHANGELOG.md index ade26dd62e47..f0313ce99be6 100644 --- a/packages/local_auth/local_auth_platform_interface/CHANGELOG.md +++ b/packages/local_auth/local_auth_platform_interface/CHANGELOG.md @@ -1,5 +1,6 @@ -## NEXT +## 1.0.5 +* Updates imports for `prefer_relative_imports`. * Updates minimum Flutter version to 2.10. ## 1.0.4 diff --git a/packages/local_auth/local_auth_platform_interface/lib/default_method_channel_platform.dart b/packages/local_auth/local_auth_platform_interface/lib/default_method_channel_platform.dart index 9ded078c3a90..b3b0a653b514 100644 --- a/packages/local_auth/local_auth_platform_interface/lib/default_method_channel_platform.dart +++ b/packages/local_auth/local_auth_platform_interface/lib/default_method_channel_platform.dart @@ -3,7 +3,7 @@ // found in the LICENSE file. import 'package:flutter/services.dart'; -import 'package:local_auth_platform_interface/local_auth_platform_interface.dart'; +import 'local_auth_platform_interface.dart'; const MethodChannel _channel = MethodChannel('plugins.flutter.io/local_auth'); diff --git a/packages/local_auth/local_auth_platform_interface/lib/local_auth_platform_interface.dart b/packages/local_auth/local_auth_platform_interface/lib/local_auth_platform_interface.dart index de652b20f462..4c6d58238edd 100644 --- a/packages/local_auth/local_auth_platform_interface/lib/local_auth_platform_interface.dart +++ b/packages/local_auth/local_auth_platform_interface/lib/local_auth_platform_interface.dart @@ -2,10 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'package:local_auth_platform_interface/default_method_channel_platform.dart'; -import 'package:local_auth_platform_interface/types/types.dart'; import 'package:plugin_platform_interface/plugin_platform_interface.dart'; +import 'default_method_channel_platform.dart'; +import 'types/types.dart'; + export 'package:local_auth_platform_interface/types/types.dart'; /// The interface that implementations of local_auth must implement. diff --git a/packages/local_auth/local_auth_platform_interface/pubspec.yaml b/packages/local_auth/local_auth_platform_interface/pubspec.yaml index 27b5cb33c0f5..92da218d8be5 100644 --- a/packages/local_auth/local_auth_platform_interface/pubspec.yaml +++ b/packages/local_auth/local_auth_platform_interface/pubspec.yaml @@ -4,7 +4,7 @@ repository: https://github.com/flutter/plugins/tree/main/packages/local_auth/loc issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+local_auth%22 # NOTE: We strongly prefer non-breaking changes, even at the expense of a # less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes -version: 1.0.4 +version: 1.0.5 environment: sdk: ">=2.14.0 <3.0.0" diff --git a/packages/local_auth/local_auth_windows/CHANGELOG.md b/packages/local_auth/local_auth_windows/CHANGELOG.md index 4e36f75aea1d..b4f2061f2c27 100644 --- a/packages/local_auth/local_auth_windows/CHANGELOG.md +++ b/packages/local_auth/local_auth_windows/CHANGELOG.md @@ -1,5 +1,6 @@ -## NEXT +## 1.0.4 +* Updates imports for `prefer_relative_imports`. * Updates minimum Flutter version to 2.10. ## 1.0.3 diff --git a/packages/local_auth/local_auth_windows/example/pubspec.yaml b/packages/local_auth/local_auth_windows/example/pubspec.yaml index 664f8623abb7..4bb2671f6826 100644 --- a/packages/local_auth/local_auth_windows/example/pubspec.yaml +++ b/packages/local_auth/local_auth_windows/example/pubspec.yaml @@ -21,6 +21,8 @@ dependencies: dev_dependencies: flutter_driver: sdk: flutter + flutter_test: + sdk: flutter integration_test: sdk: flutter diff --git a/packages/local_auth/local_auth_windows/lib/local_auth_windows.dart b/packages/local_auth/local_auth_windows/lib/local_auth_windows.dart index 1d65e81050f1..b373782c2187 100644 --- a/packages/local_auth/local_auth_windows/lib/local_auth_windows.dart +++ b/packages/local_auth/local_auth_windows/lib/local_auth_windows.dart @@ -4,7 +4,7 @@ import 'package:flutter/services.dart'; import 'package:local_auth_platform_interface/local_auth_platform_interface.dart'; -import 'package:local_auth_windows/types/auth_messages_windows.dart'; +import 'types/auth_messages_windows.dart'; export 'package:local_auth_platform_interface/types/auth_messages.dart'; export 'package:local_auth_platform_interface/types/auth_options.dart'; diff --git a/packages/local_auth/local_auth_windows/pubspec.yaml b/packages/local_auth/local_auth_windows/pubspec.yaml index 7f8d7f631211..9a2effed92ee 100644 --- a/packages/local_auth/local_auth_windows/pubspec.yaml +++ b/packages/local_auth/local_auth_windows/pubspec.yaml @@ -2,7 +2,7 @@ name: local_auth_windows description: Windows implementation of the local_auth plugin. repository: https://github.com/flutter/plugins/tree/main/packages/local_auth/local_auth_windows issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+local_auth%22 -version: 1.0.3 +version: 1.0.4 environment: sdk: ">=2.14.0 <3.0.0" diff --git a/packages/path_provider/path_provider/CHANGELOG.md b/packages/path_provider/path_provider/CHANGELOG.md index e19415ff68ac..436523551924 100644 --- a/packages/path_provider/path_provider/CHANGELOG.md +++ b/packages/path_provider/path_provider/CHANGELOG.md @@ -1,5 +1,6 @@ ## NEXT +* Updates code for `no_leading_underscores_for_local_identifiers` lint. * Updates minimum Flutter version to 2.10. * Fixes avoid_redundant_argument_values lint warnings and minor typos. diff --git a/packages/path_provider/path_provider/example/integration_test/path_provider_test.dart b/packages/path_provider/path_provider/example/integration_test/path_provider_test.dart index 1fe31df1fe31..bf150f66f49b 100644 --- a/packages/path_provider/path_provider/example/integration_test/path_provider_test.dart +++ b/packages/path_provider/path_provider/example/integration_test/path_provider_test.dart @@ -58,7 +58,7 @@ void main() { } }); - final List _allDirs = [ + final List allDirs = [ null, StorageDirectory.music, StorageDirectory.podcasts, @@ -69,7 +69,7 @@ void main() { StorageDirectory.movies, ]; - for (final StorageDirectory? type in _allDirs) { + for (final StorageDirectory? type in allDirs) { testWidgets('getExternalStorageDirectories (type: $type)', (WidgetTester tester) async { if (Platform.isIOS) { diff --git a/packages/path_provider/path_provider/example/pubspec.yaml b/packages/path_provider/path_provider/example/pubspec.yaml index 13be15f0c1a1..5964a267f96d 100644 --- a/packages/path_provider/path_provider/example/pubspec.yaml +++ b/packages/path_provider/path_provider/example/pubspec.yaml @@ -20,6 +20,8 @@ dependencies: dev_dependencies: flutter_driver: sdk: flutter + flutter_test: + sdk: flutter integration_test: sdk: flutter diff --git a/packages/path_provider/path_provider_android/CHANGELOG.md b/packages/path_provider/path_provider_android/CHANGELOG.md index 93f074795649..c36a771d3340 100644 --- a/packages/path_provider/path_provider_android/CHANGELOG.md +++ b/packages/path_provider/path_provider_android/CHANGELOG.md @@ -1,5 +1,6 @@ ## NEXT +* Updates code for `no_leading_underscores_for_local_identifiers` lint. * Updates minimum Flutter version to 2.10. ## 2.0.20 diff --git a/packages/path_provider/path_provider_android/example/integration_test/path_provider_test.dart b/packages/path_provider/path_provider_android/example/integration_test/path_provider_test.dart index 2be88130b4e7..ecd0b973343b 100644 --- a/packages/path_provider/path_provider_android/example/integration_test/path_provider_test.dart +++ b/packages/path_provider/path_provider_android/example/integration_test/path_provider_test.dart @@ -49,7 +49,7 @@ void main() { } }); - final List _allDirs = [ + final List allDirs = [ null, StorageDirectory.music, StorageDirectory.podcasts, @@ -60,7 +60,7 @@ void main() { StorageDirectory.movies, ]; - for (final StorageDirectory? type in _allDirs) { + for (final StorageDirectory? type in allDirs) { testWidgets('getExternalStorageDirectories (type: $type)', (WidgetTester tester) async { final PathProviderPlatform provider = PathProviderPlatform.instance; diff --git a/packages/path_provider/path_provider_android/example/pubspec.yaml b/packages/path_provider/path_provider_android/example/pubspec.yaml index 4ab05835158d..b460d6ba49ce 100644 --- a/packages/path_provider/path_provider_android/example/pubspec.yaml +++ b/packages/path_provider/path_provider_android/example/pubspec.yaml @@ -21,6 +21,8 @@ dependencies: dev_dependencies: flutter_driver: sdk: flutter + flutter_test: + sdk: flutter integration_test: sdk: flutter diff --git a/packages/path_provider/path_provider_ios/example/pubspec.yaml b/packages/path_provider/path_provider_ios/example/pubspec.yaml index 0df5e6141fdf..f1d885513948 100644 --- a/packages/path_provider/path_provider_ios/example/pubspec.yaml +++ b/packages/path_provider/path_provider_ios/example/pubspec.yaml @@ -21,6 +21,8 @@ dependencies: dev_dependencies: flutter_driver: sdk: flutter + flutter_test: + sdk: flutter integration_test: sdk: flutter diff --git a/packages/path_provider/path_provider_macos/example/pubspec.yaml b/packages/path_provider/path_provider_macos/example/pubspec.yaml index f5bd2ba024b5..8c69e69ce122 100644 --- a/packages/path_provider/path_provider_macos/example/pubspec.yaml +++ b/packages/path_provider/path_provider_macos/example/pubspec.yaml @@ -21,6 +21,8 @@ dependencies: dev_dependencies: flutter_driver: sdk: flutter + flutter_test: + sdk: flutter integration_test: sdk: flutter diff --git a/packages/path_provider/path_provider_platform_interface/CHANGELOG.md b/packages/path_provider/path_provider_platform_interface/CHANGELOG.md index 6baf950a397a..f12e1ec53ade 100644 --- a/packages/path_provider/path_provider_platform_interface/CHANGELOG.md +++ b/packages/path_provider/path_provider_platform_interface/CHANGELOG.md @@ -1,5 +1,6 @@ -## NEXT +## 2.0.5 +* Updates imports for `prefer_relative_imports`. * Updates minimum Flutter version to 2.10. ## 2.0.4 diff --git a/packages/path_provider/path_provider_platform_interface/lib/src/method_channel_path_provider.dart b/packages/path_provider/path_provider_platform_interface/lib/src/method_channel_path_provider.dart index fe632743b098..991be55bce8c 100644 --- a/packages/path_provider/path_provider_platform_interface/lib/src/method_channel_path_provider.dart +++ b/packages/path_provider/path_provider_platform_interface/lib/src/method_channel_path_provider.dart @@ -4,9 +4,10 @@ import 'package:flutter/foundation.dart' show visibleForTesting; import 'package:flutter/services.dart'; -import 'package:path_provider_platform_interface/path_provider_platform_interface.dart'; import 'package:platform/platform.dart'; +import '../path_provider_platform_interface.dart'; + /// An implementation of [PathProviderPlatform] that uses method channels. class MethodChannelPathProvider extends PathProviderPlatform { /// The method channel used to interact with the native platform. diff --git a/packages/path_provider/path_provider_platform_interface/pubspec.yaml b/packages/path_provider/path_provider_platform_interface/pubspec.yaml index ef16037de71f..6ce7ec662b33 100644 --- a/packages/path_provider/path_provider_platform_interface/pubspec.yaml +++ b/packages/path_provider/path_provider_platform_interface/pubspec.yaml @@ -4,7 +4,7 @@ repository: https://github.com/flutter/plugins/tree/main/packages/path_provider/ issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+path_provider%22 # NOTE: We strongly prefer non-breaking changes, even at the expense of a # less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes -version: 2.0.4 +version: 2.0.5 environment: sdk: ">=2.12.0 <3.0.0" diff --git a/packages/path_provider/path_provider_windows/example/pubspec.yaml b/packages/path_provider/path_provider_windows/example/pubspec.yaml index c7a12cae4573..d70a4a84f504 100644 --- a/packages/path_provider/path_provider_windows/example/pubspec.yaml +++ b/packages/path_provider/path_provider_windows/example/pubspec.yaml @@ -20,6 +20,8 @@ dependencies: dev_dependencies: flutter_driver: sdk: flutter + flutter_test: + sdk: flutter integration_test: sdk: flutter diff --git a/packages/quick_actions/quick_actions/example/pubspec.yaml b/packages/quick_actions/quick_actions/example/pubspec.yaml index 3b197c219109..46be008390d8 100644 --- a/packages/quick_actions/quick_actions/example/pubspec.yaml +++ b/packages/quick_actions/quick_actions/example/pubspec.yaml @@ -21,6 +21,8 @@ dev_dependencies: espresso: ^0.1.0+2 flutter_driver: sdk: flutter + flutter_test: + sdk: flutter integration_test: sdk: flutter diff --git a/packages/quick_actions/quick_actions_android/example/pubspec.yaml b/packages/quick_actions/quick_actions_android/example/pubspec.yaml index 6ff13f063c5f..17d50f5d0829 100644 --- a/packages/quick_actions/quick_actions_android/example/pubspec.yaml +++ b/packages/quick_actions/quick_actions_android/example/pubspec.yaml @@ -21,6 +21,8 @@ dev_dependencies: espresso: ^0.1.0+2 flutter_driver: sdk: flutter + flutter_test: + sdk: flutter integration_test: sdk: flutter diff --git a/packages/quick_actions/quick_actions_ios/CHANGELOG.md b/packages/quick_actions/quick_actions_ios/CHANGELOG.md index e002bd70ac09..31fe43832d2f 100644 --- a/packages/quick_actions/quick_actions_ios/CHANGELOG.md +++ b/packages/quick_actions/quick_actions_ios/CHANGELOG.md @@ -1,3 +1,7 @@ +## NEXT + +* Migrates `RunnerUITests` to Swift. + ## 1.0.1 * Removes custom modulemap file with "Test" submodule and private headers for Swift migration. diff --git a/packages/quick_actions/quick_actions_ios/example/ios/Runner.xcodeproj/project.pbxproj b/packages/quick_actions/quick_actions_ios/example/ios/Runner.xcodeproj/project.pbxproj index 47360fe51a70..c853a197ca9b 100644 --- a/packages/quick_actions/quick_actions_ios/example/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/quick_actions/quick_actions_ios/example/ios/Runner.xcodeproj/project.pbxproj @@ -10,13 +10,13 @@ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 2632072169FF635893D8EB4D /* libPods-RunnerTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 436668746754BEEA28B76E55 /* libPods-RunnerTests.a */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 686BE83025E58CCF00862533 /* RunnerUITests.m in Sources */ = {isa = PBXBuildFile; fileRef = 686BE82F25E58CCF00862533 /* RunnerUITests.m */; }; 6A841C2B6AED5CF8DB2A1894 /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C35AD3650AB6BF850E016715 /* libPods-Runner.a */; }; 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; }; 97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; + E092A7F628D128EB005C7F67 /* RunnerUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E092A7F528D128EB005C7F67 /* RunnerUITests.swift */; }; E0C09C29289C729D00E6977E /* FLTQuickActionsPluginTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E0C09C28289C729D00E6977E /* FLTQuickActionsPluginTests.m */; }; E0C09C32289DBFCA00E6977E /* FLTShortcutStateManagerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = E0C09C31289DBFCA00E6977E /* FLTShortcutStateManagerTests.m */; }; /* End PBXBuildFile section */ @@ -60,7 +60,6 @@ 436668746754BEEA28B76E55 /* libPods-RunnerTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-RunnerTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 5278439583922091276A37C9 /* 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 = ""; }; 686BE82D25E58CCF00862533 /* RunnerUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 686BE82F25E58CCF00862533 /* RunnerUITests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RunnerUITests.m; sourceTree = ""; }; 686BE83125E58CCF00862533 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; @@ -76,6 +75,7 @@ 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 9D27FE1F0F21D4D47DDA16DE /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; C35AD3650AB6BF850E016715 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + E092A7F528D128EB005C7F67 /* RunnerUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerUITests.swift; sourceTree = ""; }; E0C09C28289C729D00E6977E /* FLTQuickActionsPluginTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FLTQuickActionsPluginTests.m; sourceTree = ""; }; E0C09C31289DBFCA00E6977E /* FLTShortcutStateManagerTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FLTShortcutStateManagerTests.m; sourceTree = ""; }; F0609304FBCAEC2289164BD5 /* 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 = ""; }; @@ -121,8 +121,8 @@ 686BE82E25E58CCF00862533 /* RunnerUITests */ = { isa = PBXGroup; children = ( - 686BE82F25E58CCF00862533 /* RunnerUITests.m */, 686BE83125E58CCF00862533 /* Info.plist */, + E092A7F528D128EB005C7F67 /* RunnerUITests.swift */, ); path = RunnerUITests; sourceTree = ""; @@ -281,6 +281,7 @@ }; 686BE82C25E58CCF00862533 = { CreatedOnToolsVersion = 12.4; + LastSwiftMigration = 1330; ProvisioningStyle = Automatic; TestTargetID = 97C146ED1CF9000F007C117D; }; @@ -424,7 +425,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 686BE83025E58CCF00862533 /* RunnerUITests.m in Sources */, + E092A7F628D128EB005C7F67 /* RunnerUITests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -512,6 +513,7 @@ buildSettings = { CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; @@ -529,6 +531,8 @@ MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.google.RunnerUITests; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; TEST_TARGET_NAME = Runner; }; @@ -539,6 +543,7 @@ buildSettings = { CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; @@ -555,6 +560,7 @@ MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = com.google.RunnerUITests; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; TEST_TARGET_NAME = Runner; }; diff --git a/packages/quick_actions/quick_actions_ios/example/ios/RunnerUITests/RunnerUITests.m b/packages/quick_actions/quick_actions_ios/example/ios/RunnerUITests/RunnerUITests.m deleted file mode 100644 index 0bad57f886de..000000000000 --- a/packages/quick_actions/quick_actions_ios/example/ios/RunnerUITests/RunnerUITests.m +++ /dev/null @@ -1,99 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import -#import - -static const int kElementWaitingTime = 30; - -@interface RunnerUITests : XCTestCase - -@end - -@implementation RunnerUITests { - XCUIApplication *_exampleApp; -} - -- (void)setUp { - [super setUp]; - self.continueAfterFailure = NO; - _exampleApp = [[XCUIApplication alloc] init]; -} - -- (void)tearDown { - [super tearDown]; - [_exampleApp terminate]; - _exampleApp = nil; -} - -- (void)testQuickActionWithFreshStart { - XCUIApplication *springboard = - [[XCUIApplication alloc] initWithBundleIdentifier:@"com.apple.springboard"]; - XCUIElement *quickActionsAppIcon = springboard.icons[@"quick_actions_example"]; - if (![quickActionsAppIcon waitForExistenceWithTimeout:kElementWaitingTime]) { - os_log_error(OS_LOG_DEFAULT, "%@", springboard.debugDescription); - XCTFail(@"Failed due to not able to find the example app from springboard with %@ seconds", - @(kElementWaitingTime)); - } - - [quickActionsAppIcon pressForDuration:2]; - XCUIElement *actionTwo = springboard.buttons[@"Action two"]; - if (![actionTwo waitForExistenceWithTimeout:kElementWaitingTime]) { - os_log_error(OS_LOG_DEFAULT, "%@", springboard.debugDescription); - XCTFail(@"Failed due to not able to find the actionTwo button from springboard with %@ seconds", - @(kElementWaitingTime)); - } - - [actionTwo tap]; - - XCUIElement *actionTwoConfirmation = _exampleApp.otherElements[@"action_two"]; - if (![actionTwoConfirmation waitForExistenceWithTimeout:kElementWaitingTime]) { - os_log_error(OS_LOG_DEFAULT, "%@", springboard.debugDescription); - XCTFail(@"Failed due to not able to find the actionTwoConfirmation in the app with %@ seconds", - @(kElementWaitingTime)); - } - XCTAssertTrue(actionTwoConfirmation.exists); -} - -- (void)testQuickActionWhenAppIsInBackground { - [_exampleApp launch]; - - XCUIElement *actionsReady = _exampleApp.otherElements[@"actions ready"]; - if (![actionsReady waitForExistenceWithTimeout:kElementWaitingTime]) { - os_log_error(OS_LOG_DEFAULT, "%@", _exampleApp.debugDescription); - XCTFail(@"Failed due to not able to find the actionsReady in the app with %@ seconds", - @(kElementWaitingTime)); - } - - [[XCUIDevice sharedDevice] pressButton:XCUIDeviceButtonHome]; - - XCUIApplication *springboard = - [[XCUIApplication alloc] initWithBundleIdentifier:@"com.apple.springboard"]; - XCUIElement *quickActionsAppIcon = springboard.icons[@"quick_actions_example"]; - if (![quickActionsAppIcon waitForExistenceWithTimeout:kElementWaitingTime]) { - os_log_error(OS_LOG_DEFAULT, "%@", springboard.debugDescription); - XCTFail(@"Failed due to not able to find the example app from springboard with %@ seconds", - @(kElementWaitingTime)); - } - - [quickActionsAppIcon pressForDuration:2]; - XCUIElement *actionOne = springboard.buttons[@"Action one"]; - if (![actionOne waitForExistenceWithTimeout:kElementWaitingTime]) { - os_log_error(OS_LOG_DEFAULT, "%@", springboard.debugDescription); - XCTFail(@"Failed due to not able to find the actionOne button from springboard with %@ seconds", - @(kElementWaitingTime)); - } - - [actionOne tap]; - - XCUIElement *actionOneConfirmation = _exampleApp.otherElements[@"action_one"]; - if (![actionOneConfirmation waitForExistenceWithTimeout:kElementWaitingTime]) { - os_log_error(OS_LOG_DEFAULT, "%@", springboard.debugDescription); - XCTFail(@"Failed due to not able to find the actionOneConfirmation in the app with %@ seconds", - @(kElementWaitingTime)); - } - XCTAssertTrue(actionOneConfirmation.exists); -} - -@end diff --git a/packages/quick_actions/quick_actions_ios/example/ios/RunnerUITests/RunnerUITests.swift b/packages/quick_actions/quick_actions_ios/example/ios/RunnerUITests/RunnerUITests.swift new file mode 100644 index 000000000000..a59692e7639d --- /dev/null +++ b/packages/quick_actions/quick_actions_ios/example/ios/RunnerUITests/RunnerUITests.swift @@ -0,0 +1,96 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import XCTest + +private let elementWaitingTime: TimeInterval = 30 + +class RunnerUITests: XCTestCase { + + private var exampleApp: XCUIApplication! + + override func setUp() { + super.setUp() + self.continueAfterFailure = false + exampleApp = XCUIApplication() + } + + override func tearDown() { + super.tearDown() + exampleApp.terminate() + exampleApp = nil + } + + func testQuickActionWithFreshStart() { + let springboard = XCUIApplication(bundleIdentifier: "com.apple.springboard") + let quickActionsAppIcon = springboard.icons["quick_actions_example"] + if !quickActionsAppIcon.waitForExistence(timeout: elementWaitingTime) { + XCTFail( + "Failed due to not able to find the example app from springboard with \(elementWaitingTime) seconds. Springboard debug description: \(springboard.debugDescription)" + ) + } + + quickActionsAppIcon.press(forDuration: 2) + + let actionTwo = springboard.buttons["Action two"] + if !actionTwo.waitForExistence(timeout: elementWaitingTime) { + XCTFail( + "Failed due to not able to find the actionTwo button from springboard with \(elementWaitingTime) seconds. Springboard debug description: \(springboard.debugDescription)" + ) + } + + actionTwo.tap() + + let actionTwoConfirmation = exampleApp.otherElements["action_two"] + if !actionTwoConfirmation.waitForExistence(timeout: elementWaitingTime) { + XCTFail( + "Failed due to not able to find the actionTwoConfirmation in the app with \(elementWaitingTime) seconds. Springboard debug description: \(springboard.debugDescription)" + ) + } + + XCTAssert(actionTwoConfirmation.exists) + } + + func testQuickActionWhenAppIsInBackground() { + exampleApp.launch() + + let actionsReady = exampleApp.otherElements["actions ready"] + + if !actionsReady.waitForExistence(timeout: elementWaitingTime) { + XCTFail( + "Failed due to not able to find the actionsReady in the app with \(elementWaitingTime) seconds. App debug description: \(exampleApp.debugDescription)" + ) + } + + XCUIDevice.shared.press(.home) + + let springboard = XCUIApplication(bundleIdentifier: "com.apple.springboard") + let quickActionsAppIcon = springboard.icons["quick_actions_example"] + if !quickActionsAppIcon.waitForExistence(timeout: elementWaitingTime) { + XCTFail( + "Failed due to not able to find the example app from springboard with \(elementWaitingTime) seconds. Springboard debug description: \(springboard.debugDescription)" + ) + } + + quickActionsAppIcon.press(forDuration: 2) + + let actionOne = springboard.buttons["Action one"] + if !actionOne.waitForExistence(timeout: elementWaitingTime) { + XCTFail( + "Failed due to not able to find the actionOne button from springboard with \(elementWaitingTime) seconds. Springboard debug description: \(springboard.debugDescription)" + ) + } + + actionOne.tap() + + let actionOneConfirmation = exampleApp.otherElements["action_one"] + if !actionOneConfirmation.waitForExistence(timeout: elementWaitingTime) { + XCTFail( + "Failed due to not able to find the actionOneConfirmation in the app with \(elementWaitingTime) seconds. Springboard debug description: \(springboard.debugDescription)" + ) + } + + XCTAssert(actionOneConfirmation.exists) + } +} diff --git a/packages/quick_actions/quick_actions_ios/example/pubspec.yaml b/packages/quick_actions/quick_actions_ios/example/pubspec.yaml index f93e162e7fa9..ecac371720d6 100644 --- a/packages/quick_actions/quick_actions_ios/example/pubspec.yaml +++ b/packages/quick_actions/quick_actions_ios/example/pubspec.yaml @@ -20,6 +20,8 @@ dependencies: dev_dependencies: flutter_driver: sdk: flutter + flutter_test: + sdk: flutter integration_test: sdk: flutter diff --git a/packages/quick_actions/quick_actions_platform_interface/CHANGELOG.md b/packages/quick_actions/quick_actions_platform_interface/CHANGELOG.md index 26c57ca3be27..950864f96653 100644 --- a/packages/quick_actions/quick_actions_platform_interface/CHANGELOG.md +++ b/packages/quick_actions/quick_actions_platform_interface/CHANGELOG.md @@ -1,5 +1,6 @@ -## NEXT +## 1.0.3 +* Updates imports for `prefer_relative_imports`. * Updates minimum Flutter version to 2.10. ## 1.0.2 diff --git a/packages/quick_actions/quick_actions_platform_interface/lib/method_channel/method_channel_quick_actions.dart b/packages/quick_actions/quick_actions_platform_interface/lib/method_channel/method_channel_quick_actions.dart index 560c199ee77a..0f936db870c7 100644 --- a/packages/quick_actions/quick_actions_platform_interface/lib/method_channel/method_channel_quick_actions.dart +++ b/packages/quick_actions/quick_actions_platform_interface/lib/method_channel/method_channel_quick_actions.dart @@ -4,9 +4,9 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; -import 'package:quick_actions_platform_interface/types/types.dart'; import '../platform_interface/quick_actions_platform.dart'; +import '../types/types.dart'; const MethodChannel _channel = MethodChannel('plugins.flutter.io/quick_actions'); diff --git a/packages/quick_actions/quick_actions_platform_interface/lib/platform_interface/quick_actions_platform.dart b/packages/quick_actions/quick_actions_platform_interface/lib/platform_interface/quick_actions_platform.dart index 7a70bba5c81d..057cb5642293 100644 --- a/packages/quick_actions/quick_actions_platform_interface/lib/platform_interface/quick_actions_platform.dart +++ b/packages/quick_actions/quick_actions_platform_interface/lib/platform_interface/quick_actions_platform.dart @@ -3,9 +3,9 @@ // found in the LICENSE file. import 'package:plugin_platform_interface/plugin_platform_interface.dart'; -import 'package:quick_actions_platform_interface/types/types.dart'; import '../method_channel/method_channel_quick_actions.dart'; +import '../types/types.dart'; /// The interface that implementations of quick_actions must implement. /// diff --git a/packages/quick_actions/quick_actions_platform_interface/pubspec.yaml b/packages/quick_actions/quick_actions_platform_interface/pubspec.yaml index aa331dc54544..2990da603c14 100644 --- a/packages/quick_actions/quick_actions_platform_interface/pubspec.yaml +++ b/packages/quick_actions/quick_actions_platform_interface/pubspec.yaml @@ -4,7 +4,7 @@ repository: https://github.com/flutter/plugins/tree/main/packages/quick_actions/ issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+quick_actions%22 # NOTE: We strongly prefer non-breaking changes, even at the expense of a # less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes -version: 1.0.2 +version: 1.0.3 environment: sdk: ">=2.12.0 <3.0.0" diff --git a/packages/shared_preferences/shared_preferences/CHANGELOG.md b/packages/shared_preferences/shared_preferences/CHANGELOG.md index d7c3aa49e22e..b719ff158ff4 100644 --- a/packages/shared_preferences/shared_preferences/CHANGELOG.md +++ b/packages/shared_preferences/shared_preferences/CHANGELOG.md @@ -1,5 +1,6 @@ ## NEXT +* Updates code for `no_leading_underscores_for_local_identifiers` lint. * Updates minimum Flutter version to 2.10. ## 2.0.15 diff --git a/packages/shared_preferences/shared_preferences/example/pubspec.yaml b/packages/shared_preferences/shared_preferences/example/pubspec.yaml index 35eb6f159bcd..6964656d16ef 100644 --- a/packages/shared_preferences/shared_preferences/example/pubspec.yaml +++ b/packages/shared_preferences/shared_preferences/example/pubspec.yaml @@ -20,6 +20,8 @@ dependencies: dev_dependencies: flutter_driver: sdk: flutter + flutter_test: + sdk: flutter integration_test: sdk: flutter diff --git a/packages/shared_preferences/shared_preferences/test/shared_preferences_test.dart b/packages/shared_preferences/shared_preferences/test/shared_preferences_test.dart index 0a02c46404fc..30f7829f670a 100755 --- a/packages/shared_preferences/shared_preferences/test/shared_preferences_test.dart +++ b/packages/shared_preferences/shared_preferences/test/shared_preferences_test.dart @@ -171,22 +171,22 @@ void main() { }); group('mocking', () { - const String _key = 'dummy'; - const String _prefixedKey = 'flutter.$_key'; + const String key = 'dummy'; + const String prefixedKey = 'flutter.$key'; test('test 1', () async { SharedPreferences.setMockInitialValues( - {_prefixedKey: 'my string'}); + {prefixedKey: 'my string'}); final SharedPreferences prefs = await SharedPreferences.getInstance(); - final String? value = prefs.getString(_key); + final String? value = prefs.getString(key); expect(value, 'my string'); }); test('test 2', () async { SharedPreferences.setMockInitialValues( - {_prefixedKey: 'my other string'}); + {prefixedKey: 'my other string'}); final SharedPreferences prefs = await SharedPreferences.getInstance(); - final String? value = prefs.getString(_key); + final String? value = prefs.getString(key); expect(value, 'my other string'); }); }); diff --git a/packages/shared_preferences/shared_preferences_android/CHANGELOG.md b/packages/shared_preferences/shared_preferences_android/CHANGELOG.md index 91a922d9de64..f21af6aff7aa 100644 --- a/packages/shared_preferences/shared_preferences_android/CHANGELOG.md +++ b/packages/shared_preferences/shared_preferences_android/CHANGELOG.md @@ -1,3 +1,7 @@ +## NEXT + +* Updates code for `no_leading_underscores_for_local_identifiers` lint. + ## 2.0.13 * Updates gradle to 7.2.2. diff --git a/packages/shared_preferences/shared_preferences_android/example/integration_test/shared_preferences_test.dart b/packages/shared_preferences/shared_preferences_android/example/integration_test/shared_preferences_test.dart index 275067d98770..4d4a85a5fcbc 100644 --- a/packages/shared_preferences/shared_preferences_android/example/integration_test/shared_preferences_test.dart +++ b/packages/shared_preferences/shared_preferences_android/example/integration_test/shared_preferences_test.dart @@ -39,42 +39,42 @@ void main() { // Normally the app-facing package adds the prefix, but since this test // bypasses the app-facing package it needs to be manually added. - String _prefixedKey(String key) { + String prefixedKey(String key) { return 'flutter.$key'; } testWidgets('reading', (WidgetTester _) async { final Map values = await preferences.getAll(); - expect(values[_prefixedKey('String')], isNull); - expect(values[_prefixedKey('bool')], isNull); - expect(values[_prefixedKey('int')], isNull); - expect(values[_prefixedKey('double')], isNull); - expect(values[_prefixedKey('List')], isNull); + expect(values[prefixedKey('String')], isNull); + expect(values[prefixedKey('bool')], isNull); + expect(values[prefixedKey('int')], isNull); + expect(values[prefixedKey('double')], isNull); + expect(values[prefixedKey('List')], isNull); }); testWidgets('writing', (WidgetTester _) async { await Future.wait(>[ preferences.setValue( - 'String', _prefixedKey('String'), kTestValues2['flutter.String']!), + 'String', prefixedKey('String'), kTestValues2['flutter.String']!), preferences.setValue( - 'Bool', _prefixedKey('bool'), kTestValues2['flutter.bool']!), + 'Bool', prefixedKey('bool'), kTestValues2['flutter.bool']!), preferences.setValue( - 'Int', _prefixedKey('int'), kTestValues2['flutter.int']!), + 'Int', prefixedKey('int'), kTestValues2['flutter.int']!), preferences.setValue( - 'Double', _prefixedKey('double'), kTestValues2['flutter.double']!), + 'Double', prefixedKey('double'), kTestValues2['flutter.double']!), preferences.setValue( - 'StringList', _prefixedKey('List'), kTestValues2['flutter.List']!) + 'StringList', prefixedKey('List'), kTestValues2['flutter.List']!) ]); final Map values = await preferences.getAll(); - expect(values[_prefixedKey('String')], kTestValues2['flutter.String']); - expect(values[_prefixedKey('bool')], kTestValues2['flutter.bool']); - expect(values[_prefixedKey('int')], kTestValues2['flutter.int']); - expect(values[_prefixedKey('double')], kTestValues2['flutter.double']); - expect(values[_prefixedKey('List')], kTestValues2['flutter.List']); + expect(values[prefixedKey('String')], kTestValues2['flutter.String']); + expect(values[prefixedKey('bool')], kTestValues2['flutter.bool']); + expect(values[prefixedKey('int')], kTestValues2['flutter.int']); + expect(values[prefixedKey('double')], kTestValues2['flutter.double']); + expect(values[prefixedKey('List')], kTestValues2['flutter.List']); }); testWidgets('removing', (WidgetTester _) async { - final String key = _prefixedKey('testKey'); + final String key = prefixedKey('testKey'); await preferences.setValue('String', key, kTestValues['flutter.String']!); await preferences.setValue('Bool', key, kTestValues['flutter.bool']!); await preferences.setValue('Int', key, kTestValues['flutter.int']!); @@ -108,19 +108,19 @@ void main() { final List> writes = >[]; const int writeCount = 100; for (int i = 1; i <= writeCount; i++) { - writes.add(preferences.setValue('Int', _prefixedKey('int'), i)); + writes.add(preferences.setValue('Int', prefixedKey('int'), i)); } final List result = await Future.wait(writes, eagerError: true); // All writes should succeed. expect(result.where((bool element) => !element), isEmpty); // The last write should win. final Map values = await preferences.getAll(); - expect(values[_prefixedKey('int')], writeCount); + expect(values[prefixedKey('int')], writeCount); }); testWidgets('string clash with lists, big integers and doubles', (WidgetTester _) async { - final String key = _prefixedKey('akey'); + final String key = prefixedKey('akey'); const String value = 'a string value'; await preferences.clear(); diff --git a/packages/shared_preferences/shared_preferences_android/example/pubspec.yaml b/packages/shared_preferences/shared_preferences_android/example/pubspec.yaml index 2838b262885e..bd1272c71d80 100644 --- a/packages/shared_preferences/shared_preferences_android/example/pubspec.yaml +++ b/packages/shared_preferences/shared_preferences_android/example/pubspec.yaml @@ -21,6 +21,8 @@ dependencies: dev_dependencies: flutter_driver: sdk: flutter + flutter_test: + sdk: flutter integration_test: sdk: flutter diff --git a/packages/shared_preferences/shared_preferences_ios/CHANGELOG.md b/packages/shared_preferences/shared_preferences_ios/CHANGELOG.md index 99dde9c462b7..d2101e0784cf 100644 --- a/packages/shared_preferences/shared_preferences_ios/CHANGELOG.md +++ b/packages/shared_preferences/shared_preferences_ios/CHANGELOG.md @@ -1,5 +1,6 @@ ## NEXT +* Updates code for `no_leading_underscores_for_local_identifiers` lint. * Updates minimum Flutter version to 2.10. ## 2.1.1 diff --git a/packages/shared_preferences/shared_preferences_ios/example/integration_test/shared_preferences_test.dart b/packages/shared_preferences/shared_preferences_ios/example/integration_test/shared_preferences_test.dart index 3a6bab55eced..b4b21871701c 100644 --- a/packages/shared_preferences/shared_preferences_ios/example/integration_test/shared_preferences_test.dart +++ b/packages/shared_preferences/shared_preferences_ios/example/integration_test/shared_preferences_test.dart @@ -38,42 +38,42 @@ void main() { // Normally the app-facing package adds the prefix, but since this test // bypasses the app-facing package it needs to be manually added. - String _prefixedKey(String key) { + String prefixedKey(String key) { return 'flutter.$key'; } testWidgets('reading', (WidgetTester _) async { final Map values = await preferences.getAll(); - expect(values[_prefixedKey('String')], isNull); - expect(values[_prefixedKey('bool')], isNull); - expect(values[_prefixedKey('int')], isNull); - expect(values[_prefixedKey('double')], isNull); - expect(values[_prefixedKey('List')], isNull); + expect(values[prefixedKey('String')], isNull); + expect(values[prefixedKey('bool')], isNull); + expect(values[prefixedKey('int')], isNull); + expect(values[prefixedKey('double')], isNull); + expect(values[prefixedKey('List')], isNull); }); testWidgets('writing', (WidgetTester _) async { await Future.wait(>[ preferences.setValue( - 'String', _prefixedKey('String'), kTestValues2['flutter.String']!), + 'String', prefixedKey('String'), kTestValues2['flutter.String']!), preferences.setValue( - 'Bool', _prefixedKey('bool'), kTestValues2['flutter.bool']!), + 'Bool', prefixedKey('bool'), kTestValues2['flutter.bool']!), preferences.setValue( - 'Int', _prefixedKey('int'), kTestValues2['flutter.int']!), + 'Int', prefixedKey('int'), kTestValues2['flutter.int']!), preferences.setValue( - 'Double', _prefixedKey('double'), kTestValues2['flutter.double']!), + 'Double', prefixedKey('double'), kTestValues2['flutter.double']!), preferences.setValue( - 'StringList', _prefixedKey('List'), kTestValues2['flutter.List']!) + 'StringList', prefixedKey('List'), kTestValues2['flutter.List']!) ]); final Map values = await preferences.getAll(); - expect(values[_prefixedKey('String')], kTestValues2['flutter.String']); - expect(values[_prefixedKey('bool')], kTestValues2['flutter.bool']); - expect(values[_prefixedKey('int')], kTestValues2['flutter.int']); - expect(values[_prefixedKey('double')], kTestValues2['flutter.double']); - expect(values[_prefixedKey('List')], kTestValues2['flutter.List']); + expect(values[prefixedKey('String')], kTestValues2['flutter.String']); + expect(values[prefixedKey('bool')], kTestValues2['flutter.bool']); + expect(values[prefixedKey('int')], kTestValues2['flutter.int']); + expect(values[prefixedKey('double')], kTestValues2['flutter.double']); + expect(values[prefixedKey('List')], kTestValues2['flutter.List']); }); testWidgets('removing', (WidgetTester _) async { - final String key = _prefixedKey('testKey'); + final String key = prefixedKey('testKey'); await preferences.setValue('String', key, kTestValues['flutter.String']!); await preferences.setValue('Bool', key, kTestValues['flutter.bool']!); await preferences.setValue('Int', key, kTestValues['flutter.int']!); diff --git a/packages/shared_preferences/shared_preferences_ios/example/pubspec.yaml b/packages/shared_preferences/shared_preferences_ios/example/pubspec.yaml index e3db3c348946..446cea1e0508 100644 --- a/packages/shared_preferences/shared_preferences_ios/example/pubspec.yaml +++ b/packages/shared_preferences/shared_preferences_ios/example/pubspec.yaml @@ -21,6 +21,8 @@ dependencies: dev_dependencies: flutter_driver: sdk: flutter + flutter_test: + sdk: flutter integration_test: sdk: flutter diff --git a/packages/shared_preferences/shared_preferences_linux/CHANGELOG.md b/packages/shared_preferences/shared_preferences_linux/CHANGELOG.md index 60f93f31be3c..5d59660b4d6b 100644 --- a/packages/shared_preferences/shared_preferences_linux/CHANGELOG.md +++ b/packages/shared_preferences/shared_preferences_linux/CHANGELOG.md @@ -1,5 +1,6 @@ ## NEXT +* Updates code for `no_leading_underscores_for_local_identifiers` lint. * Updates minimum Flutter version to 2.10. ## 2.1.1 diff --git a/packages/shared_preferences/shared_preferences_linux/example/pubspec.yaml b/packages/shared_preferences/shared_preferences_linux/example/pubspec.yaml index 65a61112e588..9418c0581ed7 100644 --- a/packages/shared_preferences/shared_preferences_linux/example/pubspec.yaml +++ b/packages/shared_preferences/shared_preferences_linux/example/pubspec.yaml @@ -20,6 +20,8 @@ dependencies: dev_dependencies: flutter_driver: sdk: flutter + flutter_test: + sdk: flutter integration_test: sdk: flutter diff --git a/packages/shared_preferences/shared_preferences_linux/test/shared_preferences_linux_test.dart b/packages/shared_preferences/shared_preferences_linux/test/shared_preferences_linux_test.dart index 57acd17f5094..176d1d9f9ead 100644 --- a/packages/shared_preferences/shared_preferences_linux/test/shared_preferences_linux_test.dart +++ b/packages/shared_preferences/shared_preferences_linux/test/shared_preferences_linux_test.dart @@ -20,22 +20,22 @@ void main() { pathProvider = FakePathProviderLinux(); }); - Future _getFilePath() async { + Future getFilePath() async { final String? directory = await pathProvider.getApplicationSupportPath(); return path.join(directory!, 'shared_preferences.json'); } - Future _writeTestFile(String value) async { - fs.file(await _getFilePath()) + Future writeTestFile(String value) async { + fs.file(await getFilePath()) ..createSync(recursive: true) ..writeAsStringSync(value); } - Future _readTestFile() async { - return fs.file(await _getFilePath()).readAsStringSync(); + Future readTestFile() async { + return fs.file(await getFilePath()).readAsStringSync(); } - SharedPreferencesLinux _getPreferences() { + SharedPreferencesLinux getPreferences() { final SharedPreferencesLinux prefs = SharedPreferencesLinux(); prefs.fs = fs; prefs.pathProvider = pathProvider; @@ -49,8 +49,8 @@ void main() { }); test('getAll', () async { - await _writeTestFile('{"key1": "one", "key2": 2}'); - final SharedPreferencesLinux prefs = _getPreferences(); + await writeTestFile('{"key1": "one", "key2": 2}'); + final SharedPreferencesLinux prefs = getPreferences(); final Map values = await prefs.getAll(); expect(values, hasLength(2)); @@ -59,30 +59,30 @@ void main() { }); test('remove', () async { - await _writeTestFile('{"key1":"one","key2":2}'); - final SharedPreferencesLinux prefs = _getPreferences(); + await writeTestFile('{"key1":"one","key2":2}'); + final SharedPreferencesLinux prefs = getPreferences(); await prefs.remove('key2'); - expect(await _readTestFile(), '{"key1":"one"}'); + expect(await readTestFile(), '{"key1":"one"}'); }); test('setValue', () async { - await _writeTestFile('{}'); - final SharedPreferencesLinux prefs = _getPreferences(); + await writeTestFile('{}'); + final SharedPreferencesLinux prefs = getPreferences(); await prefs.setValue('', 'key1', 'one'); await prefs.setValue('', 'key2', 2); - expect(await _readTestFile(), '{"key1":"one","key2":2}'); + expect(await readTestFile(), '{"key1":"one","key2":2}'); }); test('clear', () async { - await _writeTestFile('{"key1":"one","key2":2}'); - final SharedPreferencesLinux prefs = _getPreferences(); + await writeTestFile('{"key1":"one","key2":2}'); + final SharedPreferencesLinux prefs = getPreferences(); await prefs.clear(); - expect(await _readTestFile(), '{}'); + expect(await readTestFile(), '{}'); }); } diff --git a/packages/shared_preferences/shared_preferences_macos/CHANGELOG.md b/packages/shared_preferences/shared_preferences_macos/CHANGELOG.md index bc4e1504be1c..fc8a78af95b9 100644 --- a/packages/shared_preferences/shared_preferences_macos/CHANGELOG.md +++ b/packages/shared_preferences/shared_preferences_macos/CHANGELOG.md @@ -1,5 +1,6 @@ ## NEXT +* Updates code for `no_leading_underscores_for_local_identifiers` lint. * Updates minimum Flutter version to 2.10. ## 2.0.4 diff --git a/packages/shared_preferences/shared_preferences_macos/example/integration_test/shared_preferences_test.dart b/packages/shared_preferences/shared_preferences_macos/example/integration_test/shared_preferences_test.dart index 874ceb4c51a7..a980eab26679 100644 --- a/packages/shared_preferences/shared_preferences_macos/example/integration_test/shared_preferences_test.dart +++ b/packages/shared_preferences/shared_preferences_macos/example/integration_test/shared_preferences_test.dart @@ -38,42 +38,42 @@ void main() { // Normally the app-facing package adds the prefix, but since this test // bypasses the app-facing package it needs to be manually added. - String _prefixedKey(String key) { + String prefixedKey(String key) { return 'flutter.$key'; } testWidgets('reading', (WidgetTester _) async { final Map values = await preferences.getAll(); - expect(values[_prefixedKey('String')], isNull); - expect(values[_prefixedKey('bool')], isNull); - expect(values[_prefixedKey('int')], isNull); - expect(values[_prefixedKey('double')], isNull); - expect(values[_prefixedKey('List')], isNull); + expect(values[prefixedKey('String')], isNull); + expect(values[prefixedKey('bool')], isNull); + expect(values[prefixedKey('int')], isNull); + expect(values[prefixedKey('double')], isNull); + expect(values[prefixedKey('List')], isNull); }); testWidgets('writing', (WidgetTester _) async { await Future.wait(>[ preferences.setValue( - 'String', _prefixedKey('String'), kTestValues2['flutter.String']!), + 'String', prefixedKey('String'), kTestValues2['flutter.String']!), preferences.setValue( - 'Bool', _prefixedKey('bool'), kTestValues2['flutter.bool']!), + 'Bool', prefixedKey('bool'), kTestValues2['flutter.bool']!), preferences.setValue( - 'Int', _prefixedKey('int'), kTestValues2['flutter.int']!), + 'Int', prefixedKey('int'), kTestValues2['flutter.int']!), preferences.setValue( - 'Double', _prefixedKey('double'), kTestValues2['flutter.double']!), + 'Double', prefixedKey('double'), kTestValues2['flutter.double']!), preferences.setValue( - 'StringList', _prefixedKey('List'), kTestValues2['flutter.List']!) + 'StringList', prefixedKey('List'), kTestValues2['flutter.List']!) ]); final Map values = await preferences.getAll(); - expect(values[_prefixedKey('String')], kTestValues2['flutter.String']); - expect(values[_prefixedKey('bool')], kTestValues2['flutter.bool']); - expect(values[_prefixedKey('int')], kTestValues2['flutter.int']); - expect(values[_prefixedKey('double')], kTestValues2['flutter.double']); - expect(values[_prefixedKey('List')], kTestValues2['flutter.List']); + expect(values[prefixedKey('String')], kTestValues2['flutter.String']); + expect(values[prefixedKey('bool')], kTestValues2['flutter.bool']); + expect(values[prefixedKey('int')], kTestValues2['flutter.int']); + expect(values[prefixedKey('double')], kTestValues2['flutter.double']); + expect(values[prefixedKey('List')], kTestValues2['flutter.List']); }); testWidgets('removing', (WidgetTester _) async { - final String key = _prefixedKey('testKey'); + final String key = prefixedKey('testKey'); await preferences.setValue('String', key, kTestValues['flutter.String']!); await preferences.setValue('Bool', key, kTestValues['flutter.bool']!); await preferences.setValue('Int', key, kTestValues['flutter.int']!); diff --git a/packages/shared_preferences/shared_preferences_macos/example/pubspec.yaml b/packages/shared_preferences/shared_preferences_macos/example/pubspec.yaml index 96d8b5f0ba2e..f650fb7a6268 100644 --- a/packages/shared_preferences/shared_preferences_macos/example/pubspec.yaml +++ b/packages/shared_preferences/shared_preferences_macos/example/pubspec.yaml @@ -21,6 +21,8 @@ dependencies: dev_dependencies: flutter_driver: sdk: flutter + flutter_test: + sdk: flutter integration_test: sdk: flutter diff --git a/packages/shared_preferences/shared_preferences_web/example/pubspec.yaml b/packages/shared_preferences/shared_preferences_web/example/pubspec.yaml index 5e637144a257..050275489efa 100644 --- a/packages/shared_preferences/shared_preferences_web/example/pubspec.yaml +++ b/packages/shared_preferences/shared_preferences_web/example/pubspec.yaml @@ -8,6 +8,7 @@ environment: dependencies: flutter: sdk: flutter + shared_preferences_platform_interface: ^2.0.0 shared_preferences_web: path: ../ diff --git a/packages/shared_preferences/shared_preferences_windows/CHANGELOG.md b/packages/shared_preferences/shared_preferences_windows/CHANGELOG.md index b8351c8795d1..935a5ee54c2b 100644 --- a/packages/shared_preferences/shared_preferences_windows/CHANGELOG.md +++ b/packages/shared_preferences/shared_preferences_windows/CHANGELOG.md @@ -1,5 +1,6 @@ ## NEXT +* Updates code for `no_leading_underscores_for_local_identifiers` lint. * Updates minimum Flutter version to 2.10. ## 2.1.1 diff --git a/packages/shared_preferences/shared_preferences_windows/example/pubspec.yaml b/packages/shared_preferences/shared_preferences_windows/example/pubspec.yaml index b1f6db4f67c7..43c2145b32ae 100644 --- a/packages/shared_preferences/shared_preferences_windows/example/pubspec.yaml +++ b/packages/shared_preferences/shared_preferences_windows/example/pubspec.yaml @@ -20,6 +20,8 @@ dependencies: dev_dependencies: flutter_driver: sdk: flutter + flutter_test: + sdk: flutter integration_test: sdk: flutter diff --git a/packages/shared_preferences/shared_preferences_windows/test/shared_preferences_windows_test.dart b/packages/shared_preferences/shared_preferences_windows/test/shared_preferences_windows_test.dart index 0c47e9865765..04fa335b703e 100644 --- a/packages/shared_preferences/shared_preferences_windows/test/shared_preferences_windows_test.dart +++ b/packages/shared_preferences/shared_preferences_windows/test/shared_preferences_windows_test.dart @@ -19,22 +19,22 @@ void main() { pathProvider = FakePathProviderWindows(); }); - Future _getFilePath() async { + Future getFilePath() async { final String? directory = await pathProvider.getApplicationSupportPath(); return path.join(directory!, 'shared_preferences.json'); } - Future _writeTestFile(String value) async { - fileSystem.file(await _getFilePath()) + Future writeTestFile(String value) async { + fileSystem.file(await getFilePath()) ..createSync(recursive: true) ..writeAsStringSync(value); } - Future _readTestFile() async { - return fileSystem.file(await _getFilePath()).readAsStringSync(); + Future readTestFile() async { + return fileSystem.file(await getFilePath()).readAsStringSync(); } - SharedPreferencesWindows _getPreferences() { + SharedPreferencesWindows getPreferences() { final SharedPreferencesWindows prefs = SharedPreferencesWindows(); prefs.fs = fileSystem; prefs.pathProvider = pathProvider; @@ -48,8 +48,8 @@ void main() { }); test('getAll', () async { - await _writeTestFile('{"key1": "one", "key2": 2}'); - final SharedPreferencesWindows prefs = _getPreferences(); + await writeTestFile('{"key1": "one", "key2": 2}'); + final SharedPreferencesWindows prefs = getPreferences(); final Map values = await prefs.getAll(); expect(values, hasLength(2)); @@ -58,30 +58,30 @@ void main() { }); test('remove', () async { - await _writeTestFile('{"key1":"one","key2":2}'); - final SharedPreferencesWindows prefs = _getPreferences(); + await writeTestFile('{"key1":"one","key2":2}'); + final SharedPreferencesWindows prefs = getPreferences(); await prefs.remove('key2'); - expect(await _readTestFile(), '{"key1":"one"}'); + expect(await readTestFile(), '{"key1":"one"}'); }); test('setValue', () async { - await _writeTestFile('{}'); - final SharedPreferencesWindows prefs = _getPreferences(); + await writeTestFile('{}'); + final SharedPreferencesWindows prefs = getPreferences(); await prefs.setValue('', 'key1', 'one'); await prefs.setValue('', 'key2', 2); - expect(await _readTestFile(), '{"key1":"one","key2":2}'); + expect(await readTestFile(), '{"key1":"one","key2":2}'); }); test('clear', () async { - await _writeTestFile('{"key1":"one","key2":2}'); - final SharedPreferencesWindows prefs = _getPreferences(); + await writeTestFile('{"key1":"one","key2":2}'); + final SharedPreferencesWindows prefs = getPreferences(); await prefs.clear(); - expect(await _readTestFile(), '{}'); + expect(await readTestFile(), '{}'); }); } diff --git a/packages/url_launcher/url_launcher/CHANGELOG.md b/packages/url_launcher/url_launcher/CHANGELOG.md index 0b590d5deaad..18a0289eb43f 100644 --- a/packages/url_launcher/url_launcher/CHANGELOG.md +++ b/packages/url_launcher/url_launcher/CHANGELOG.md @@ -1,5 +1,6 @@ -## NEXT +## 6.1.6 +* Updates imports for `prefer_relative_imports`. * Updates minimum Flutter version to 2.10. * Fixes avoid_redundant_argument_values lint warnings and minor typos. diff --git a/packages/url_launcher/url_launcher/example/pubspec.yaml b/packages/url_launcher/url_launcher/example/pubspec.yaml index 77af2dc2b65a..573dc0d9ed01 100644 --- a/packages/url_launcher/url_launcher/example/pubspec.yaml +++ b/packages/url_launcher/url_launcher/example/pubspec.yaml @@ -22,6 +22,8 @@ dev_dependencies: build_runner: ^2.1.10 flutter_driver: sdk: flutter + flutter_test: + sdk: flutter integration_test: sdk: flutter mockito: ^5.0.0 diff --git a/packages/url_launcher/url_launcher/lib/src/url_launcher_uri.dart b/packages/url_launcher/url_launcher/lib/src/url_launcher_uri.dart index 9061b517e0d5..30321026ceb9 100644 --- a/packages/url_launcher/url_launcher/lib/src/url_launcher_uri.dart +++ b/packages/url_launcher/url_launcher/lib/src/url_launcher_uri.dart @@ -4,9 +4,9 @@ import 'dart:async'; -import 'package:url_launcher/url_launcher_string.dart'; import 'package:url_launcher_platform_interface/url_launcher_platform_interface.dart'; +import '../url_launcher_string.dart'; import 'type_conversion.dart'; /// Passes [url] to the underlying platform for handling. diff --git a/packages/url_launcher/url_launcher/pubspec.yaml b/packages/url_launcher/url_launcher/pubspec.yaml index ff21c6360e10..8efda4afb580 100644 --- a/packages/url_launcher/url_launcher/pubspec.yaml +++ b/packages/url_launcher/url_launcher/pubspec.yaml @@ -3,7 +3,7 @@ description: Flutter plugin for launching a URL. Supports web, phone, SMS, and email schemes. repository: https://github.com/flutter/plugins/tree/main/packages/url_launcher/url_launcher issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+url_launcher%22 -version: 6.1.5 +version: 6.1.6 environment: sdk: ">=2.14.0 <3.0.0" diff --git a/packages/url_launcher/url_launcher_android/example/pubspec.yaml b/packages/url_launcher/url_launcher_android/example/pubspec.yaml index 52d761baa120..6c922c7a0f7d 100644 --- a/packages/url_launcher/url_launcher_android/example/pubspec.yaml +++ b/packages/url_launcher/url_launcher_android/example/pubspec.yaml @@ -16,10 +16,13 @@ dependencies: # The example app is bundled with the plugin so we use a path dependency on # the parent directory to use the current plugin's version. path: ../ + url_launcher_platform_interface: ^2.0.3 dev_dependencies: flutter_driver: sdk: flutter + flutter_test: + sdk: flutter integration_test: sdk: flutter mockito: ^5.0.0 diff --git a/packages/url_launcher/url_launcher_ios/example/pubspec.yaml b/packages/url_launcher/url_launcher_ios/example/pubspec.yaml index 84748f17a781..9a134c747fa4 100644 --- a/packages/url_launcher/url_launcher_ios/example/pubspec.yaml +++ b/packages/url_launcher/url_launcher_ios/example/pubspec.yaml @@ -16,10 +16,13 @@ dependencies: # The example app is bundled with the plugin so we use a path dependency on # the parent directory to use the current plugin's version. path: ../ + url_launcher_platform_interface: ^2.0.3 dev_dependencies: flutter_driver: sdk: flutter + flutter_test: + sdk: flutter integration_test: sdk: flutter mockito: ^5.0.0 diff --git a/packages/url_launcher/url_launcher_linux/example/pubspec.yaml b/packages/url_launcher/url_launcher_linux/example/pubspec.yaml index 0d5357055e96..17effeb1ffcb 100644 --- a/packages/url_launcher/url_launcher_linux/example/pubspec.yaml +++ b/packages/url_launcher/url_launcher_linux/example/pubspec.yaml @@ -21,6 +21,8 @@ dependencies: dev_dependencies: flutter_driver: sdk: flutter + flutter_test: + sdk: flutter integration_test: sdk: flutter diff --git a/packages/url_launcher/url_launcher_macos/example/pubspec.yaml b/packages/url_launcher/url_launcher_macos/example/pubspec.yaml index efa4f63bd48f..3b802ea229ba 100644 --- a/packages/url_launcher/url_launcher_macos/example/pubspec.yaml +++ b/packages/url_launcher/url_launcher_macos/example/pubspec.yaml @@ -21,6 +21,8 @@ dependencies: dev_dependencies: flutter_driver: sdk: flutter + flutter_test: + sdk: flutter integration_test: sdk: flutter diff --git a/packages/url_launcher/url_launcher_platform_interface/CHANGELOG.md b/packages/url_launcher/url_launcher_platform_interface/CHANGELOG.md index fcf362ceb7d9..d45ca36e3906 100644 --- a/packages/url_launcher/url_launcher_platform_interface/CHANGELOG.md +++ b/packages/url_launcher/url_launcher_platform_interface/CHANGELOG.md @@ -1,5 +1,6 @@ -## NEXT +## 2.1.1 +* Updates imports for `prefer_relative_imports`. * Updates minimum Flutter version to 2.10. ## 2.1.0 diff --git a/packages/url_launcher/url_launcher_platform_interface/lib/src/url_launcher_platform.dart b/packages/url_launcher/url_launcher_platform_interface/lib/src/url_launcher_platform.dart index aa499db4ce6f..8928d4249e90 100644 --- a/packages/url_launcher/url_launcher_platform_interface/lib/src/url_launcher_platform.dart +++ b/packages/url_launcher/url_launcher_platform_interface/lib/src/url_launcher_platform.dart @@ -5,10 +5,10 @@ import 'dart:async'; import 'package:plugin_platform_interface/plugin_platform_interface.dart'; -import 'package:url_launcher_platform_interface/link.dart'; -import 'package:url_launcher_platform_interface/url_launcher_platform_interface.dart'; +import '../link.dart'; import '../method_channel_url_launcher.dart'; +import '../url_launcher_platform_interface.dart'; /// The interface that implementations of url_launcher must implement. /// diff --git a/packages/url_launcher/url_launcher_platform_interface/pubspec.yaml b/packages/url_launcher/url_launcher_platform_interface/pubspec.yaml index 94ee1ecb29a4..4364e116c508 100644 --- a/packages/url_launcher/url_launcher_platform_interface/pubspec.yaml +++ b/packages/url_launcher/url_launcher_platform_interface/pubspec.yaml @@ -4,7 +4,7 @@ repository: https://github.com/flutter/plugins/tree/main/packages/url_launcher/u issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+url_launcher%22 # NOTE: We strongly prefer non-breaking changes, even at the expense of a # less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes -version: 2.1.0 +version: 2.1.1 environment: sdk: ">=2.12.0 <3.0.0" diff --git a/packages/url_launcher/url_launcher_web/example/pubspec.yaml b/packages/url_launcher/url_launcher_web/example/pubspec.yaml index 15bdc70517d8..881cb29c7599 100644 --- a/packages/url_launcher/url_launcher_web/example/pubspec.yaml +++ b/packages/url_launcher/url_launcher_web/example/pubspec.yaml @@ -15,8 +15,11 @@ dev_dependencies: sdk: flutter flutter_test: sdk: flutter + flutter_web_plugins: + sdk: flutter integration_test: sdk: flutter mockito: ^5.0.0 + url_launcher_platform_interface: ^2.0.3 url_launcher_web: path: ../ diff --git a/packages/url_launcher/url_launcher_windows/example/pubspec.yaml b/packages/url_launcher/url_launcher_windows/example/pubspec.yaml index 3bd8492709af..966d32c779e8 100644 --- a/packages/url_launcher/url_launcher_windows/example/pubspec.yaml +++ b/packages/url_launcher/url_launcher_windows/example/pubspec.yaml @@ -21,6 +21,8 @@ dependencies: dev_dependencies: flutter_driver: sdk: flutter + flutter_test: + sdk: flutter integration_test: sdk: flutter diff --git a/packages/video_player/video_player/CHANGELOG.md b/packages/video_player/video_player/CHANGELOG.md index 53cfabf31e78..0885f28f9db8 100644 --- a/packages/video_player/video_player/CHANGELOG.md +++ b/packages/video_player/video_player/CHANGELOG.md @@ -1,3 +1,7 @@ +## NEXT + +* Updates code for `no_leading_underscores_for_local_identifiers` lint. + ## 2.4.7 * Updates README via code excerpts. diff --git a/packages/video_player/video_player/example/integration_test/video_player_test.dart b/packages/video_player/video_player/example/integration_test/video_player_test.dart index 023c4b3fcb43..dd77a2f0252a 100644 --- a/packages/video_player/video_player/example/integration_test/video_player_test.dart +++ b/packages/video_player/video_player/example/integration_test/video_player_test.dart @@ -37,22 +37,22 @@ String getUrlForAssetAsNetworkSource(String assetKey) { void main() { IntegrationTestWidgetsFlutterBinding.ensureInitialized(); - late VideoPlayerController _controller; - tearDown(() async => _controller.dispose()); + late VideoPlayerController controller; + tearDown(() async => controller.dispose()); group('asset videos', () { setUp(() { - _controller = VideoPlayerController.asset(_videoAssetKey); + controller = VideoPlayerController.asset(_videoAssetKey); }); testWidgets('can be initialized', (WidgetTester tester) async { - await _controller.initialize(); + await controller.initialize(); - expect(_controller.value.isInitialized, true); - expect(_controller.value.position, Duration.zero); - expect(_controller.value.isPlaying, false); + expect(controller.value.isInitialized, true); + expect(controller.value.position, Duration.zero); + expect(controller.value.isPlaying, false); // The WebM version has a slightly different duration than the MP4. - expect(_controller.value.duration, + expect(controller.value.duration, const Duration(seconds: 7, milliseconds: kIsWeb ? 544 : 540)); }); @@ -77,16 +77,16 @@ void main() { testWidgets( 'can be played', (WidgetTester tester) async { - await _controller.initialize(); + await controller.initialize(); // Mute to allow playing without DOM interaction on Web. // See https://developers.google.com/web/updates/2017/09/autoplay-policy-changes - await _controller.setVolume(0); + await controller.setVolume(0); - await _controller.play(); + await controller.play(); await tester.pumpAndSettle(_playDuration); - expect(_controller.value.isPlaying, true); - expect(_controller.value.position, + expect(controller.value.isPlaying, true); + expect(controller.value.position, (Duration position) => position > Duration.zero); }, ); @@ -94,85 +94,85 @@ void main() { testWidgets( 'can seek', (WidgetTester tester) async { - await _controller.initialize(); + await controller.initialize(); - await _controller.seekTo(const Duration(seconds: 3)); + await controller.seekTo(const Duration(seconds: 3)); - expect(_controller.value.position, const Duration(seconds: 3)); + expect(controller.value.position, const Duration(seconds: 3)); }, ); testWidgets( 'can be paused', (WidgetTester tester) async { - await _controller.initialize(); + await controller.initialize(); // Mute to allow playing without DOM interaction on Web. // See https://developers.google.com/web/updates/2017/09/autoplay-policy-changes - await _controller.setVolume(0); + await controller.setVolume(0); // Play for a second, then pause, and then wait a second. - await _controller.play(); + await controller.play(); await tester.pumpAndSettle(_playDuration); - await _controller.pause(); - final Duration pausedPosition = _controller.value.position; + await controller.pause(); + final Duration pausedPosition = controller.value.position; await tester.pumpAndSettle(_playDuration); // Verify that we stopped playing after the pause. - expect(_controller.value.isPlaying, false); - expect(_controller.value.position, pausedPosition); + expect(controller.value.isPlaying, false); + expect(controller.value.position, pausedPosition); }, ); testWidgets( 'stay paused when seeking after video completed', (WidgetTester tester) async { - await _controller.initialize(); + await controller.initialize(); // Mute to allow playing without DOM interaction on Web. // See https://developers.google.com/web/updates/2017/09/autoplay-policy-changes - await _controller.setVolume(0); + await controller.setVolume(0); final Duration tenMillisBeforeEnd = - _controller.value.duration - const Duration(milliseconds: 10); - await _controller.seekTo(tenMillisBeforeEnd); - await _controller.play(); + controller.value.duration - const Duration(milliseconds: 10); + await controller.seekTo(tenMillisBeforeEnd); + await controller.play(); await tester.pumpAndSettle(_playDuration); - expect(_controller.value.isPlaying, false); - expect(_controller.value.position, _controller.value.duration); + expect(controller.value.isPlaying, false); + expect(controller.value.position, controller.value.duration); - await _controller.seekTo(tenMillisBeforeEnd); + await controller.seekTo(tenMillisBeforeEnd); await tester.pumpAndSettle(_playDuration); - expect(_controller.value.isPlaying, false); - expect(_controller.value.position, tenMillisBeforeEnd); + expect(controller.value.isPlaying, false); + expect(controller.value.position, tenMillisBeforeEnd); }, ); testWidgets( 'do not exceed duration on play after video completed', (WidgetTester tester) async { - await _controller.initialize(); + await controller.initialize(); // Mute to allow playing without DOM interaction on Web. // See https://developers.google.com/web/updates/2017/09/autoplay-policy-changes - await _controller.setVolume(0); - await _controller.seekTo( - _controller.value.duration - const Duration(milliseconds: 10)); - await _controller.play(); + await controller.setVolume(0); + await controller.seekTo( + controller.value.duration - const Duration(milliseconds: 10)); + await controller.play(); await tester.pumpAndSettle(_playDuration); - expect(_controller.value.isPlaying, false); - expect(_controller.value.position, _controller.value.duration); + expect(controller.value.isPlaying, false); + expect(controller.value.position, controller.value.duration); - await _controller.play(); + await controller.play(); await tester.pumpAndSettle(_playDuration); - expect(_controller.value.position, - lessThanOrEqualTo(_controller.value.duration)); + expect(controller.value.position, + lessThanOrEqualTo(controller.value.duration)); }, ); testWidgets('test video player view with local asset', (WidgetTester tester) async { Future started() async { - await _controller.initialize(); - await _controller.play(); + await controller.initialize(); + await controller.play(); return true; } @@ -185,8 +185,8 @@ void main() { builder: (BuildContext context, AsyncSnapshot snapshot) { if (snapshot.data ?? false) { return AspectRatio( - aspectRatio: _controller.value.aspectRatio, - child: VideoPlayer(_controller), + aspectRatio: controller.value.aspectRatio, + child: VideoPlayer(controller), ); } else { return const Text('waiting for video to load'); @@ -198,7 +198,7 @@ void main() { )); await tester.pumpAndSettle(); - expect(_controller.value.isPlaying, true); + expect(controller.value.isPlaying, true); }, skip: kIsWeb || // Web does not support local assets. // Extremely flaky on iOS: https://github.com/flutter/flutter/issues/86915 @@ -216,54 +216,54 @@ void main() { final File file = File('$tempDir/$filename'); await file.writeAsBytes(bytes.buffer.asInt8List()); - _controller = VideoPlayerController.file(file); + controller = VideoPlayerController.file(file); }); testWidgets('test video player using static file() method as constructor', (WidgetTester tester) async { - await _controller.initialize(); + await controller.initialize(); - await _controller.play(); - expect(_controller.value.isPlaying, true); + await controller.play(); + expect(controller.value.isPlaying, true); - await _controller.pause(); - expect(_controller.value.isPlaying, false); + await controller.pause(); + expect(controller.value.isPlaying, false); }, skip: kIsWeb); }); group('network videos', () { setUp(() { - _controller = VideoPlayerController.network( + controller = VideoPlayerController.network( getUrlForAssetAsNetworkSource(_videoAssetKey)); }); testWidgets( 'reports buffering status', (WidgetTester tester) async { - await _controller.initialize(); + await controller.initialize(); // Mute to allow playing without DOM interaction on Web. // See https://developers.google.com/web/updates/2017/09/autoplay-policy-changes - await _controller.setVolume(0); + await controller.setVolume(0); final Completer started = Completer(); final Completer ended = Completer(); - _controller.addListener(() { - if (!started.isCompleted && _controller.value.isBuffering) { + controller.addListener(() { + if (!started.isCompleted && controller.value.isBuffering) { started.complete(); } if (started.isCompleted && - !_controller.value.isBuffering && + !controller.value.isBuffering && !ended.isCompleted) { ended.complete(); } }); - await _controller.play(); - await _controller.seekTo(const Duration(seconds: 5)); + await controller.play(); + await controller.seekTo(const Duration(seconds: 5)); await tester.pumpAndSettle(_playDuration); - await _controller.pause(); + await controller.pause(); - expect(_controller.value.isPlaying, false); - expect(_controller.value.position, + expect(controller.value.isPlaying, false); + expect(controller.value.position, (Duration position) => position > Duration.zero); await expectLater(started.future, completes); @@ -277,63 +277,63 @@ void main() { // but could be removed in the future. group('asset audios', () { setUp(() { - _controller = VideoPlayerController.asset('assets/Audio.mp3'); + controller = VideoPlayerController.asset('assets/Audio.mp3'); }); testWidgets('can be initialized', (WidgetTester tester) async { - await _controller.initialize(); + await controller.initialize(); - expect(_controller.value.isInitialized, true); - expect(_controller.value.position, Duration.zero); - expect(_controller.value.isPlaying, false); + expect(controller.value.isInitialized, true); + expect(controller.value.position, Duration.zero); + expect(controller.value.isPlaying, false); // Due to the duration calculation accuracy between platforms, // the milliseconds on Web will be a slightly different from natives. // The audio was made with 44100 Hz, 192 Kbps CBR, and 32 bits. expect( - _controller.value.duration, + controller.value.duration, const Duration(seconds: 5, milliseconds: kIsWeb ? 42 : 41), ); }); testWidgets('can be played', (WidgetTester tester) async { - await _controller.initialize(); + await controller.initialize(); // Mute to allow playing without DOM interaction on Web. // See https://developers.google.com/web/updates/2017/09/autoplay-policy-changes - await _controller.setVolume(0); + await controller.setVolume(0); - await _controller.play(); + await controller.play(); await tester.pumpAndSettle(_playDuration); - expect(_controller.value.isPlaying, true); + expect(controller.value.isPlaying, true); expect( - _controller.value.position, + controller.value.position, (Duration position) => position > Duration.zero, ); }); testWidgets('can seek', (WidgetTester tester) async { - await _controller.initialize(); - await _controller.seekTo(const Duration(seconds: 3)); + await controller.initialize(); + await controller.seekTo(const Duration(seconds: 3)); - expect(_controller.value.position, const Duration(seconds: 3)); + expect(controller.value.position, const Duration(seconds: 3)); }); testWidgets('can be paused', (WidgetTester tester) async { - await _controller.initialize(); + await controller.initialize(); // Mute to allow playing without DOM interaction on Web. // See https://developers.google.com/web/updates/2017/09/autoplay-policy-changes - await _controller.setVolume(0); + await controller.setVolume(0); // Play for a second, then pause, and then wait a second. - await _controller.play(); + await controller.play(); await tester.pumpAndSettle(_playDuration); - await _controller.pause(); - final Duration pausedPosition = _controller.value.position; + await controller.pause(); + final Duration pausedPosition = controller.value.position; await tester.pumpAndSettle(_playDuration); // Verify that we stopped playing after the pause. - expect(_controller.value.isPlaying, false); - expect(_controller.value.position, pausedPosition); + expect(controller.value.isPlaying, false); + expect(controller.value.position, pausedPosition); }); }); } diff --git a/packages/video_player/video_player/test/video_player_test.dart b/packages/video_player/video_player/test/video_player_test.dart index e7b3e1de7e63..8e5e98b68f18 100644 --- a/packages/video_player/video_player/test/video_player_test.dart +++ b/packages/video_player/video_player/test/video_player_test.dart @@ -105,7 +105,7 @@ class _FakeClosedCaptionFile extends ClosedCaptionFile { } void main() { - void _verifyPlayStateRespondsToLifecycle( + void verifyPlayStateRespondsToLifecycle( VideoPlayerController controller, { required bool shouldPlayInBackground, }) { @@ -248,7 +248,7 @@ void main() { ); await controller.initialize(); await controller.play(); - _verifyPlayStateRespondsToLifecycle(controller, + verifyPlayStateRespondsToLifecycle(controller, shouldPlayInBackground: false); }); @@ -1025,7 +1025,7 @@ void main() { ); await controller.initialize(); await controller.play(); - _verifyPlayStateRespondsToLifecycle( + verifyPlayStateRespondsToLifecycle( controller, shouldPlayInBackground: true, ); @@ -1038,7 +1038,7 @@ void main() { ); await controller.initialize(); await controller.play(); - _verifyPlayStateRespondsToLifecycle( + verifyPlayStateRespondsToLifecycle( controller, shouldPlayInBackground: false, ); diff --git a/packages/video_player/video_player_android/CHANGELOG.md b/packages/video_player/video_player_android/CHANGELOG.md index 7986d1a28625..7298bacf4f78 100644 --- a/packages/video_player/video_player_android/CHANGELOG.md +++ b/packages/video_player/video_player_android/CHANGELOG.md @@ -1,5 +1,6 @@ ## NEXT +* Updates code for `no_leading_underscores_for_local_identifiers` lint. * Updates minimum Flutter version to 2.10. * Fixes violations of new analysis option use_named_constants. diff --git a/packages/video_player/video_player_android/example/integration_test/video_player_test.dart b/packages/video_player/video_player_android/example/integration_test/video_player_test.dart index ef7bdeda3503..751412c80f43 100644 --- a/packages/video_player/video_player_android/example/integration_test/video_player_test.dart +++ b/packages/video_player/video_player_android/example/integration_test/video_player_test.dart @@ -39,12 +39,12 @@ String getUrlForAssetAsNetworkSource(String assetKey) { void main() { IntegrationTestWidgetsFlutterBinding.ensureInitialized(); - late MiniController _controller; - tearDown(() async => _controller.dispose()); + late MiniController controller; + tearDown(() async => controller.dispose()); group('asset videos', () { setUp(() { - _controller = MiniController.asset(_videoAssetKey); + controller = MiniController.asset(_videoAssetKey); }); testWidgets('registers expected implementation', @@ -54,44 +54,44 @@ void main() { }); testWidgets('can be initialized', (WidgetTester tester) async { - await _controller.initialize(); + await controller.initialize(); - expect(_controller.value.isInitialized, true); - expect(await _controller.position, Duration.zero); - expect(_controller.value.duration, + expect(controller.value.isInitialized, true); + expect(await controller.position, Duration.zero); + expect(controller.value.duration, const Duration(seconds: 7, milliseconds: 540)); }); testWidgets('can be played', (WidgetTester tester) async { - await _controller.initialize(); + await controller.initialize(); - await _controller.play(); + await controller.play(); await tester.pumpAndSettle(_playDuration); - expect(await _controller.position, greaterThan(Duration.zero)); + expect(await controller.position, greaterThan(Duration.zero)); }); testWidgets('can seek', (WidgetTester tester) async { - await _controller.initialize(); + await controller.initialize(); - await _controller.seekTo(const Duration(seconds: 3)); + await controller.seekTo(const Duration(seconds: 3)); - expect(await _controller.position, const Duration(seconds: 3)); + expect(await controller.position, const Duration(seconds: 3)); }); testWidgets('can be paused', (WidgetTester tester) async { - await _controller.initialize(); + await controller.initialize(); // Play for a second, then pause, and then wait a second. - await _controller.play(); + await controller.play(); await tester.pumpAndSettle(_playDuration); - await _controller.pause(); + await controller.pause(); await tester.pumpAndSettle(_playDuration); - final Duration pausedPosition = (await _controller.position)!; + final Duration pausedPosition = (await controller.position)!; await tester.pumpAndSettle(_playDuration); // Verify that we stopped playing after the pause. - expect(await _controller.position, pausedPosition); + expect(await controller.position, pausedPosition); }); }); @@ -106,48 +106,48 @@ void main() { final File file = File('$tempDir/$filename'); await file.writeAsBytes(bytes.buffer.asInt8List()); - _controller = MiniController.file(file); + controller = MiniController.file(file); }); testWidgets('test video player using static file() method as constructor', (WidgetTester tester) async { - await _controller.initialize(); + await controller.initialize(); - await _controller.play(); + await controller.play(); await tester.pumpAndSettle(_playDuration); - expect(await _controller.position, greaterThan(Duration.zero)); + expect(await controller.position, greaterThan(Duration.zero)); }); }); group('network videos', () { setUp(() { final String videoUrl = getUrlForAssetAsNetworkSource(_videoAssetKey); - _controller = MiniController.network(videoUrl); + controller = MiniController.network(videoUrl); }); testWidgets('reports buffering status', (WidgetTester tester) async { - await _controller.initialize(); + await controller.initialize(); final Completer started = Completer(); final Completer ended = Completer(); - _controller.addListener(() { - if (!started.isCompleted && _controller.value.isBuffering) { + controller.addListener(() { + if (!started.isCompleted && controller.value.isBuffering) { started.complete(); } if (started.isCompleted && - !_controller.value.isBuffering && + !controller.value.isBuffering && !ended.isCompleted) { ended.complete(); } }); - await _controller.play(); - await _controller.seekTo(const Duration(seconds: 5)); + await controller.play(); + await controller.seekTo(const Duration(seconds: 5)); await tester.pumpAndSettle(_playDuration); - await _controller.pause(); + await controller.pause(); - expect(await _controller.position, greaterThan(Duration.zero)); + expect(await controller.position, greaterThan(Duration.zero)); await expectLater(started.future, completes); await expectLater(ended.future, completes); diff --git a/packages/video_player/video_player_avfoundation/CHANGELOG.md b/packages/video_player/video_player_avfoundation/CHANGELOG.md index cc4411c8c651..ed2f345784bd 100644 --- a/packages/video_player/video_player_avfoundation/CHANGELOG.md +++ b/packages/video_player/video_player_avfoundation/CHANGELOG.md @@ -1,3 +1,8 @@ +## 2.3.7 + +* Fixes a bug where the aspect ratio of some HLS videos are incorrectly inverted. +* Updates code for `no_leading_underscores_for_local_identifiers` lint. + ## 2.3.6 * Fixes a bug in iOS 16 where videos from protected live streams are not shown. diff --git a/packages/video_player/video_player_avfoundation/example/integration_test/video_player_test.dart b/packages/video_player/video_player_avfoundation/example/integration_test/video_player_test.dart index 15108aa0713a..5027973a660d 100644 --- a/packages/video_player/video_player_avfoundation/example/integration_test/video_player_test.dart +++ b/packages/video_player/video_player_avfoundation/example/integration_test/video_player_test.dart @@ -39,12 +39,12 @@ String getUrlForAssetAsNetworkSource(String assetKey) { void main() { IntegrationTestWidgetsFlutterBinding.ensureInitialized(); - late MiniController _controller; - tearDown(() async => _controller.dispose()); + late MiniController controller; + tearDown(() async => controller.dispose()); group('asset videos', () { setUp(() { - _controller = MiniController.asset(_videoAssetKey); + controller = MiniController.asset(_videoAssetKey); }); testWidgets('registers expected implementation', @@ -54,50 +54,50 @@ void main() { }); testWidgets('can be initialized', (WidgetTester tester) async { - await _controller.initialize(); + await controller.initialize(); - expect(_controller.value.isInitialized, true); - expect(await _controller.position, Duration.zero); - expect(_controller.value.duration, + expect(controller.value.isInitialized, true); + expect(await controller.position, Duration.zero); + expect(controller.value.duration, const Duration(seconds: 7, milliseconds: 540)); }); testWidgets('can be played', (WidgetTester tester) async { - await _controller.initialize(); + await controller.initialize(); - await _controller.play(); + await controller.play(); await tester.pumpAndSettle(_playDuration); - expect(await _controller.position, greaterThan(Duration.zero)); + expect(await controller.position, greaterThan(Duration.zero)); }); testWidgets('can seek', (WidgetTester tester) async { - await _controller.initialize(); + await controller.initialize(); - await _controller.seekTo(const Duration(seconds: 3)); + await controller.seekTo(const Duration(seconds: 3)); // TODO(stuartmorgan): Switch to _controller.position once seekTo is // fixed on the native side to wait for completion, so this is testing // the native code rather than the MiniController position cache. - expect(_controller.value.position, const Duration(seconds: 3)); + expect(controller.value.position, const Duration(seconds: 3)); }); testWidgets('can be paused', (WidgetTester tester) async { - await _controller.initialize(); + await controller.initialize(); // Play for a second, then pause, and then wait a second. - await _controller.play(); + await controller.play(); await tester.pumpAndSettle(_playDuration); - await _controller.pause(); - final Duration pausedPosition = (await _controller.position)!; + await controller.pause(); + final Duration pausedPosition = (await controller.position)!; await tester.pumpAndSettle(_playDuration); // Verify that we stopped playing after the pause. // TODO(stuartmorgan): Investigate why this has a slight discrepency, and // fix it if possible. Is AVPlayer's pause method internally async? const Duration allowableDelta = Duration(milliseconds: 10); - expect(await _controller.position, - lessThan(pausedPosition + allowableDelta)); + expect( + await controller.position, lessThan(pausedPosition + allowableDelta)); }); }); @@ -112,51 +112,51 @@ void main() { final File file = File('$tempDir/$filename'); await file.writeAsBytes(bytes.buffer.asInt8List()); - _controller = MiniController.file(file); + controller = MiniController.file(file); }); testWidgets('test video player using static file() method as constructor', (WidgetTester tester) async { - await _controller.initialize(); + await controller.initialize(); - await _controller.play(); + await controller.play(); await tester.pumpAndSettle(_playDuration); - expect(await _controller.position, greaterThan(Duration.zero)); + expect(await controller.position, greaterThan(Duration.zero)); }); }); group('network videos', () { setUp(() { final String videoUrl = getUrlForAssetAsNetworkSource(_videoAssetKey); - _controller = MiniController.network(videoUrl); + controller = MiniController.network(videoUrl); }); testWidgets('reports buffering status', (WidgetTester tester) async { - await _controller.initialize(); + await controller.initialize(); final Completer started = Completer(); final Completer ended = Completer(); - _controller.addListener(() { - if (!started.isCompleted && _controller.value.isBuffering) { + controller.addListener(() { + if (!started.isCompleted && controller.value.isBuffering) { started.complete(); } if (started.isCompleted && - !_controller.value.isBuffering && + !controller.value.isBuffering && !ended.isCompleted) { ended.complete(); } }); - await _controller.play(); - await _controller.seekTo(const Duration(seconds: 5)); + await controller.play(); + await controller.seekTo(const Duration(seconds: 5)); await tester.pumpAndSettle(_playDuration); - await _controller.pause(); + await controller.pause(); // TODO(stuartmorgan): Switch to _controller.position once seekTo is // fixed on the native side to wait for completion, so this is testing // the native code rather than the MiniController position cache. - expect(_controller.value.position, greaterThan(Duration.zero)); + expect(controller.value.position, greaterThan(Duration.zero)); await expectLater(started.future, completes); await expectLater(ended.future, completes); diff --git a/packages/video_player/video_player_avfoundation/example/ios/RunnerTests/VideoPlayerTests.m b/packages/video_player/video_player_avfoundation/example/ios/RunnerTests/VideoPlayerTests.m index 813fca2b8e7d..f9f66e04bcb3 100644 --- a/packages/video_player/video_player_avfoundation/example/ios/RunnerTests/VideoPlayerTests.m +++ b/packages/video_player/video_player_avfoundation/example/ios/RunnerTests/VideoPlayerTests.m @@ -11,9 +11,6 @@ @interface FLTVideoPlayer : NSObject @property(readonly, nonatomic) AVPlayer *player; -// This is to fix a bug (https://github.com/flutter/flutter/issues/111457) in iOS 16 with blank -// video for encrypted video streams. An invisible AVPlayerLayer is used to overwrite the -// protection of pixel buffers in those streams. @property(readonly, nonatomic) AVPlayerLayer *playerLayer; @end @@ -65,13 +62,12 @@ @interface VideoPlayerTests : XCTestCase @implementation VideoPlayerTests -- (void)testIOS16BugWithEncryptedVideoStream { - // This is to fix a bug (https://github.com/flutter/flutter/issues/111457) in iOS 16 with blank - // video for encrypted video streams. An invisible AVPlayerLayer is used to overwrite the - // protection of pixel buffers in those streams. - // Note that a better unit test is to validate that `copyPixelBuffer` API returns the pixel - // buffers as expected, which requires setting up the video player properly with a protected video - // stream (.m3u8 file). +- (void)testBlankVideoBugWithEncryptedVideoStreamAndInvertedAspectRatioBugForSomeVideoStream { + // This is to fix 2 bugs: 1. blank video for encrypted video streams on iOS 16 + // (https://github.com/flutter/flutter/issues/111457) and 2. swapped width and height for some + // video streams (not just iOS 16). (https://github.com/flutter/flutter/issues/109116). An + // invisible AVPlayerLayer is used to overwrite the protection of pixel buffers in those streams + // for issue #1, and restore the correct width and height for issue #2. NSObject *registry = (NSObject *)[[UIApplication sharedApplication] delegate]; NSObject *registrar = @@ -95,13 +91,8 @@ - (void)testIOS16BugWithEncryptedVideoStream { FLTVideoPlayer *player = videoPlayerPlugin.playersByTextureId[textureMessage.textureId]; XCTAssertNotNil(player); - if (@available(iOS 16.0, *)) { - XCTAssertNotNil(player.playerLayer, @"AVPlayerLayer should be present for iOS 16."); - XCTAssertNotNil(player.playerLayer.superlayer, - @"AVPlayerLayer should be added on screen for iOS 16."); - } else { - XCTAssertNil(player.playerLayer, @"AVPlayerLayer should not be present before iOS 16."); - } + XCTAssertNotNil(player.playerLayer, @"AVPlayerLayer should be present."); + XCTAssertNotNil(player.playerLayer.superlayer, @"AVPlayerLayer should be added on screen."); } - (void)testSeekToInvokesTextureFrameAvailableOnTextureRegistry { diff --git a/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m b/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m index 645c86d6eade..3b066769621c 100644 --- a/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m +++ b/packages/video_player/video_player_avfoundation/ios/Classes/FLTVideoPlayerPlugin.m @@ -36,7 +36,11 @@ - (void)onDisplayLink:(CADisplayLink *)link { @interface FLTVideoPlayer : NSObject @property(readonly, nonatomic) AVPlayer *player; @property(readonly, nonatomic) AVPlayerItemVideoOutput *videoOutput; -/// An invisible player layer used to access the pixel buffers in protected video streams in iOS 16. +// This is to fix 2 bugs: 1. blank video for encrypted video streams on iOS 16 +// (https://github.com/flutter/flutter/issues/111457) and 2. swapped width and height for some video +// streams (not just iOS 16). (https://github.com/flutter/flutter/issues/109116). +// An invisible AVPlayerLayer is used to overwrite the protection of pixel buffers in those streams +// for issue #1, and restore the correct width and height for issue #2. @property(readonly, nonatomic) AVPlayerLayer *playerLayer; @property(readonly, nonatomic) CADisplayLink *displayLink; @property(nonatomic) FlutterEventChannel *eventChannel; @@ -134,17 +138,13 @@ NS_INLINE CGFloat radiansToDegrees(CGFloat radians) { return degrees; }; -NS_INLINE UIViewController *rootViewController() API_AVAILABLE(ios(16.0)) { - for (UIScene *scene in UIApplication.sharedApplication.connectedScenes) { - if ([scene isKindOfClass:UIWindowScene.class]) { - for (UIWindow *window in ((UIWindowScene *)scene).windows) { - if (window.isKeyWindow) { - return window.rootViewController; - } - } - } - } - return nil; +NS_INLINE UIViewController *rootViewController() { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + // TODO: (hellohuanlin) Provide a non-deprecated codepath. See + // https://github.com/flutter/flutter/issues/104117 + return UIApplication.sharedApplication.keyWindow.rootViewController; +#pragma clang diagnostic pop } - (AVMutableVideoComposition *)getVideoCompositionWithTransform:(CGAffineTransform)transform @@ -242,13 +242,13 @@ - (instancetype)initWithPlayerItem:(AVPlayerItem *)item _player = [AVPlayer playerWithPlayerItem:item]; _player.actionAtItemEnd = AVPlayerActionAtItemEndNone; - // This is to fix a bug (https://github.com/flutter/flutter/issues/111457) in iOS 16 with blank - // video for encrypted video streams. An invisible AVPlayerLayer is used to overwrite the - // protection of pixel buffers in those streams. - if (@available(iOS 16.0, *)) { - _playerLayer = [AVPlayerLayer playerLayerWithPlayer:_player]; - [rootViewController().view.layer addSublayer:_playerLayer]; - } + // This is to fix 2 bugs: 1. blank video for encrypted video streams on iOS 16 + // (https://github.com/flutter/flutter/issues/111457) and 2. swapped width and height for some + // video streams (not just iOS 16). (https://github.com/flutter/flutter/issues/109116). An + // invisible AVPlayerLayer is used to overwrite the protection of pixel buffers in those streams + // for issue #1, and restore the correct width and height for issue #2. + _playerLayer = [AVPlayerLayer playerLayerWithPlayer:_player]; + [rootViewController().view.layer addSublayer:_playerLayer]; [self createVideoOutputAndDisplayLink:frameUpdater]; @@ -481,9 +481,7 @@ - (FlutterError *_Nullable)onListenWithArguments:(id _Nullable)arguments /// so the channel is going to die or is already dead. - (void)disposeSansEventChannel { _disposed = YES; - if (@available(iOS 16.0, *)) { - [_playerLayer removeFromSuperlayer]; - } + [_playerLayer removeFromSuperlayer]; [_displayLink invalidate]; AVPlayerItem *currentItem = self.player.currentItem; [currentItem removeObserver:self forKeyPath:@"status"]; diff --git a/packages/video_player/video_player_avfoundation/pubspec.yaml b/packages/video_player/video_player_avfoundation/pubspec.yaml index bd88ddf94876..6da166791281 100644 --- a/packages/video_player/video_player_avfoundation/pubspec.yaml +++ b/packages/video_player/video_player_avfoundation/pubspec.yaml @@ -2,7 +2,7 @@ name: video_player_avfoundation description: iOS implementation of the video_player plugin. repository: https://github.com/flutter/plugins/tree/main/packages/video_player/video_player_avfoundation issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+video_player%22 -version: 2.3.6 +version: 2.3.7 environment: sdk: ">=2.14.0 <3.0.0" diff --git a/packages/video_player/video_player_web/example/pubspec.yaml b/packages/video_player/video_player_web/example/pubspec.yaml index 9c0a9e188daf..57728f323d55 100644 --- a/packages/video_player/video_player_web/example/pubspec.yaml +++ b/packages/video_player/video_player_web/example/pubspec.yaml @@ -9,6 +9,7 @@ dependencies: flutter: sdk: flutter js: ^0.6.0 + video_player_platform_interface: ">=4.2.0 <6.0.0" video_player_web: path: ../ diff --git a/packages/webview_flutter/webview_flutter/CHANGELOG.md b/packages/webview_flutter/webview_flutter/CHANGELOG.md index 73dd7ced0279..d5559f9ca7f7 100644 --- a/packages/webview_flutter/webview_flutter/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter/CHANGELOG.md @@ -1,5 +1,6 @@ ## NEXT +* Updates code for `no_leading_underscores_for_local_identifiers` lint. * Updates minimum Flutter version to 2.10. * Fixes avoid_redundant_argument_values lint warnings and minor typos. * Ignores unnecessary import warnings in preparation for [upcoming Flutter changes](https://github.com/flutter/flutter/pull/104231). diff --git a/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart b/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart index 8e326fef182f..63f43848508b 100644 --- a/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart +++ b/packages/webview_flutter/webview_flutter/example/integration_test/webview_flutter_test.dart @@ -235,12 +235,12 @@ Future main() async { testWidgets('set custom userAgent', (WidgetTester tester) async { final Completer controllerCompleter1 = Completer(); - final GlobalKey _globalKey = GlobalKey(); + final GlobalKey globalKey = GlobalKey(); await tester.pumpWidget( Directionality( textDirection: TextDirection.ltr, child: WebView( - key: _globalKey, + key: globalKey, initialUrl: 'about:blank', javascriptMode: JavascriptMode.unrestricted, userAgent: 'Custom_User_Agent1', @@ -258,7 +258,7 @@ Future main() async { Directionality( textDirection: TextDirection.ltr, child: WebView( - key: _globalKey, + key: globalKey, initialUrl: 'about:blank', javascriptMode: JavascriptMode.unrestricted, userAgent: 'Custom_User_Agent2', @@ -274,13 +274,13 @@ Future main() async { (WidgetTester tester) async { final Completer controllerCompleter = Completer(); - final GlobalKey _globalKey = GlobalKey(); + final GlobalKey globalKey = GlobalKey(); // Build the webView with no user agent to get the default platform user agent. await tester.pumpWidget( Directionality( textDirection: TextDirection.ltr, child: WebView( - key: _globalKey, + key: globalKey, initialUrl: primaryUrl, javascriptMode: JavascriptMode.unrestricted, onWebViewCreated: (WebViewController controller) { @@ -296,7 +296,7 @@ Future main() async { Directionality( textDirection: TextDirection.ltr, child: WebView( - key: _globalKey, + key: globalKey, initialUrl: 'about:blank', javascriptMode: JavascriptMode.unrestricted, userAgent: 'Custom_User_Agent', @@ -310,7 +310,7 @@ Future main() async { Directionality( textDirection: TextDirection.ltr, child: WebView( - key: _globalKey, + key: globalKey, initialUrl: 'about:blank', javascriptMode: JavascriptMode.unrestricted, ), diff --git a/packages/webview_flutter/webview_flutter_android/CHANGELOG.md b/packages/webview_flutter/webview_flutter_android/CHANGELOG.md index b37ada2225f0..fbb502c7cca8 100644 --- a/packages/webview_flutter/webview_flutter_android/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter_android/CHANGELOG.md @@ -1,3 +1,12 @@ +## 2.10.4 + +* Updates code for `no_leading_underscores_for_local_identifiers` lint. +* Bumps androidx.annotation from 1.4.0 to 1.5.0. + +## 2.10.3 + +* Updates imports for `prefer_relative_imports`. + ## 2.10.2 * Adds a getter to expose the Java InstanceManager. diff --git a/packages/webview_flutter/webview_flutter_android/android/build.gradle b/packages/webview_flutter/webview_flutter_android/android/build.gradle index 0b95a4be66ff..65374fee88bf 100644 --- a/packages/webview_flutter/webview_flutter_android/android/build.gradle +++ b/packages/webview_flutter/webview_flutter_android/android/build.gradle @@ -35,7 +35,7 @@ android { } dependencies { - implementation 'androidx.annotation:annotation:1.4.0' + implementation 'androidx.annotation:annotation:1.5.0' implementation 'androidx.webkit:webkit:1.5.0' testImplementation 'junit:junit:4.13.2' testImplementation 'org.mockito:mockito-inline:4.8.0' diff --git a/packages/webview_flutter/webview_flutter_android/example/integration_test/webview_flutter_test.dart b/packages/webview_flutter/webview_flutter_android/example/integration_test/webview_flutter_test.dart index b7c32f5d77d3..69c1a46d750f 100644 --- a/packages/webview_flutter/webview_flutter_android/example/integration_test/webview_flutter_test.dart +++ b/packages/webview_flutter/webview_flutter_android/example/integration_test/webview_flutter_test.dart @@ -241,12 +241,12 @@ Future main() async { testWidgets('set custom userAgent', (WidgetTester tester) async { final Completer controllerCompleter1 = Completer(); - final GlobalKey _globalKey = GlobalKey(); + final GlobalKey globalKey = GlobalKey(); await tester.pumpWidget( Directionality( textDirection: TextDirection.ltr, child: WebView( - key: _globalKey, + key: globalKey, initialUrl: 'about:blank', javascriptMode: JavascriptMode.unrestricted, userAgent: 'Custom_User_Agent1', @@ -264,7 +264,7 @@ Future main() async { Directionality( textDirection: TextDirection.ltr, child: WebView( - key: _globalKey, + key: globalKey, initialUrl: 'about:blank', javascriptMode: JavascriptMode.unrestricted, userAgent: 'Custom_User_Agent2', @@ -280,13 +280,13 @@ Future main() async { (WidgetTester tester) async { final Completer controllerCompleter = Completer(); - final GlobalKey _globalKey = GlobalKey(); + final GlobalKey globalKey = GlobalKey(); // Build the webView with no user agent to get the default platform user agent. await tester.pumpWidget( Directionality( textDirection: TextDirection.ltr, child: WebView( - key: _globalKey, + key: globalKey, initialUrl: primaryUrl, javascriptMode: JavascriptMode.unrestricted, onWebViewCreated: (WebViewController controller) { @@ -302,7 +302,7 @@ Future main() async { Directionality( textDirection: TextDirection.ltr, child: WebView( - key: _globalKey, + key: globalKey, initialUrl: 'about:blank', javascriptMode: JavascriptMode.unrestricted, userAgent: 'Custom_User_Agent', @@ -316,7 +316,7 @@ Future main() async { Directionality( textDirection: TextDirection.ltr, child: WebView( - key: _globalKey, + key: globalKey, initialUrl: 'about:blank', javascriptMode: JavascriptMode.unrestricted, ), diff --git a/packages/webview_flutter/webview_flutter_android/example/pubspec.yaml b/packages/webview_flutter/webview_flutter_android/example/pubspec.yaml index db72a146c110..de6980a736cc 100644 --- a/packages/webview_flutter/webview_flutter_android/example/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_android/example/pubspec.yaml @@ -8,9 +8,9 @@ environment: dependencies: flutter: sdk: flutter - + flutter_driver: + sdk: flutter path_provider: ^2.0.6 - webview_flutter_android: # When depending on this package from a real application you should use: # webview_flutter: ^x.y.z @@ -18,11 +18,10 @@ dependencies: # The example app is bundled with the plugin so we use a path dependency on # the parent directory to use the current plugin's version. path: ../ + webview_flutter_platform_interface: ^1.8.0 dev_dependencies: espresso: ^0.2.0 - flutter_driver: - sdk: flutter flutter_test: sdk: flutter integration_test: diff --git a/packages/webview_flutter/webview_flutter_android/lib/webview_android_cookie_manager.dart b/packages/webview_flutter/webview_flutter_android/lib/webview_android_cookie_manager.dart index bba75ff4f613..6e3f6f28d8ef 100644 --- a/packages/webview_flutter/webview_flutter_android/lib/webview_android_cookie_manager.dart +++ b/packages/webview_flutter/webview_flutter_android/lib/webview_android_cookie_manager.dart @@ -2,10 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'package:webview_flutter_android/src/android_webview.dart' - as android_webview; import 'package:webview_flutter_platform_interface/webview_flutter_platform_interface.dart'; +import 'src/android_webview.dart' as android_webview; + /// Handles all cookie operations for the current platform. class WebViewAndroidCookieManager extends WebViewCookieManagerPlatform { @override diff --git a/packages/webview_flutter/webview_flutter_android/lib/webview_android_widget.dart b/packages/webview_flutter/webview_flutter_android/lib/webview_android_widget.dart index ff6265dbad00..140d0da7e7f7 100644 --- a/packages/webview_flutter/webview_flutter_android/lib/webview_android_widget.dart +++ b/packages/webview_flutter/webview_flutter_android/lib/webview_android_widget.dart @@ -6,10 +6,10 @@ import 'dart:async'; import 'dart:typed_data'; import 'package:flutter/widgets.dart'; -import 'package:webview_flutter_android/webview_android_cookie_manager.dart'; import 'package:webview_flutter_platform_interface/webview_flutter_platform_interface.dart'; import 'src/android_webview.dart' as android_webview; +import 'webview_android_cookie_manager.dart'; /// Creates a [Widget] with a [android_webview.WebView]. class WebViewAndroidWidget extends StatefulWidget { diff --git a/packages/webview_flutter/webview_flutter_android/pubspec.yaml b/packages/webview_flutter/webview_flutter_android/pubspec.yaml index f5f2e3c34e69..e411b4e1326a 100644 --- a/packages/webview_flutter/webview_flutter_android/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_android/pubspec.yaml @@ -2,7 +2,7 @@ name: webview_flutter_android description: A Flutter plugin that provides a WebView widget on Android. repository: https://github.com/flutter/plugins/tree/main/packages/webview_flutter/webview_flutter_android issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+webview%22 -version: 2.10.2 +version: 2.10.4 environment: sdk: ">=2.14.0 <3.0.0" diff --git a/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md b/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md index 17b86523f29a..b7050e4f4db3 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md @@ -1,3 +1,11 @@ +## 1.9.5 + +* Updates code for `no_leading_underscores_for_local_identifiers` lint. + +## 1.9.4 + +* Updates imports for `prefer_relative_imports`. + ## 1.9.3 * Updates minimum Flutter version to 2.10. diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/method_channel/webview_method_channel.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/method_channel/webview_method_channel.dart index f32881701cfb..0e98ea08fd16 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/method_channel/webview_method_channel.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/method_channel/webview_method_channel.dart @@ -247,30 +247,29 @@ class MethodChannelWebViewPlatform implements WebViewPlatformController { static Map _webSettingsToMap(WebSettings? settings) { final Map map = {}; - void _addIfNonNull(String key, dynamic value) { + void addIfNonNull(String key, dynamic value) { if (value == null) { return; } map[key] = value; } - void _addSettingIfPresent(String key, WebSetting setting) { + void addSettingIfPresent(String key, WebSetting setting) { if (!setting.isPresent) { return; } map[key] = setting.value; } - _addIfNonNull('jsMode', settings!.javascriptMode?.index); - _addIfNonNull('hasNavigationDelegate', settings.hasNavigationDelegate); - _addIfNonNull('hasProgressTracking', settings.hasProgressTracking); - _addIfNonNull('debuggingEnabled', settings.debuggingEnabled); - _addIfNonNull( - 'gestureNavigationEnabled', settings.gestureNavigationEnabled); - _addIfNonNull( + addIfNonNull('jsMode', settings!.javascriptMode?.index); + addIfNonNull('hasNavigationDelegate', settings.hasNavigationDelegate); + addIfNonNull('hasProgressTracking', settings.hasProgressTracking); + addIfNonNull('debuggingEnabled', settings.debuggingEnabled); + addIfNonNull('gestureNavigationEnabled', settings.gestureNavigationEnabled); + addIfNonNull( 'allowsInlineMediaPlayback', settings.allowsInlineMediaPlayback); - _addSettingIfPresent('userAgent', settings.userAgent); - _addIfNonNull('zoomEnabled', settings.zoomEnabled); + addSettingIfPresent('userAgent', settings.userAgent); + addIfNonNull('zoomEnabled', settings.zoomEnabled); return map; } diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_interface/webview_cookie_manager.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_interface/webview_cookie_manager.dart index 1f87e6a26ba6..90dfc2a548b5 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_interface/webview_cookie_manager.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_interface/webview_cookie_manager.dart @@ -3,7 +3,8 @@ // found in the LICENSE file. import 'package:plugin_platform_interface/plugin_platform_interface.dart'; -import 'package:webview_flutter_platform_interface/src/types/webview_cookie.dart'; + +import '../types/webview_cookie.dart'; /// Interface for a platform implementation of a cookie manager. /// diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_interface/webview_platform.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_interface/webview_platform.dart index e35635d73a9e..8d1df6ae1040 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_interface/webview_platform.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_interface/webview_platform.dart @@ -5,8 +5,8 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/widgets.dart'; -import 'package:webview_flutter_platform_interface/src/platform_interface/javascript_channel_registry.dart'; +import '../platform_interface/javascript_channel_registry.dart'; import '../types/types.dart'; import 'webview_platform_callbacks_handler.dart'; import 'webview_platform_controller.dart'; diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/creation_params.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/creation_params.dart index c1763cdae501..7c3edf3cf8b0 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/creation_params.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/creation_params.dart @@ -3,7 +3,8 @@ // found in the LICENSE file. import 'package:flutter/widgets.dart'; -import 'package:webview_flutter_platform_interface/src/types/types.dart'; + +import 'types.dart'; /// Configuration to use when creating a new [WebViewPlatformController]. /// diff --git a/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml b/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml index 5b98154998a8..8f60592b852d 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml @@ -4,7 +4,7 @@ repository: https://github.com/flutter/plugins/tree/main/packages/webview_flutte issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+webview_flutter%22 # NOTE: We strongly prefer non-breaking changes, even at the expense of a # less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes -version: 1.9.3 +version: 1.9.5 environment: sdk: ">=2.12.0 <3.0.0" diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/platform_interface/javascript_channel_registry_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/platform_interface/javascript_channel_registry_test.dart index 30795b01c83f..aec568e92b79 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/platform_interface/javascript_channel_registry_test.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/platform_interface/javascript_channel_registry_test.dart @@ -7,35 +7,35 @@ import 'package:webview_flutter_platform_interface/src/platform_interface/javasc import 'package:webview_flutter_platform_interface/src/types/types.dart'; void main() { - final Map _log = {}; - final Set _channels = { + final Map log = {}; + final Set channels = { JavascriptChannel( name: 'js_channel_1', onMessageReceived: (JavascriptMessage message) => - _log['js_channel_1'] = message.message, + log['js_channel_1'] = message.message, ), JavascriptChannel( name: 'js_channel_2', onMessageReceived: (JavascriptMessage message) => - _log['js_channel_2'] = message.message, + log['js_channel_2'] = message.message, ), JavascriptChannel( name: 'js_channel_3', onMessageReceived: (JavascriptMessage message) => - _log['js_channel_3'] = message.message, + log['js_channel_3'] = message.message, ), }; tearDown(() { - _log.clear(); + log.clear(); }); test('ctor should initialize with channels.', () { final JavascriptChannelRegistry registry = - JavascriptChannelRegistry(_channels); + JavascriptChannelRegistry(channels); expect(registry.channels.length, 3); - for (final JavascriptChannel channel in _channels) { + for (final JavascriptChannel channel in channels) { expect(registry.channels[channel.name], channel); } }); @@ -43,7 +43,7 @@ void main() { test('onJavascriptChannelMessage should forward message on correct channel.', () { final JavascriptChannelRegistry registry = - JavascriptChannelRegistry(_channels); + JavascriptChannelRegistry(channels); registry.onJavascriptChannelMessage( 'js_channel_2', @@ -51,7 +51,7 @@ void main() { ); expect( - _log, + log, containsPair( 'js_channel_2', 'test message on channel 2', @@ -62,7 +62,7 @@ void main() { 'onJavascriptChannelMessage should throw ArgumentError when message arrives on non-existing channel.', () { final JavascriptChannelRegistry registry = - JavascriptChannelRegistry(_channels); + JavascriptChannelRegistry(channels); expect( () => registry.onJavascriptChannelMessage( @@ -79,7 +79,7 @@ void main() { 'updateJavascriptChannelsFromSet should clear all channels when null is supplied.', () { final JavascriptChannelRegistry registry = - JavascriptChannelRegistry(_channels); + JavascriptChannelRegistry(channels); expect(registry.channels.length, 3); @@ -91,7 +91,7 @@ void main() { test('updateJavascriptChannelsFromSet should update registry with new set.', () { final JavascriptChannelRegistry registry = - JavascriptChannelRegistry(_channels); + JavascriptChannelRegistry(channels); expect(registry.channels.length, 3); @@ -99,12 +99,12 @@ void main() { JavascriptChannel( name: 'new_js_channel_1', onMessageReceived: (JavascriptMessage message) => - _log['new_js_channel_1'] = message.message, + log['new_js_channel_1'] = message.message, ), JavascriptChannel( name: 'new_js_channel_2', onMessageReceived: (JavascriptMessage message) => - _log['new_js_channel_2'] = message.message, + log['new_js_channel_2'] = message.message, ), }; diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/src/types/javascript_channel_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/src/types/javascript_channel_test.dart index f481edda1edd..8d7177150b7c 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/test/src/types/javascript_channel_test.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/src/types/javascript_channel_test.dart @@ -6,17 +6,17 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:webview_flutter_platform_interface/src/types/javascript_channel.dart'; void main() { - final List _validChars = + final List validChars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_'.split(''); - final List _commonInvalidChars = + final List commonInvalidChars = r'`~!@#$%^&*()-=+[]{}\|"' ':;/?<>,. '.split(''); - final List _digits = List.generate(10, (int index) => index++); + final List digits = List.generate(10, (int index) => index++); test( 'ctor should create JavascriptChannel when name starts with a valid character followed by a number.', () { - for (final String char in _validChars) { - for (final int digit in _digits) { + for (final String char in validChars) { + for (final int digit in digits) { final JavascriptChannel channel = JavascriptChannel(name: '$char$digit', onMessageReceived: (_) {}); @@ -26,7 +26,7 @@ void main() { }); test('ctor should assert when channel name starts with a number.', () { - for (final int i in _digits) { + for (final int i in digits) { expect( () => JavascriptChannel(name: '$i', onMessageReceived: (_) {}), throwsAssertionError, @@ -35,8 +35,8 @@ void main() { }); test('ctor should assert when channel contains invalid char.', () { - for (final String validChar in _validChars) { - for (final String invalidChar in _commonInvalidChars) { + for (final String validChar in validChars) { + for (final String invalidChar in commonInvalidChars) { expect( () => JavascriptChannel( name: validChar + invalidChar, onMessageReceived: (_) {}), diff --git a/packages/webview_flutter/webview_flutter_web/example/pubspec.yaml b/packages/webview_flutter/webview_flutter_web/example/pubspec.yaml index fbeb44923d83..7ceb586a9316 100644 --- a/packages/webview_flutter/webview_flutter_web/example/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_web/example/pubspec.yaml @@ -10,6 +10,7 @@ dependencies: sdk: flutter flutter_web_plugins: sdk: flutter + webview_flutter_platform_interface: ^1.8.0 webview_flutter_web: # When depending on this package from a real application you should use: # webview_flutter_web: ^x.y.z diff --git a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md index 056d1cb1c26a..c0a2ade72534 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter_wkwebview/CHANGELOG.md @@ -1,3 +1,11 @@ +## NEXT + +* Updates code for `no_leading_underscores_for_local_identifiers` lint. + +## 2.9.5 + +* Updates imports for `prefer_relative_imports`. + ## 2.9.4 * Fixes avoid_redundant_argument_values lint warnings and minor typos. diff --git a/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/webview_flutter_test.dart b/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/webview_flutter_test.dart index e259bc72a67b..047d69f0d0ee 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/webview_flutter_test.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/example/integration_test/webview_flutter_test.dart @@ -253,12 +253,12 @@ Future main() async { testWidgets('set custom userAgent', (WidgetTester tester) async { final Completer controllerCompleter1 = Completer(); - final GlobalKey _globalKey = GlobalKey(); + final GlobalKey globalKey = GlobalKey(); await tester.pumpWidget( Directionality( textDirection: TextDirection.ltr, child: WebView( - key: _globalKey, + key: globalKey, initialUrl: 'about:blank', javascriptMode: JavascriptMode.unrestricted, userAgent: 'Custom_User_Agent1', @@ -276,7 +276,7 @@ Future main() async { Directionality( textDirection: TextDirection.ltr, child: WebView( - key: _globalKey, + key: globalKey, initialUrl: 'about:blank', javascriptMode: JavascriptMode.unrestricted, userAgent: 'Custom_User_Agent2', @@ -292,13 +292,13 @@ Future main() async { (WidgetTester tester) async { final Completer controllerCompleter = Completer(); - final GlobalKey _globalKey = GlobalKey(); + final GlobalKey globalKey = GlobalKey(); // Build the webView with no user agent to get the default platform user agent. await tester.pumpWidget( Directionality( textDirection: TextDirection.ltr, child: WebView( - key: _globalKey, + key: globalKey, initialUrl: primaryUrl, javascriptMode: JavascriptMode.unrestricted, onWebViewCreated: (WebViewController controller) { @@ -314,7 +314,7 @@ Future main() async { Directionality( textDirection: TextDirection.ltr, child: WebView( - key: _globalKey, + key: globalKey, initialUrl: 'about:blank', javascriptMode: JavascriptMode.unrestricted, userAgent: 'Custom_User_Agent', @@ -328,7 +328,7 @@ Future main() async { Directionality( textDirection: TextDirection.ltr, child: WebView( - key: _globalKey, + key: globalKey, initialUrl: 'about:blank', javascriptMode: JavascriptMode.unrestricted, ), diff --git a/packages/webview_flutter/webview_flutter_wkwebview/example/pubspec.yaml b/packages/webview_flutter/webview_flutter_wkwebview/example/pubspec.yaml index 1daa96854f90..495f5aeb87e6 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/example/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_wkwebview/example/pubspec.yaml @@ -8,9 +8,8 @@ environment: dependencies: flutter: sdk: flutter - path_provider: ^2.0.6 - + webview_flutter_platform_interface: ^1.8.0 webview_flutter_wkwebview: # When depending on this package from a real application you should use: # webview_flutter: ^x.y.z diff --git a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/foundation/foundation.dart b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/foundation/foundation.dart index 2059aa544207..9f121e66d5cb 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/foundation/foundation.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/foundation/foundation.dart @@ -8,9 +8,9 @@ import 'dart:typed_data'; import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; -import 'package:webview_flutter_wkwebview/src/common/weak_reference_utils.dart'; import '../common/instance_manager.dart'; +import '../common/weak_reference_utils.dart'; import 'foundation_api_impls.dart'; /// The values that can be returned in a change map. diff --git a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/ui_kit/ui_kit_api_impls.dart b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/ui_kit/ui_kit_api_impls.dart index b6e4cadec879..ae12a11820d8 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/ui_kit/ui_kit_api_impls.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/ui_kit/ui_kit_api_impls.dart @@ -10,10 +10,9 @@ import 'dart:math'; import 'package:flutter/painting.dart' show Color; import 'package:flutter/services.dart'; -import 'package:webview_flutter_wkwebview/src/foundation/foundation.dart'; - import '../common/instance_manager.dart'; import '../common/web_kit.pigeon.dart'; +import '../foundation/foundation.dart'; import '../web_kit/web_kit.dart'; import 'ui_kit.dart'; diff --git a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webview_cupertino.dart b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webview_cupertino.dart index f046ea4378b8..616f00c59fa3 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webview_cupertino.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/webview_cupertino.dart @@ -9,9 +9,9 @@ import 'package:flutter/gestures.dart'; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; import 'package:webview_flutter_platform_interface/webview_flutter_platform_interface.dart'; -import 'package:webview_flutter_wkwebview/src/web_kit_webview_widget.dart'; import 'foundation/foundation.dart'; +import 'web_kit_webview_widget.dart'; /// Builds an iOS webview. /// diff --git a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/wkwebview_cookie_manager.dart b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/wkwebview_cookie_manager.dart index 59c9f580db74..cdbf2620f968 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/lib/src/wkwebview_cookie_manager.dart +++ b/packages/webview_flutter/webview_flutter_wkwebview/lib/src/wkwebview_cookie_manager.dart @@ -3,8 +3,9 @@ // found in the LICENSE file. import 'package:webview_flutter_platform_interface/webview_flutter_platform_interface.dart'; -import 'package:webview_flutter_wkwebview/src/foundation/foundation.dart'; -import 'package:webview_flutter_wkwebview/src/web_kit/web_kit.dart'; + +import 'foundation/foundation.dart'; +import 'web_kit/web_kit.dart'; /// Handles all cookie operations for the WebView platform. class WKWebViewCookieManager extends WebViewCookieManagerPlatform { diff --git a/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml b/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml index 40b7bf89601d..3de385fec06c 100644 --- a/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_wkwebview/pubspec.yaml @@ -2,7 +2,7 @@ name: webview_flutter_wkwebview description: A Flutter plugin that provides a WebView widget based on Apple's WKWebView control. repository: https://github.com/flutter/plugins/tree/main/packages/webview_flutter/webview_flutter_wkwebview issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+webview%22 -version: 2.9.4 +version: 2.9.5 environment: sdk: ">=2.17.0 <3.0.0" diff --git a/script/tool/CHANGELOG.md b/script/tool/CHANGELOG.md index 2417d0fa833c..f62509040a3d 100644 --- a/script/tool/CHANGELOG.md +++ b/script/tool/CHANGELOG.md @@ -1,3 +1,19 @@ +## 12.0 + +* Changes the behavior of `--packages-for-branch` on main/master to run for + packages changed in the last commit, rather than running for all packages. + This allows CI to test the same filtered set of packages in post-submit as are + tested in presubmit. +* Adds a `fix` command to run `dart fix --apply` in target packages. + +## 0.11 + +* Renames `publish-plugin` to `publish`. +* Renames arguments to `list`: + * `--package` now lists top-level packages (previously `--plugin`). + * `--package-or-subpackage` now lists top-level packages (previously + `--package`). + ## 0.10.0+1 * Recognizes `run_test.sh` as a developer-only file in `version-check`. diff --git a/script/tool/README.md b/script/tool/README.md index 0e44bf16c263..9f0ac84145f2 100644 --- a/script/tool/README.md +++ b/script/tool/README.md @@ -54,7 +54,7 @@ dart pub global run flutter_plugin_tools ## Commands Run with `--help` for a full list of commands and arguments, but the -following shows a number of common commands being run for a specific plugin. +following shows a number of common commands being run for a specific package. All examples assume running from source; see above for running the published version instead. @@ -71,29 +71,29 @@ command is targetting. An package name can be any of: ```sh cd -dart run ./script/tool/bin/flutter_plugin_tools.dart format --packages plugin_name +dart run ./script/tool/bin/flutter_plugin_tools.dart format --packages package_name ``` ### Run the Dart Static Analyzer ```sh cd -dart run ./script/tool/bin/flutter_plugin_tools.dart analyze --packages plugin_name +dart run ./script/tool/bin/flutter_plugin_tools.dart analyze --packages package_name ``` ### Run Dart Unit Tests ```sh cd -dart run ./script/tool/bin/flutter_plugin_tools.dart test --packages plugin_name +dart run ./script/tool/bin/flutter_plugin_tools.dart test --packages package_name ``` ### Run Dart Integration Tests ```sh cd -dart run ./script/tool/bin/flutter_plugin_tools.dart build-examples --apk --packages plugin_name -dart run ./script/tool/bin/flutter_plugin_tools.dart drive-examples --android --packages plugin_name +dart run ./script/tool/bin/flutter_plugin_tools.dart build-examples --apk --packages package_name +dart run ./script/tool/bin/flutter_plugin_tools.dart drive-examples --android --packages package_name ``` Replace `--apk`/`--android` with the platform you want to test against @@ -110,11 +110,11 @@ Examples: ```sh cd # Run just unit tests for iOS and Android: -dart run ./script/tool/bin/flutter_plugin_tools.dart native-test --ios --android --no-integration --packages plugin_name +dart run ./script/tool/bin/flutter_plugin_tools.dart native-test --ios --android --no-integration --packages package_name # Run all tests for macOS: -dart run ./script/tool/bin/flutter_plugin_tools.dart native-test --macos --packages plugin_name +dart run ./script/tool/bin/flutter_plugin_tools.dart native-test --macos --packages package_name # Run all tests for Windows: -dart run ./script/tool/bin/flutter_plugin_tools.dart native-test --windows --packages plugin_name +dart run ./script/tool/bin/flutter_plugin_tools.dart native-test --windows --packages package_name ``` ### Update README.md from Example Sources @@ -125,7 +125,7 @@ before running this command. ```sh cd -dart run ./script/tool/bin/flutter_plugin_tools.dart update-excerpts --packages plugin_name +dart run ./script/tool/bin/flutter_plugin_tools.dart update-excerpts --packages package_name ``` ### Update CHANGELOG and Version @@ -165,18 +165,18 @@ on the Flutter Wiki first. ```sh cd git checkout -dart run ./script/tool/bin/flutter_plugin_tools.dart publish-plugin --packages +dart run ./script/tool/bin/flutter_plugin_tools.dart publish --packages ``` By default the tool tries to push tags to the `upstream` remote, but some additional settings can be configured. Run `dart run ./script/tool/bin/flutter_plugin_tools.dart -publish-plugin --help` for more usage information. +publish --help` for more usage information. The tool wraps `pub publish` for pushing the package to pub, and then will automatically use git to try to create and push tags. It has some additional safety checking around `pub publish` too. By default `pub publish` publishes _everything_, including untracked or uncommitted files in version control. -`publish-plugin` will first check the status of the local +`publish` will first check the status of the local directory and refuse to publish if there are any mismatched files with version control present. diff --git a/script/tool/lib/src/common/cmake.dart b/script/tool/lib/src/common/cmake.dart index 04ad880292b9..3f5d8452bd44 100644 --- a/script/tool/lib/src/common/cmake.dart +++ b/script/tool/lib/src/common/cmake.dart @@ -3,9 +3,9 @@ // found in the LICENSE file. import 'package:file/file.dart'; -import 'package:flutter_plugin_tools/src/common/core.dart'; import 'package:platform/platform.dart'; +import 'core.dart'; import 'process_runner.dart'; const String _cacheCommandKey = 'CMAKE_COMMAND:INTERNAL'; diff --git a/script/tool/lib/src/common/git_version_finder.dart b/script/tool/lib/src/common/git_version_finder.dart index eb8fba6b76b8..b135424827a6 100644 --- a/script/tool/lib/src/common/git_version_finder.dart +++ b/script/tool/lib/src/common/git_version_finder.dart @@ -103,7 +103,7 @@ class GitVersionFinder { ['merge-base', '--fork-point', 'FETCH_HEAD', 'HEAD'], throwOnError: false); final String stdout = (baseShaFromMergeBase.stdout as String? ?? '').trim(); - final String stderr = (baseShaFromMergeBase.stdout as String? ?? '').trim(); + final String stderr = (baseShaFromMergeBase.stderr as String? ?? '').trim(); if (stderr.isNotEmpty || stdout.isEmpty) { baseShaFromMergeBase = await baseGitDir .runCommand(['merge-base', 'FETCH_HEAD', 'HEAD']); diff --git a/script/tool/lib/src/common/plugin_command.dart b/script/tool/lib/src/common/package_command.dart similarity index 86% rename from script/tool/lib/src/common/plugin_command.dart rename to script/tool/lib/src/common/package_command.dart index 843768fd4c61..0e83d03e9846 100644 --- a/script/tool/lib/src/common/plugin_command.dart +++ b/script/tool/lib/src/common/package_command.dart @@ -34,9 +34,9 @@ class PackageEnumerationEntry { /// Interface definition for all commands in this tool. // TODO(stuartmorgan): Move most of this logic to PackageLoopingCommand. -abstract class PluginCommand extends Command { +abstract class PackageCommand extends Command { /// Creates a command to operate on [packagesDir] with the given environment. - PluginCommand( + PackageCommand( this.packagesDir, { this.processRunner = const ProcessRunner(), this.platform = const LocalPlatform(), @@ -47,7 +47,7 @@ abstract class PluginCommand extends Command { help: 'Specifies which packages the command should run on (before sharding).\n', valueHelp: 'package1,package2,...', - aliases: [_pluginsArg], + aliases: [_pluginsLegacyAliasArg], ); argParser.addOption( _shardIndexArg, @@ -58,7 +58,7 @@ abstract class PluginCommand extends Command { ); argParser.addOption( _shardCountArg, - help: 'Specifies the number of shards into which plugins are divided.', + help: 'Specifies the number of shards into which packages are divided.', valueHelp: 'n', defaultsTo: '1', ); @@ -71,7 +71,7 @@ abstract class PluginCommand extends Command { defaultsTo: [], ); argParser.addFlag(_runOnChangedPackagesArg, - help: 'Run the command on changed packages/plugins.\n' + help: 'Run the command on changed packages.\n' 'If no packages have changed, or if there have been changes that may\n' 'affect all packages, the command runs on all packages.\n' 'Packages excluded with $_excludeArg are excluded even if changed.\n' @@ -84,9 +84,8 @@ abstract class PluginCommand extends Command { 'Cannot be combined with $_packagesArg.\n', hide: true); argParser.addFlag(_packagesForBranchArg, - help: - 'This runs on all packages (equivalent to no package selection flag)\n' - 'on main (or master), and behaves like --run-on-changed-packages on ' + help: 'This runs on all packages changed in the last commit on main ' + '(or master), and behaves like --run-on-changed-packages on ' 'any other branch.\n\n' 'Cannot be combined with $_packagesArg.\n\n' 'This is intended for use in CI.\n', @@ -106,13 +105,13 @@ abstract class PluginCommand extends Command { static const String _logTimingArg = 'log-timing'; static const String _packagesArg = 'packages'; static const String _packagesForBranchArg = 'packages-for-branch'; - static const String _pluginsArg = 'plugins'; + static const String _pluginsLegacyAliasArg = 'plugins'; static const String _runOnChangedPackagesArg = 'run-on-changed-packages'; static const String _runOnDirtyPackagesArg = 'run-on-dirty-packages'; static const String _shardCountArg = 'shardCount'; static const String _shardIndexArg = 'shardIndex'; - /// The directory containing the plugin packages. + /// The directory containing the packages. final Directory packagesDir; /// The process runner. @@ -221,7 +220,7 @@ abstract class PluginCommand extends Command { _shardCount = shardCount; } - /// Returns the set of plugins to exclude based on the `--exclude` argument. + /// Returns the set of packages to exclude based on the `--exclude` argument. Set getExcludedPackageNames() { final Set excludedPackages = _excludedPackages ?? getStringListArg(_excludeArg).expand((String item) { @@ -250,22 +249,22 @@ abstract class PluginCommand extends Command { Stream getTargetPackages( {bool filterExcluded = true}) async* { // To avoid assuming consistency of `Directory.list` across command - // invocations, we collect and sort the plugin folders before sharding. + // invocations, we collect and sort the package folders before sharding. // This is considered an implementation detail which is why the API still // uses streams. - final List allPlugins = + final List allPackages = await _getAllPackages().toList(); - allPlugins.sort((PackageEnumerationEntry p1, PackageEnumerationEntry p2) => + allPackages.sort((PackageEnumerationEntry p1, PackageEnumerationEntry p2) => p1.package.path.compareTo(p2.package.path)); - final int shardSize = allPlugins.length ~/ shardCount + - (allPlugins.length % shardCount == 0 ? 0 : 1); - final int start = min(shardIndex * shardSize, allPlugins.length); - final int end = min(start + shardSize, allPlugins.length); - - for (final PackageEnumerationEntry plugin - in allPlugins.sublist(start, end)) { - if (!(filterExcluded && plugin.excluded)) { - yield plugin; + final int shardSize = allPackages.length ~/ shardCount + + (allPackages.length % shardCount == 0 ? 0 : 1); + final int start = min(shardIndex * shardSize, allPackages.length); + final int end = min(start + shardSize, allPackages.length); + + for (final PackageEnumerationEntry package + in allPackages.sublist(start, end)) { + if (!(filterExcluded && package.excluded)) { + yield package; } } } @@ -311,9 +310,9 @@ abstract class PluginCommand extends Command { Set packages = Set.from(getStringListArg(_packagesArg)); - final bool runOnChangedPackages; + final GitVersionFinder? changedFileFinder; if (getBoolArg(_runOnChangedPackagesArg)) { - runOnChangedPackages = true; + changedFileFinder = await retrieveVersionFinder(); } else if (getBoolArg(_packagesForBranchArg)) { final String? branch = await _getBranch(); if (branch == null) { @@ -321,25 +320,32 @@ abstract class PluginCommand extends Command { 'only be used in a git repository.'); throw ToolExit(exitInvalidArguments); } else { - runOnChangedPackages = branch != 'master' && branch != 'main'; - // Log the mode for auditing what was intended to run. - print('--$_packagesForBranchArg: running on ' - '${runOnChangedPackages ? 'changed' : 'all'} packages'); + // Configure the change finder the correct mode for the branch. + final bool lastCommitOnly = branch == 'main' || branch == 'master'; + if (lastCommitOnly) { + // Log the mode to make it easier to audit logs to see that the + // intended diff was used. + print('--$_packagesForBranchArg: running on default branch; ' + 'using parent commit as the diff base.'); + changedFileFinder = GitVersionFinder(await gitDir, 'HEAD~'); + } else { + changedFileFinder = await retrieveVersionFinder(); + } } } else { - runOnChangedPackages = false; + changedFileFinder = null; } - final Set excludedPluginNames = getExcludedPackageNames(); - - if (runOnChangedPackages) { - final GitVersionFinder gitVersionFinder = await retrieveVersionFinder(); - final String baseSha = await gitVersionFinder.getBaseSha(); - print( - 'Running for all packages that have changed relative to "$baseSha"\n'); + if (changedFileFinder != null) { + final String baseSha = await changedFileFinder.getBaseSha(); final List changedFiles = - await gitVersionFinder.getChangedFiles(); - if (!_changesRequireFullTest(changedFiles)) { + await changedFileFinder.getChangedFiles(); + if (_changesRequireFullTest(changedFiles)) { + print('Running for all packages, since a file has changed that could ' + 'affect the entire repository.'); + } else { + print( + 'Running for all packages that have diffs relative to "$baseSha"\n'); packages = _getChangedPackageNames(changedFiles); } } else if (getBoolArg(_runOnDirtyPackagesArg)) { @@ -362,21 +368,23 @@ abstract class PluginCommand extends Command { .childDirectory('third_party') .childDirectory('packages'); + final Set excludedPackageNames = getExcludedPackageNames(); for (final Directory dir in [ packagesDir, if (thirdPartyPackagesDirectory.existsSync()) thirdPartyPackagesDirectory, ]) { await for (final FileSystemEntity entity in dir.list(followLinks: false)) { - // A top-level Dart package is a plugin package. + // A top-level Dart package is a standard package. if (isPackage(entity)) { if (packages.isEmpty || packages.contains(p.basename(entity.path))) { yield PackageEnumerationEntry( RepositoryPackage(entity as Directory), - excluded: excludedPluginNames.contains(entity.basename)); + excluded: excludedPackageNames.contains(entity.basename)); } } else if (entity is Directory) { - // Look for Dart packages under this top-level directory. + // Look for Dart packages under this top-level directory; this is the + // standard structure for federated plugins. await for (final FileSystemEntity subdir in entity.list(followLinks: false)) { if (isPackage(subdir)) { @@ -394,7 +402,7 @@ abstract class PluginCommand extends Command { packages.intersection(possibleMatches).isNotEmpty) { yield PackageEnumerationEntry( RepositoryPackage(subdir as Directory), - excluded: excludedPluginNames + excluded: excludedPackageNames .intersection(possibleMatches) .isNotEmpty); } @@ -415,11 +423,12 @@ abstract class PluginCommand extends Command { /// stream. Stream getTargetPackagesAndSubpackages( {bool filterExcluded = true}) async* { - await for (final PackageEnumerationEntry plugin + await for (final PackageEnumerationEntry package in getTargetPackages(filterExcluded: filterExcluded)) { - yield plugin; - yield* getSubpackages(plugin.package).map((RepositoryPackage package) => - PackageEnumerationEntry(package, excluded: plugin.excluded)); + yield package; + yield* getSubpackages(package.package).map( + (RepositoryPackage subPackage) => + PackageEnumerationEntry(subPackage, excluded: package.excluded)); } } @@ -524,7 +533,7 @@ abstract class PluginCommand extends Command { } // Returns true if one or more files changed that have the potential to affect - // any plugin (e.g., CI script changes). + // any packages (e.g., CI script changes). bool _changesRequireFullTest(List changedFiles) { const List specialFiles = [ '.ci.yaml', // LUCI config. diff --git a/script/tool/lib/src/common/package_looping_command.dart b/script/tool/lib/src/common/package_looping_command.dart index 9e696e956192..d8b1cf001d13 100644 --- a/script/tool/lib/src/common/package_looping_command.dart +++ b/script/tool/lib/src/common/package_looping_command.dart @@ -12,7 +12,7 @@ import 'package:platform/platform.dart'; import 'package:pub_semver/pub_semver.dart'; import 'core.dart'; -import 'plugin_command.dart'; +import 'package_command.dart'; import 'process_runner.dart'; import 'repository_package.dart'; @@ -82,7 +82,7 @@ class PackageResult { /// An abstract base class for a command that iterates over a set of packages /// controlled by a standard set of flags, running some actions on each package, /// and collecting and reporting the success/failure of those actions. -abstract class PackageLoopingCommand extends PluginCommand { +abstract class PackageLoopingCommand extends PackageCommand { /// Creates a command to operate on [packagesDir] with the given environment. PackageLoopingCommand( Directory packagesDir, { @@ -428,9 +428,9 @@ abstract class PackageLoopingCommand extends PluginCommand { .length; // Split the warnings into those from packages that ran, and those that // were skipped. - final Set _skippedPackagesWithWarnings = + final Set skippedPackagesWithWarnings = _packagesWithWarnings.intersection(skippedPackages); - final int skippedWarningCount = _skippedPackagesWithWarnings.length; + final int skippedWarningCount = skippedPackagesWithWarnings.length; final int runWarningCount = _packagesWithWarnings.length - skippedWarningCount; diff --git a/script/tool/lib/src/common/package_state_utils.dart b/script/tool/lib/src/common/package_state_utils.dart index c9465876f290..a0c82400e1db 100644 --- a/script/tool/lib/src/common/package_state_utils.dart +++ b/script/tool/lib/src/common/package_state_utils.dart @@ -3,10 +3,10 @@ // found in the LICENSE file. import 'package:file/file.dart'; -import 'package:flutter_plugin_tools/src/common/git_version_finder.dart'; import 'package:meta/meta.dart'; import 'package:path/path.dart' as p; +import 'git_version_finder.dart'; import 'repository_package.dart'; /// The state of a package on disk relative to git state. @@ -161,7 +161,7 @@ bool _isUnpublishedExampleChange( return exampleComponents.first.toLowerCase() != 'readme.md'; } -// True if the change is only relevant to people working on the plugin. +// True if the change is only relevant to people working on the package. Future _isDevChange(List pathComponents, {GitVersionFinder? git, String? repoPath}) async { return _isTestChange(pathComponents) || diff --git a/script/tool/lib/src/common/plugin_utils.dart b/script/tool/lib/src/common/plugin_utils.dart index f33d3d73bb75..94677fe7e5a3 100644 --- a/script/tool/lib/src/common/plugin_utils.dart +++ b/script/tool/lib/src/common/plugin_utils.dart @@ -2,10 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'package:flutter_plugin_tools/src/common/repository_package.dart'; import 'package:yaml/yaml.dart'; import 'core.dart'; +import 'repository_package.dart'; /// Possible plugin support options for a platform. enum PlatformSupport { diff --git a/script/tool/lib/src/create_all_plugins_app_command.dart b/script/tool/lib/src/create_all_plugins_app_command.dart index 7bf007ac72a5..a23dc83d98f3 100644 --- a/script/tool/lib/src/create_all_plugins_app_command.dart +++ b/script/tool/lib/src/create_all_plugins_app_command.dart @@ -10,13 +10,13 @@ import 'package:pub_semver/pub_semver.dart'; import 'package:pubspec_parse/pubspec_parse.dart'; import 'common/core.dart'; -import 'common/plugin_command.dart'; +import 'common/package_command.dart'; import 'common/repository_package.dart'; const String _outputDirectoryFlag = 'output-dir'; /// A command to create an application that builds all in a single application. -class CreateAllPluginsAppCommand extends PluginCommand { +class CreateAllPluginsAppCommand extends PackageCommand { /// Creates an instance of the builder command. CreateAllPluginsAppCommand( Directory packagesDir, { diff --git a/script/tool/lib/src/drive_examples_command.dart b/script/tool/lib/src/drive_examples_command.dart index 45e20c0f13cf..e8fb11b5f289 100644 --- a/script/tool/lib/src/drive_examples_command.dart +++ b/script/tool/lib/src/drive_examples_command.dart @@ -49,7 +49,7 @@ class DriveExamplesCommand extends PackageLoopingCommand { final String name = 'drive-examples'; @override - final String description = 'Runs driver tests for plugin example apps.\n\n' + final String description = 'Runs driver tests for package example apps.\n\n' 'For each *_test.dart in test_driver/ it drives an application with ' 'either the corresponding test in test_driver (for example, ' 'test_driver/app_test.dart would match test_driver/app.dart), or the ' diff --git a/script/tool/lib/src/federation_safety_check_command.dart b/script/tool/lib/src/federation_safety_check_command.dart index 383637a9e896..93a832eb0e29 100644 --- a/script/tool/lib/src/federation_safety_check_command.dart +++ b/script/tool/lib/src/federation_safety_check_command.dart @@ -3,7 +3,6 @@ // found in the LICENSE file. import 'package:file/file.dart'; -import 'package:flutter_plugin_tools/src/common/plugin_utils.dart'; import 'package:git/git.dart'; import 'package:path/path.dart' as p; import 'package:platform/platform.dart'; @@ -13,6 +12,7 @@ import 'common/core.dart'; import 'common/file_utils.dart'; import 'common/git_version_finder.dart'; import 'common/package_looping_command.dart'; +import 'common/plugin_utils.dart'; import 'common/process_runner.dart'; import 'common/repository_package.dart'; diff --git a/script/tool/lib/src/fix_command.dart b/script/tool/lib/src/fix_command.dart new file mode 100644 index 000000000000..2819609eabbd --- /dev/null +++ b/script/tool/lib/src/fix_command.dart @@ -0,0 +1,51 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:async'; + +import 'package:file/file.dart'; +import 'package:platform/platform.dart'; + +import 'common/core.dart'; +import 'common/package_looping_command.dart'; +import 'common/process_runner.dart'; +import 'common/repository_package.dart'; + +/// A command to run Dart's "fix" command on packages. +class FixCommand extends PackageLoopingCommand { + /// Creates a fix command instance. + FixCommand( + Directory packagesDir, { + ProcessRunner processRunner = const ProcessRunner(), + Platform platform = const LocalPlatform(), + }) : super(packagesDir, processRunner: processRunner, platform: platform); + + @override + final String name = 'fix'; + + @override + final String description = 'Fixes packages using dart fix.\n\n' + 'This command requires "dart" and "flutter" to be in your path, and ' + 'assumes that dependencies have already been fetched (e.g., by running ' + 'the analyze command first).'; + + @override + final bool hasLongOutput = false; + + @override + PackageLoopingType get packageLoopingType => + PackageLoopingType.includeAllSubpackages; + + @override + Future runForPackage(RepositoryPackage package) async { + final int exitCode = await processRunner.runAndStream( + 'dart', ['fix', '--apply'], + workingDir: package.directory); + if (exitCode != 0) { + printError('Unable to automatically fix package.'); + return PackageResult.fail(); + } + return PackageResult.success(); + } +} diff --git a/script/tool/lib/src/format_command.dart b/script/tool/lib/src/format_command.dart index f640cbaa5f6c..cc6936c566e1 100644 --- a/script/tool/lib/src/format_command.dart +++ b/script/tool/lib/src/format_command.dart @@ -11,7 +11,7 @@ import 'package:meta/meta.dart'; import 'package:platform/platform.dart'; import 'common/core.dart'; -import 'common/plugin_command.dart'; +import 'common/package_command.dart'; import 'common/process_runner.dart'; /// In theory this should be 8191, but in practice that was still resulting in @@ -37,7 +37,7 @@ final Uri _googleFormatterUrl = Uri.https('github.com', '/google/google-java-format/releases/download/google-java-format-1.3/google-java-format-1.3-all-deps.jar'); /// A command to format all package code. -class FormatCommand extends PluginCommand { +class FormatCommand extends PackageCommand { /// Creates an instance of the format command. FormatCommand( Directory packagesDir, { diff --git a/script/tool/lib/src/license_check_command.dart b/script/tool/lib/src/license_check_command.dart index 5e74d846c13f..0517bcf43298 100644 --- a/script/tool/lib/src/license_check_command.dart +++ b/script/tool/lib/src/license_check_command.dart @@ -8,7 +8,7 @@ import 'package:path/path.dart' as p; import 'package:platform/platform.dart'; import 'common/core.dart'; -import 'common/plugin_command.dart'; +import 'common/package_command.dart'; const Set _codeFileExtensions = { '.c', @@ -105,7 +105,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. '''; /// Validates that code files have copyright and license blocks. -class LicenseCheckCommand extends PluginCommand { +class LicenseCheckCommand extends PackageCommand { /// Creates a new license check command for [packagesDir]. LicenseCheckCommand(Directory packagesDir, {Platform platform = const LocalPlatform(), GitDir? gitDir}) diff --git a/script/tool/lib/src/lint_android_command.dart b/script/tool/lib/src/lint_android_command.dart index 607674c80d38..eb78ce891685 100644 --- a/script/tool/lib/src/lint_android_command.dart +++ b/script/tool/lib/src/lint_android_command.dart @@ -3,12 +3,12 @@ // found in the LICENSE file. import 'package:file/file.dart'; -import 'package:flutter_plugin_tools/src/common/plugin_utils.dart'; import 'package:platform/platform.dart'; import 'common/core.dart'; import 'common/gradle.dart'; import 'common/package_looping_command.dart'; +import 'common/plugin_utils.dart'; import 'common/process_runner.dart'; import 'common/repository_package.dart'; diff --git a/script/tool/lib/src/list_command.dart b/script/tool/lib/src/list_command.dart index e45c09bfd2ef..b47657e47eff 100644 --- a/script/tool/lib/src/list_command.dart +++ b/script/tool/lib/src/list_command.dart @@ -5,11 +5,11 @@ import 'package:file/file.dart'; import 'package:platform/platform.dart'; -import 'common/plugin_command.dart'; +import 'common/package_command.dart'; import 'common/repository_package.dart'; /// A command to list different types of repository content. -class ListCommand extends PluginCommand { +class ListCommand extends PackageCommand { /// Creates an instance of the list command, whose behavior depends on the /// 'type' argument it provides. ListCommand( @@ -18,14 +18,14 @@ class ListCommand extends PluginCommand { }) : super(packagesDir, platform: platform) { argParser.addOption( _type, - defaultsTo: _plugin, - allowed: [_plugin, _example, _package, _file], + defaultsTo: _package, + allowed: [_package, _example, _allPackage, _file], help: 'What type of file system content to list.', ); } static const String _type = 'type'; - static const String _plugin = 'plugin'; + static const String _allPackage = 'package-or-subpackage'; static const String _example = 'example'; static const String _package = 'package'; static const String _file = 'file'; @@ -39,7 +39,7 @@ class ListCommand extends PluginCommand { @override Future run() async { switch (getStringArg(_type)) { - case _plugin: + case _package: await for (final PackageEnumerationEntry entry in getTargetPackages()) { print(entry.package.path); } @@ -52,7 +52,7 @@ class ListCommand extends PluginCommand { print(package.path); } break; - case _package: + case _allPackage: await for (final PackageEnumerationEntry entry in getTargetPackagesAndSubpackages()) { print(entry.package.path); diff --git a/script/tool/lib/src/main.dart b/script/tool/lib/src/main.dart index ea1ec067c82f..414ca7f303c0 100644 --- a/script/tool/lib/src/main.dart +++ b/script/tool/lib/src/main.dart @@ -7,16 +7,17 @@ import 'dart:io' as io; import 'package:args/command_runner.dart'; import 'package:file/file.dart'; import 'package:file/local.dart'; -import 'package:flutter_plugin_tools/src/dependabot_check_command.dart'; import 'analyze_command.dart'; import 'build_examples_command.dart'; import 'common/core.dart'; import 'create_all_plugins_app_command.dart'; import 'custom_test_command.dart'; +import 'dependabot_check_command.dart'; import 'drive_examples_command.dart'; import 'federation_safety_check_command.dart'; import 'firebase_test_lab_command.dart'; +import 'fix_command.dart'; import 'format_command.dart'; import 'license_check_command.dart'; import 'lint_android_command.dart'; @@ -25,7 +26,7 @@ import 'list_command.dart'; import 'make_deps_path_based_command.dart'; import 'native_test_command.dart'; import 'publish_check_command.dart'; -import 'publish_plugin_command.dart'; +import 'publish_command.dart'; import 'pubspec_check_command.dart'; import 'readme_check_command.dart'; import 'remove_dev_dependencies.dart'; @@ -61,6 +62,7 @@ void main(List args) { ..addCommand(DriveExamplesCommand(packagesDir)) ..addCommand(FederationSafetyCheckCommand(packagesDir)) ..addCommand(FirebaseTestLabCommand(packagesDir)) + ..addCommand(FixCommand(packagesDir)) ..addCommand(FormatCommand(packagesDir)) ..addCommand(LicenseCheckCommand(packagesDir)) ..addCommand(LintAndroidCommand(packagesDir)) @@ -69,7 +71,7 @@ void main(List args) { ..addCommand(NativeTestCommand(packagesDir)) ..addCommand(MakeDepsPathBasedCommand(packagesDir)) ..addCommand(PublishCheckCommand(packagesDir)) - ..addCommand(PublishPluginCommand(packagesDir)) + ..addCommand(PublishCommand(packagesDir)) ..addCommand(PubspecCheckCommand(packagesDir)) ..addCommand(ReadmeCheckCommand(packagesDir)) ..addCommand(RemoveDevDependenciesCommand(packagesDir)) diff --git a/script/tool/lib/src/make_deps_path_based_command.dart b/script/tool/lib/src/make_deps_path_based_command.dart index 805dd68a0afe..10abcd44ae6e 100644 --- a/script/tool/lib/src/make_deps_path_based_command.dart +++ b/script/tool/lib/src/make_deps_path_based_command.dart @@ -9,7 +9,7 @@ import 'package:pub_semver/pub_semver.dart'; import 'common/core.dart'; import 'common/git_version_finder.dart'; -import 'common/plugin_command.dart'; +import 'common/package_command.dart'; import 'common/repository_package.dart'; const int _exitPackageNotFound = 3; @@ -24,7 +24,7 @@ enum _RewriteOutcome { changed, noChangesNeeded, alreadyChanged } /// where a non-breaking change to a platform interface package of a federated /// plugin would cause post-publish analyzer failures in another package of that /// plugin. -class MakeDepsPathBasedCommand extends PluginCommand { +class MakeDepsPathBasedCommand extends PackageCommand { /// Creates an instance of the command to convert selected dependencies to /// path-based. MakeDepsPathBasedCommand( @@ -150,7 +150,7 @@ class MakeDepsPathBasedCommand extends PluginCommand { return _RewriteOutcome.alreadyChanged; } printError( - 'Plugins with dependency overrides are not currently supported.'); + 'Packages with dependency overrides are not currently supported.'); throw ToolExit(_exitCannotUpdatePubspec); } @@ -158,10 +158,12 @@ class MakeDepsPathBasedCommand extends PluginCommand { ...pubspec.dependencies.keys, ...pubspec.devDependencies.keys, ]; - final Iterable packagesToOverride = combinedDependencies + final List packagesToOverride = combinedDependencies .where( (String packageName) => localDependencies.containsKey(packageName)) .toList(); + // Sort the combined list to avoid sort_pub_dependencies lint violations. + packagesToOverride.sort(); if (packagesToOverride.isNotEmpty) { final String commonBasePath = packagesDir.path; // Find the relative path to the common base. diff --git a/script/tool/lib/src/native_test_command.dart b/script/tool/lib/src/native_test_command.dart index 81b13cbb75e2..af5f4df98e86 100644 --- a/script/tool/lib/src/native_test_command.dart +++ b/script/tool/lib/src/native_test_command.dart @@ -406,9 +406,9 @@ this command. ); // The exit code from 'xcodebuild test' when there are no tests. - const int _xcodebuildNoTestExitCode = 66; + const int xcodebuildNoTestExitCode = 66; switch (exitCode) { - case _xcodebuildNoTestExitCode: + case xcodebuildNoTestExitCode: _printNoExampleTestsMessage(example, platform); break; case 0: diff --git a/script/tool/lib/src/publish_check_command.dart b/script/tool/lib/src/publish_check_command.dart index d98a286ff582..38e1b7bdebbb 100644 --- a/script/tool/lib/src/publish_check_command.dart +++ b/script/tool/lib/src/publish_check_command.dart @@ -55,7 +55,7 @@ class PublishCheckCommand extends PackageLoopingCommand { @override final String description = - 'Checks to make sure that a plugin *could* be published.'; + 'Checks to make sure that a package *could* be published.'; final PubVersionFinder _pubVersionFinder; diff --git a/script/tool/lib/src/publish_plugin_command.dart b/script/tool/lib/src/publish_command.dart similarity index 98% rename from script/tool/lib/src/publish_plugin_command.dart rename to script/tool/lib/src/publish_command.dart index cae8edac71ca..e7b3d110c5fa 100644 --- a/script/tool/lib/src/publish_plugin_command.dart +++ b/script/tool/lib/src/publish_command.dart @@ -18,8 +18,8 @@ import 'package:yaml/yaml.dart'; import 'common/core.dart'; import 'common/file_utils.dart'; import 'common/git_version_finder.dart'; +import 'common/package_command.dart'; import 'common/package_looping_command.dart'; -import 'common/plugin_command.dart'; import 'common/process_runner.dart'; import 'common/pub_version_finder.dart'; import 'common/repository_package.dart'; @@ -42,13 +42,13 @@ class _RemoteInfo { /// 2. Tags the release with the format -v. /// 3. Pushes the release to a remote. /// -/// Both 2 and 3 are optional, see `plugin_tools help publish-plugin` for full +/// Both 2 and 3 are optional, see `plugin_tools help publish` for full /// usage information. /// /// [processRunner], [print], and [stdin] can be overriden for easier testing. -class PublishPluginCommand extends PackageLoopingCommand { +class PublishCommand extends PackageLoopingCommand { /// Creates an instance of the publish command. - PublishPluginCommand( + PublishCommand( Directory packagesDir, { ProcessRunner processRunner = const ProcessRunner(), Platform platform = const LocalPlatform(), @@ -100,7 +100,7 @@ class PublishPluginCommand extends PackageLoopingCommand { static const String _tagFormat = '%PACKAGE%-v%VERSION%'; @override - final String name = 'publish-plugin'; + final String name = 'publish'; @override final String description = diff --git a/script/tool/lib/src/update_excerpts_command.dart b/script/tool/lib/src/update_excerpts_command.dart index 320a3c596323..5a59104d4e7f 100644 --- a/script/tool/lib/src/update_excerpts_command.dart +++ b/script/tool/lib/src/update_excerpts_command.dart @@ -5,12 +5,12 @@ import 'dart:io' as io; import 'package:file/file.dart'; -import 'package:flutter_plugin_tools/src/common/core.dart'; import 'package:git/git.dart'; import 'package:platform/platform.dart'; import 'package:yaml/yaml.dart'; import 'package:yaml_edit/yaml_edit.dart'; +import 'common/core.dart'; import 'common/package_looping_command.dart'; import 'common/process_runner.dart'; import 'common/repository_package.dart'; diff --git a/script/tool/lib/src/update_release_info_command.dart b/script/tool/lib/src/update_release_info_command.dart index 465b475eb9b5..67aa994d963c 100644 --- a/script/tool/lib/src/update_release_info_command.dart +++ b/script/tool/lib/src/update_release_info_command.dart @@ -4,11 +4,11 @@ import 'package:args/command_runner.dart'; import 'package:file/file.dart'; -import 'package:flutter_plugin_tools/src/common/core.dart'; import 'package:git/git.dart'; import 'package:pub_semver/pub_semver.dart'; import 'package:yaml_edit/yaml_edit.dart'; +import 'common/core.dart'; import 'common/git_version_finder.dart'; import 'common/package_looping_command.dart'; import 'common/package_state_utils.dart'; diff --git a/script/tool/lib/src/version_check_command.dart b/script/tool/lib/src/version_check_command.dart index 235611492b2d..b3be672066d9 100644 --- a/script/tool/lib/src/version_check_command.dart +++ b/script/tool/lib/src/version_check_command.dart @@ -170,7 +170,7 @@ class VersionCheckCommand extends PackageLoopingCommand { @override final String description = - 'Checks if the versions of the plugins have been incremented per pub specification.\n' + 'Checks if the versions of packages have been incremented per pub specification.\n' 'Also checks if the latest version in CHANGELOG matches the version in pubspec.\n\n' 'This command requires "pub" and "flutter" to be in your path.'; @@ -318,7 +318,7 @@ ${indentation}HTTP response: ${pubVersionFinderResponse.httpResponse.body} print('${indentation}Unable to find previous version ' '${getBoolArg(_againstPubFlag) ? 'on pub server' : 'at git base'}.'); logWarning( - '${indentation}If this plugin is not new, something has gone wrong.'); + '${indentation}If this package is not new, something has gone wrong.'); return _CurrentVersionState.validIncrease; // Assume new, thus valid. } diff --git a/script/tool/pubspec.yaml b/script/tool/pubspec.yaml index 9b9d73288552..9e767ad724c0 100644 --- a/script/tool/pubspec.yaml +++ b/script/tool/pubspec.yaml @@ -1,7 +1,7 @@ name: flutter_plugin_tools description: Productivity utils for flutter/plugins and flutter/packages repository: https://github.com/flutter/plugins/tree/main/script/tool -version: 0.10.0+1 +version: 0.12.0 dependencies: args: ^2.1.0 diff --git a/script/tool/test/analyze_command_test.dart b/script/tool/test/analyze_command_test.dart index e10780fa9ecb..e6b910960846 100644 --- a/script/tool/test/analyze_command_test.dart +++ b/script/tool/test/analyze_command_test.dart @@ -37,7 +37,7 @@ void main() { }); test('analyzes all packages', () async { - final RepositoryPackage plugin1 = createFakePlugin('a', packagesDir); + final RepositoryPackage package1 = createFakePackage('a', packagesDir); final RepositoryPackage plugin2 = createFakePlugin('b', packagesDir); await runCapturingPrint(runner, ['analyze']); @@ -45,9 +45,9 @@ void main() { expect( processRunner.recordedCalls, orderedEquals([ - ProcessCall('flutter', const ['pub', 'get'], plugin1.path), - ProcessCall( - 'dart', const ['analyze', '--fatal-infos'], plugin1.path), + ProcessCall('flutter', const ['pub', 'get'], package1.path), + ProcessCall('dart', const ['analyze', '--fatal-infos'], + package1.path), ProcessCall('flutter', const ['pub', 'get'], plugin2.path), ProcessCall( 'dart', const ['analyze', '--fatal-infos'], plugin2.path), diff --git a/script/tool/test/common/git_version_finder_test.dart b/script/tool/test/common/git_version_finder_test.dart index ad1a26ffc165..d5a5dd4fe876 100644 --- a/script/tool/test/common/git_version_finder_test.dart +++ b/script/tool/test/common/git_version_finder_test.dart @@ -8,7 +8,7 @@ import 'package:flutter_plugin_tools/src/common/git_version_finder.dart'; import 'package:mockito/mockito.dart'; import 'package:test/test.dart'; -import 'plugin_command_test.mocks.dart'; +import 'package_command_test.mocks.dart'; void main() { late List?> gitDirCommands; diff --git a/script/tool/test/common/plugin_command_test.dart b/script/tool/test/common/package_command_test.dart similarity index 88% rename from script/tool/test/common/plugin_command_test.dart rename to script/tool/test/common/package_command_test.dart index 8c6b38682418..aa0a20253955 100644 --- a/script/tool/test/common/plugin_command_test.dart +++ b/script/tool/test/common/package_command_test.dart @@ -8,7 +8,7 @@ import 'package:args/command_runner.dart'; import 'package:file/file.dart'; import 'package:file/memory.dart'; import 'package:flutter_plugin_tools/src/common/core.dart'; -import 'package:flutter_plugin_tools/src/common/plugin_command.dart'; +import 'package:flutter_plugin_tools/src/common/package_command.dart'; import 'package:flutter_plugin_tools/src/common/process_runner.dart'; import 'package:git/git.dart'; import 'package:mockito/annotations.dart'; @@ -18,12 +18,12 @@ import 'package:test/test.dart'; import '../mocks.dart'; import '../util.dart'; -import 'plugin_command_test.mocks.dart'; +import 'package_command_test.mocks.dart'; @GenerateMocks([GitDir]) void main() { late RecordingProcessRunner processRunner; - late SamplePluginCommand command; + late SamplePackageCommand command; late CommandRunner runner; late FileSystem fileSystem; late MockPlatform mockPlatform; @@ -49,7 +49,7 @@ void main() { return processRunner.run('git-$gitCommand', arguments); }); processRunner = RecordingProcessRunner(); - command = SamplePluginCommand( + command = SamplePackageCommand( packagesDir, processRunner: processRunner, platform: mockPlatform, @@ -282,7 +282,7 @@ packages/plugin1/plugin1/plugin1.dart }); test('returns subpackages after the enclosing package', () async { - final SamplePluginCommand localCommand = SamplePluginCommand( + final SamplePackageCommand localCommand = SamplePackageCommand( packagesDir, processRunner: processRunner, platform: mockPlatform, @@ -408,11 +408,18 @@ packages/plugin1/CHANGELOG createFakePlugin('plugin1', packagesDir); final RepositoryPackage plugin2 = createFakePlugin('plugin2', packagesDir); - await runCapturingPrint(runner, + + final List output = await runCapturingPrint(runner, ['sample', '--base-sha=main', '--run-on-changed-packages']); expect(command.plugins, unorderedEquals([plugin1.path, plugin2.path])); + expect( + output, + containsAllInOrder([ + contains('Running for all packages, since a file has changed ' + 'that could affect the entire repository.') + ])); }); test('all plugins should be tested if .ci.yaml changes', () async { @@ -426,11 +433,17 @@ packages/plugin1/CHANGELOG createFakePlugin('plugin1', packagesDir); final RepositoryPackage plugin2 = createFakePlugin('plugin2', packagesDir); - await runCapturingPrint(runner, + final List output = await runCapturingPrint(runner, ['sample', '--base-sha=main', '--run-on-changed-packages']); expect(command.plugins, unorderedEquals([plugin1.path, plugin2.path])); + expect( + output, + containsAllInOrder([ + contains('Running for all packages, since a file has changed ' + 'that could affect the entire repository.') + ])); }); test('all plugins should be tested if anything in .ci/ changes', @@ -445,14 +458,20 @@ packages/plugin1/CHANGELOG createFakePlugin('plugin1', packagesDir); final RepositoryPackage plugin2 = createFakePlugin('plugin2', packagesDir); - await runCapturingPrint(runner, + final List output = await runCapturingPrint(runner, ['sample', '--base-sha=main', '--run-on-changed-packages']); expect(command.plugins, unorderedEquals([plugin1.path, plugin2.path])); + expect( + output, + containsAllInOrder([ + contains('Running for all packages, since a file has changed ' + 'that could affect the entire repository.') + ])); }); - test('all plugins should be tested if anything in script changes.', + test('all plugins should be tested if anything in script/ changes.', () async { processRunner.mockProcessesForExecutable['git-diff'] = [ MockProcess(stdout: ''' @@ -464,11 +483,17 @@ packages/plugin1/CHANGELOG createFakePlugin('plugin1', packagesDir); final RepositoryPackage plugin2 = createFakePlugin('plugin2', packagesDir); - await runCapturingPrint(runner, + final List output = await runCapturingPrint(runner, ['sample', '--base-sha=main', '--run-on-changed-packages']); expect(command.plugins, unorderedEquals([plugin1.path, plugin2.path])); + expect( + output, + containsAllInOrder([ + contains('Running for all packages, since a file has changed ' + 'that could affect the entire repository.') + ])); }); test('all plugins should be tested if the root analysis options change.', @@ -483,11 +508,17 @@ packages/plugin1/CHANGELOG createFakePlugin('plugin1', packagesDir); final RepositoryPackage plugin2 = createFakePlugin('plugin2', packagesDir); - await runCapturingPrint(runner, + final List output = await runCapturingPrint(runner, ['sample', '--base-sha=main', '--run-on-changed-packages']); expect(command.plugins, unorderedEquals([plugin1.path, plugin2.path])); + expect( + output, + containsAllInOrder([ + contains('Running for all packages, since a file has changed ' + 'that could affect the entire repository.') + ])); }); test('all plugins should be tested if formatting options change.', @@ -502,11 +533,17 @@ packages/plugin1/CHANGELOG createFakePlugin('plugin1', packagesDir); final RepositoryPackage plugin2 = createFakePlugin('plugin2', packagesDir); - await runCapturingPrint(runner, + final List output = await runCapturingPrint(runner, ['sample', '--base-sha=main', '--run-on-changed-packages']); expect(command.plugins, unorderedEquals([plugin1.path, plugin2.path])); + expect( + output, + containsAllInOrder([ + contains('Running for all packages, since a file has changed ' + 'that could affect the entire repository.') + ])); }); test('Only changed plugin should be tested.', () async { @@ -523,7 +560,7 @@ packages/plugin1/CHANGELOG output, containsAllInOrder([ contains( - 'Running for all packages that have changed relative to "main"'), + 'Running for all packages that have diffs relative to "main"'), ])); expect(command.plugins, unorderedEquals([plugin1.path])); @@ -732,13 +769,17 @@ packages/b_package/lib/src/foo.dart }); group('--packages-for-branch', () { - test('only tests changed packages on a branch', () async { + test('only tests changed packages relative to the merge base on a branch', + () async { processRunner.mockProcessesForExecutable['git-diff'] = [ MockProcess(stdout: 'packages/plugin1/plugin1.dart'), ]; processRunner.mockProcessesForExecutable['git-rev-parse'] = [ MockProcess(stdout: 'a-branch'), ]; + processRunner.mockProcessesForExecutable['git-merge-base'] = [ + MockProcess(stdout: 'abc123'), + ]; final RepositoryPackage plugin1 = createFakePlugin('plugin1', packagesDir); createFakePlugin('plugin2', packagesDir); @@ -750,11 +791,20 @@ packages/b_package/lib/src/foo.dart expect( output, containsAllInOrder([ - contains('--packages-for-branch: running on changed packages'), + contains( + 'Running for all packages that have diffs relative to "abc123"'), ])); + // Ensure that it's diffing against the merge-base. + expect( + processRunner.recordedCalls, + contains( + const ProcessCall( + 'git-diff', ['--name-only', 'abc123', 'HEAD'], null), + )); }); - test('tests all packages on main', () async { + test('only tests changed packages relative to the previous commit on main', + () async { processRunner.mockProcessesForExecutable['git-diff'] = [ MockProcess(stdout: 'packages/plugin1/plugin1.dart'), ]; @@ -763,19 +813,27 @@ packages/b_package/lib/src/foo.dart ]; final RepositoryPackage plugin1 = createFakePlugin('plugin1', packagesDir); - final RepositoryPackage plugin2 = - createFakePlugin('plugin2', packagesDir); + createFakePlugin('plugin2', packagesDir); final List output = await runCapturingPrint( runner, ['sample', '--packages-for-branch']); - expect(command.plugins, - unorderedEquals([plugin1.path, plugin2.path])); + expect(command.plugins, unorderedEquals([plugin1.path])); expect( output, containsAllInOrder([ - contains('--packages-for-branch: running on all packages'), + contains('--packages-for-branch: running on default branch; ' + 'using parent commit as the diff base'), + contains( + 'Running for all packages that have diffs relative to "HEAD~"'), ])); + // Ensure that it's diffing against the prior commit. + expect( + processRunner.recordedCalls, + contains( + const ProcessCall( + 'git-diff', ['--name-only', 'HEAD~', 'HEAD'], null), + )); }); test('tests all packages on master', () async { @@ -787,19 +845,27 @@ packages/b_package/lib/src/foo.dart ]; final RepositoryPackage plugin1 = createFakePlugin('plugin1', packagesDir); - final RepositoryPackage plugin2 = - createFakePlugin('plugin2', packagesDir); + createFakePlugin('plugin2', packagesDir); final List output = await runCapturingPrint( runner, ['sample', '--packages-for-branch']); - expect(command.plugins, - unorderedEquals([plugin1.path, plugin2.path])); + expect(command.plugins, unorderedEquals([plugin1.path])); expect( output, containsAllInOrder([ - contains('--packages-for-branch: running on all packages'), + contains('--packages-for-branch: running on default branch; ' + 'using parent commit as the diff base'), + contains( + 'Running for all packages that have diffs relative to "HEAD~"'), ])); + // Ensure that it's diffing against the prior commit. + expect( + processRunner.recordedCalls, + contains( + const ProcessCall( + 'git-diff', ['--name-only', 'HEAD~', 'HEAD'], null), + )); }); test('throws if getting the branch fails', () async { @@ -848,7 +914,7 @@ packages/b_package/lib/src/foo.dart ]; for (int i = 0; i < expectedShards.length; ++i) { - final SamplePluginCommand localCommand = SamplePluginCommand( + final SamplePackageCommand localCommand = SamplePackageCommand( packagesDir, processRunner: processRunner, platform: mockPlatform, @@ -892,7 +958,7 @@ packages/b_package/lib/src/foo.dart ]; for (int i = 0; i < expectedShards.length; ++i) { - final SamplePluginCommand localCommand = SamplePluginCommand( + final SamplePackageCommand localCommand = SamplePackageCommand( packagesDir, processRunner: processRunner, platform: mockPlatform, @@ -945,7 +1011,7 @@ packages/b_package/lib/src/foo.dart createFakePackage('package9', packagesDir); for (int i = 0; i < expectedShards.length; ++i) { - final SamplePluginCommand localCommand = SamplePluginCommand( + final SamplePackageCommand localCommand = SamplePackageCommand( packagesDir, processRunner: processRunner, platform: mockPlatform, @@ -971,8 +1037,8 @@ packages/b_package/lib/src/foo.dart }); } -class SamplePluginCommand extends PluginCommand { - SamplePluginCommand( +class SamplePackageCommand extends PackageCommand { + SamplePackageCommand( Directory packagesDir, { ProcessRunner processRunner = const ProcessRunner(), Platform platform = const LocalPlatform(), diff --git a/script/tool/test/common/plugin_command_test.mocks.dart b/script/tool/test/common/package_command_test.mocks.dart similarity index 100% rename from script/tool/test/common/plugin_command_test.mocks.dart rename to script/tool/test/common/package_command_test.mocks.dart diff --git a/script/tool/test/common/package_looping_command_test.dart b/script/tool/test/common/package_looping_command_test.dart index 7e9f63cb0344..c858df0022cc 100644 --- a/script/tool/test/common/package_looping_command_test.dart +++ b/script/tool/test/common/package_looping_command_test.dart @@ -18,7 +18,7 @@ import 'package:test/test.dart'; import '../mocks.dart'; import '../util.dart'; -import 'plugin_command_test.mocks.dart'; +import 'package_command_test.mocks.dart'; // Constants for colorized output start and end. const String _startElapsedTimeColor = '\x1B[90m'; @@ -373,9 +373,10 @@ void main() { test('skips unsupported Dart versions when requested', () async { final RepositoryPackage excluded = createFakePackage( - 'excluded_package', packagesDir, dartConstraint: '>=2.17.0 <3.0.0'); - final RepositoryPackage included = createFakePackage( - 'a_package', packagesDir); + 'excluded_package', packagesDir, + dartConstraint: '>=2.17.0 <3.0.0'); + final RepositoryPackage included = + createFakePackage('a_package', packagesDir); final TestPackageLoopingCommand command = createTestCommand( packageLoopingType: PackageLoopingType.includeAllSubpackages, @@ -406,8 +407,7 @@ void main() { createFakePlugin('package_a', packagesDir); createFakePackage('package_b', packagesDir); - final TestPackageLoopingCommand command = - createTestCommand(); + final TestPackageLoopingCommand command = createTestCommand(); final List output = await runCommand(command); const String separator = @@ -440,8 +440,7 @@ void main() { createFakePlugin('package_a', packagesDir); createFakePackage('package_b', packagesDir); - final TestPackageLoopingCommand command = - createTestCommand(); + final TestPackageLoopingCommand command = createTestCommand(); final List output = await runCommand(command, arguments: ['--log-timing']); @@ -783,8 +782,7 @@ void main() { createFakePackage('package_f', packagesDir); - final TestPackageLoopingCommand command = - createTestCommand(); + final TestPackageLoopingCommand command = createTestCommand(); final List output = await runCommand(command); expect( @@ -809,8 +807,7 @@ void main() { test('prints exclusions as skips in long-form run summary', () async { createFakePackage('package_a', packagesDir); - final TestPackageLoopingCommand command = - createTestCommand(); + final TestPackageLoopingCommand command = createTestCommand(); final List output = await runCommand(command, arguments: ['--exclude=package_a']); diff --git a/script/tool/test/custom_test_command_test.dart b/script/tool/test/custom_test_command_test.dart index a28b47505e9d..8b0c021b1255 100644 --- a/script/tool/test/custom_test_command_test.dart +++ b/script/tool/test/custom_test_command_test.dart @@ -40,7 +40,7 @@ void main() { test('runs both new and legacy when both are present', () async { final RepositoryPackage package = - createFakePlugin('a_package', packagesDir, extraFiles: [ + createFakePackage('a_package', packagesDir, extraFiles: [ 'tool/run_tests.dart', 'run_tests.sh', ]); @@ -65,7 +65,7 @@ void main() { }); test('runs when only new is present', () async { - final RepositoryPackage package = createFakePlugin( + final RepositoryPackage package = createFakePackage( 'a_package', packagesDir, extraFiles: ['tool/run_tests.dart']); @@ -87,7 +87,7 @@ void main() { }); test('runs pub get before running Dart test script', () async { - final RepositoryPackage package = createFakePlugin( + final RepositoryPackage package = createFakePackage( 'a_package', packagesDir, extraFiles: ['tool/run_tests.dart']); @@ -103,7 +103,7 @@ void main() { }); test('runs when only legacy is present', () async { - final RepositoryPackage package = createFakePlugin( + final RepositoryPackage package = createFakePackage( 'a_package', packagesDir, extraFiles: ['run_tests.sh']); @@ -125,7 +125,7 @@ void main() { }); test('skips when neither is present', () async { - createFakePlugin('a_package', packagesDir); + createFakePackage('a_package', packagesDir); final List output = await runCapturingPrint(runner, ['custom-test']); @@ -140,7 +140,7 @@ void main() { }); test('fails if new fails', () async { - createFakePlugin('a_package', packagesDir, extraFiles: [ + createFakePackage('a_package', packagesDir, extraFiles: [ 'tool/run_tests.dart', 'run_tests.sh', ]); @@ -166,7 +166,7 @@ void main() { }); test('fails if pub get fails', () async { - createFakePlugin('a_package', packagesDir, extraFiles: [ + createFakePackage('a_package', packagesDir, extraFiles: [ 'tool/run_tests.dart', 'run_tests.sh', ]); @@ -193,7 +193,7 @@ void main() { test('fails if legacy fails', () async { final RepositoryPackage package = - createFakePlugin('a_package', packagesDir, extraFiles: [ + createFakePackage('a_package', packagesDir, extraFiles: [ 'tool/run_tests.dart', 'run_tests.sh', ]); @@ -238,7 +238,7 @@ void main() { test('runs new and skips old when both are present', () async { final RepositoryPackage package = - createFakePlugin('a_package', packagesDir, extraFiles: [ + createFakePackage('a_package', packagesDir, extraFiles: [ 'tool/run_tests.dart', 'run_tests.sh', ]); @@ -261,7 +261,7 @@ void main() { }); test('runs when only new is present', () async { - final RepositoryPackage package = createFakePlugin( + final RepositoryPackage package = createFakePackage( 'a_package', packagesDir, extraFiles: ['tool/run_tests.dart']); @@ -283,7 +283,7 @@ void main() { }); test('skips package when only legacy is present', () async { - createFakePlugin('a_package', packagesDir, + createFakePackage('a_package', packagesDir, extraFiles: ['run_tests.sh']); final List output = @@ -300,7 +300,7 @@ void main() { }); test('fails if new fails', () async { - createFakePlugin('a_package', packagesDir, extraFiles: [ + createFakePackage('a_package', packagesDir, extraFiles: [ 'tool/run_tests.dart', 'run_tests.sh', ]); diff --git a/script/tool/test/dependabot_check_command_test.dart b/script/tool/test/dependabot_check_command_test.dart index a4c8693b2c21..39dd8f4fcb92 100644 --- a/script/tool/test/dependabot_check_command_test.dart +++ b/script/tool/test/dependabot_check_command_test.dart @@ -10,7 +10,7 @@ import 'package:flutter_plugin_tools/src/dependabot_check_command.dart'; import 'package:mockito/mockito.dart'; import 'package:test/test.dart'; -import 'common/plugin_command_test.mocks.dart'; +import 'common/package_command_test.mocks.dart'; import 'util.dart'; void main() { @@ -36,7 +36,7 @@ void main() { runner.addCommand(command); }); - void _setDependabotCoverage({ + void setDependabotCoverage({ Iterable gradleDirs = const [], }) { final Iterable gradleEntries = @@ -57,7 +57,7 @@ ${gradleEntries.join('\n')} } test('skips with no supported ecosystems', () async { - _setDependabotCoverage(); + setDependabotCoverage(); createFakePackage('a_package', packagesDir); final List output = @@ -71,7 +71,7 @@ ${gradleEntries.join('\n')} }); test('fails for app missing Gradle coverage', () async { - _setDependabotCoverage(); + setDependabotCoverage(); final RepositoryPackage package = createFakePackage('a_package', packagesDir); package.directory @@ -97,7 +97,7 @@ ${gradleEntries.join('\n')} }); test('fails for plugin missing Gradle coverage', () async { - _setDependabotCoverage(); + setDependabotCoverage(); final RepositoryPackage plugin = createFakePlugin('a_plugin', packagesDir); plugin.directory.childDirectory('android').createSync(recursive: true); @@ -118,7 +118,7 @@ ${gradleEntries.join('\n')} }); test('passes for correct Gradle coverage', () async { - _setDependabotCoverage(gradleDirs: [ + setDependabotCoverage(gradleDirs: [ 'packages/a_plugin/android', 'packages/a_plugin/example/android/app', ]); diff --git a/script/tool/test/federation_safety_check_command_test.dart b/script/tool/test/federation_safety_check_command_test.dart index 015a0eb634d9..6b6b1a514531 100644 --- a/script/tool/test/federation_safety_check_command_test.dart +++ b/script/tool/test/federation_safety_check_command_test.dart @@ -12,7 +12,7 @@ import 'package:flutter_plugin_tools/src/federation_safety_check_command.dart'; import 'package:mockito/mockito.dart'; import 'package:test/test.dart'; -import 'common/plugin_command_test.mocks.dart'; +import 'common/package_command_test.mocks.dart'; import 'mocks.dart'; import 'util.dart'; diff --git a/script/tool/test/firebase_test_lab_command_test.dart b/script/tool/test/firebase_test_lab_command_test.dart index 2d3175e171e0..68ea62b2334f 100644 --- a/script/tool/test/firebase_test_lab_command_test.dart +++ b/script/tool/test/firebase_test_lab_command_test.dart @@ -40,7 +40,7 @@ void main() { runner.addCommand(command); }); - void _writeJavaTestFile(RepositoryPackage plugin, String relativeFilePath, + void writeJavaTestFile(RepositoryPackage plugin, String relativeFilePath, {String runnerClass = 'FlutterTestRunner'}) { childFileWithSubcomponents( plugin.directory, p.posix.split(relativeFilePath)) @@ -67,7 +67,7 @@ public class MainActivityTest { 'example/android/gradlew', javaTestFileRelativePath, ]); - _writeJavaTestFile(plugin, javaTestFileRelativePath); + writeJavaTestFile(plugin, javaTestFileRelativePath); Error? commandError; final List output = await runCapturingPrint( @@ -97,7 +97,7 @@ public class MainActivityTest { 'example/android/gradlew', javaTestFileRelativePath, ]); - _writeJavaTestFile(plugin, javaTestFileRelativePath); + writeJavaTestFile(plugin, javaTestFileRelativePath); final List output = await runCapturingPrint(runner, ['firebase-test-lab']); @@ -120,7 +120,7 @@ public class MainActivityTest { 'example/android/gradlew', javaTestFileRelativePath, ]); - _writeJavaTestFile(plugin1, javaTestFileRelativePath); + writeJavaTestFile(plugin1, javaTestFileRelativePath); final RepositoryPackage plugin2 = createFakePlugin('plugin2', packagesDir, extraFiles: [ 'test/plugin_test.dart', @@ -128,7 +128,7 @@ public class MainActivityTest { 'example/android/gradlew', javaTestFileRelativePath, ]); - _writeJavaTestFile(plugin2, javaTestFileRelativePath); + writeJavaTestFile(plugin2, javaTestFileRelativePath); final List output = await runCapturingPrint(runner, [ 'firebase-test-lab', @@ -207,7 +207,7 @@ public class MainActivityTest { 'example/android/gradlew', javaTestFileRelativePath, ]); - _writeJavaTestFile(plugin, javaTestFileRelativePath); + writeJavaTestFile(plugin, javaTestFileRelativePath); final List output = await runCapturingPrint(runner, [ 'firebase-test-lab', @@ -286,7 +286,7 @@ public class MainActivityTest { ], ]); for (final String example in examples) { - _writeJavaTestFile( + writeJavaTestFile( plugin, 'example/$example/$javaTestFileExampleRelativePath'); } @@ -347,7 +347,7 @@ public class MainActivityTest { 'example/android/gradlew', javaTestFileRelativePath, ]); - _writeJavaTestFile(plugin, javaTestFileRelativePath); + writeJavaTestFile(plugin, javaTestFileRelativePath); processRunner.mockProcessesForExecutable['gcloud'] = [ MockProcess(), // auth @@ -393,7 +393,7 @@ public class MainActivityTest { 'example/android/gradlew', javaTestFileRelativePath, ]); - _writeJavaTestFile(plugin, javaTestFileRelativePath); + writeJavaTestFile(plugin, javaTestFileRelativePath); processRunner.mockProcessesForExecutable['gcloud'] = [ MockProcess(), // auth @@ -460,7 +460,7 @@ public class MainActivityTest { 'example/android/gradlew', javaTestFileRelativePath, ]); - _writeJavaTestFile(plugin, javaTestFileRelativePath); + writeJavaTestFile(plugin, javaTestFileRelativePath); Error? commandError; final List output = await runCapturingPrint( @@ -501,7 +501,7 @@ public class MainActivityTest { javaTestFileRelativePath, ]); // Use the wrong @RunWith annotation. - _writeJavaTestFile(plugin, javaTestFileRelativePath, + writeJavaTestFile(plugin, javaTestFileRelativePath, runnerClass: 'AndroidJUnit4.class'); Error? commandError; @@ -565,7 +565,7 @@ public class MainActivityTest { 'example/integration_test/foo_test.dart', javaTestFileRelativePath, ]); - _writeJavaTestFile(plugin, javaTestFileRelativePath); + writeJavaTestFile(plugin, javaTestFileRelativePath); final List output = await runCapturingPrint(runner, [ 'firebase-test-lab', @@ -628,7 +628,7 @@ public class MainActivityTest { 'example/integration_test/foo_test.dart', javaTestFileRelativePath, ]); - _writeJavaTestFile(plugin, javaTestFileRelativePath); + writeJavaTestFile(plugin, javaTestFileRelativePath); processRunner.mockProcessesForExecutable['flutter'] = [ MockProcess(exitCode: 1) // flutter build @@ -663,7 +663,7 @@ public class MainActivityTest { 'example/integration_test/foo_test.dart', javaTestFileRelativePath, ]); - _writeJavaTestFile(plugin, javaTestFileRelativePath); + writeJavaTestFile(plugin, javaTestFileRelativePath); final String gradlewPath = plugin .getExamples() @@ -704,7 +704,7 @@ public class MainActivityTest { 'example/integration_test/foo_test.dart', javaTestFileRelativePath, ]); - _writeJavaTestFile(plugin, javaTestFileRelativePath); + writeJavaTestFile(plugin, javaTestFileRelativePath); final String gradlewPath = plugin .getExamples() @@ -750,7 +750,7 @@ public class MainActivityTest { 'example/android/gradlew', javaTestFileRelativePath, ]); - _writeJavaTestFile(plugin, javaTestFileRelativePath); + writeJavaTestFile(plugin, javaTestFileRelativePath); await runCapturingPrint(runner, [ 'firebase-test-lab', diff --git a/script/tool/test/fix_command_test.dart b/script/tool/test/fix_command_test.dart new file mode 100644 index 000000000000..16061d2206cd --- /dev/null +++ b/script/tool/test/fix_command_test.dart @@ -0,0 +1,78 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:io' as io; + +import 'package:args/command_runner.dart'; +import 'package:file/file.dart'; +import 'package:file/memory.dart'; +import 'package:flutter_plugin_tools/src/common/core.dart'; +import 'package:flutter_plugin_tools/src/fix_command.dart'; +import 'package:test/test.dart'; + +import 'mocks.dart'; +import 'util.dart'; + +void main() { + late FileSystem fileSystem; + late MockPlatform mockPlatform; + late Directory packagesDir; + late RecordingProcessRunner processRunner; + late CommandRunner runner; + + setUp(() { + fileSystem = MemoryFileSystem(); + mockPlatform = MockPlatform(); + packagesDir = createPackagesDirectory(fileSystem: fileSystem); + processRunner = RecordingProcessRunner(); + final FixCommand command = FixCommand( + packagesDir, + processRunner: processRunner, + platform: mockPlatform, + ); + + runner = CommandRunner('fix_command', 'Test for fix_command'); + runner.addCommand(command); + }); + + test('runs fix in top-level packages and subpackages', () async { + final RepositoryPackage package = createFakePackage('a', packagesDir); + final RepositoryPackage plugin = createFakePlugin('b', packagesDir); + + await runCapturingPrint(runner, ['fix']); + + expect( + processRunner.recordedCalls, + orderedEquals([ + ProcessCall('dart', const ['fix', '--apply'], package.path), + ProcessCall('dart', const ['fix', '--apply'], + package.getExamples().first.path), + ProcessCall('dart', const ['fix', '--apply'], plugin.path), + ProcessCall('dart', const ['fix', '--apply'], + plugin.getExamples().first.path), + ])); + }); + + test('fails if "dart fix" fails', () async { + createFakePlugin('foo', packagesDir); + + processRunner.mockProcessesForExecutable['dart'] = [ + MockProcess(exitCode: 1), + ]; + + Error? commandError; + final List output = await runCapturingPrint(runner, ['fix'], + errorHandler: (Error e) { + commandError = e; + }); + + expect(commandError, isA()); + expect( + output, + containsAllInOrder([ + contains('Unable to automatically fix package.'), + ]), + ); + }); +} diff --git a/script/tool/test/format_command_test.dart b/script/tool/test/format_command_test.dart index 5bd6f97832f7..9a865053a2b6 100644 --- a/script/tool/test/format_command_test.dart +++ b/script/tool/test/format_command_test.dart @@ -49,7 +49,7 @@ void main() { /// Returns a modified version of a list of [relativePaths] that are relative /// to [package] to instead be relative to [packagesDir]. - List _getPackagesDirRelativePaths( + List getPackagesDirRelativePaths( RepositoryPackage package, List relativePaths) { final p.Context path = analyzeCommand.path; final String relativeBase = @@ -60,15 +60,15 @@ void main() { } /// Returns a list of [count] relative paths to pass to [createFakePlugin] - /// with name [pluginName] such that each path will be 99 characters long - /// relative to [packagesDir]. + /// or [createFakePackage] with name [packageName] such that each path will + /// be 99 characters long relative to [packagesDir]. /// /// This is for each of testing batching, since it means each file will /// consume 100 characters of the batch length. - List _get99CharacterPathExtraFiles(String pluginName, int count) { + List get99CharacterPathExtraFiles(String packageName, int count) { final int padding = 99 - - pluginName.length - - 1 - // the path separator after the plugin name + packageName.length - + 1 - // the path separator after the package name 1 - // the path separator after the padding 10; // the file name const int filenameBase = 10000; @@ -99,10 +99,7 @@ void main() { orderedEquals([ ProcessCall( getFlutterCommand(mockPlatform), - [ - 'format', - ..._getPackagesDirRelativePaths(plugin, files) - ], + ['format', ...getPackagesDirRelativePaths(plugin, files)], packagesDir.path), ])); }); @@ -138,7 +135,7 @@ void main() { getFlutterCommand(mockPlatform), [ 'format', - ..._getPackagesDirRelativePaths(plugin, formattedFiles) + ...getPackagesDirRelativePaths(plugin, formattedFiles) ], packagesDir.path), ])); @@ -191,7 +188,7 @@ void main() { '-jar', javaFormatPath, '--replace', - ..._getPackagesDirRelativePaths(plugin, files) + ...getPackagesDirRelativePaths(plugin, files) ], packagesDir.path), ])); @@ -271,7 +268,7 @@ void main() { '-jar', javaFormatPath, '--replace', - ..._getPackagesDirRelativePaths(plugin, files) + ...getPackagesDirRelativePaths(plugin, files) ], packagesDir.path), ])); @@ -303,7 +300,7 @@ void main() { [ '-i', '--style=file', - ..._getPackagesDirRelativePaths(plugin, files) + ...getPackagesDirRelativePaths(plugin, files) ], packagesDir.path), ])); @@ -358,7 +355,7 @@ void main() { [ '-i', '--style=file', - ..._getPackagesDirRelativePaths(plugin, files) + ...getPackagesDirRelativePaths(plugin, files) ], packagesDir.path), ])); @@ -426,14 +423,14 @@ void main() { [ '-i', '--style=file', - ..._getPackagesDirRelativePaths(plugin, clangFiles) + ...getPackagesDirRelativePaths(plugin, clangFiles) ], packagesDir.path), ProcessCall( getFlutterCommand(mockPlatform), [ 'format', - ..._getPackagesDirRelativePaths(plugin, dartFiles) + ...getPackagesDirRelativePaths(plugin, dartFiles) ], packagesDir.path), ProcessCall( @@ -442,7 +439,7 @@ void main() { '-jar', javaFormatPath, '--replace', - ..._getPackagesDirRelativePaths(plugin, javaFiles) + ...getPackagesDirRelativePaths(plugin, javaFiles) ], packagesDir.path), ])); @@ -541,7 +538,7 @@ void main() { // Make the file list one file longer than would fit in the batch. final List batch1 = - _get99CharacterPathExtraFiles(pluginName, batchSize + 1); + get99CharacterPathExtraFiles(pluginName, batchSize + 1); final String extraFile = batch1.removeLast(); createFakePlugin( @@ -578,7 +575,7 @@ void main() { // Make the file list one file longer than would fit in a Windows batch. final List batch = - _get99CharacterPathExtraFiles(pluginName, batchSize + 1); + get99CharacterPathExtraFiles(pluginName, batchSize + 1); createFakePlugin( pluginName, @@ -598,7 +595,7 @@ void main() { // Make the file list one file longer than would fit in the batch. final List batch1 = - _get99CharacterPathExtraFiles(pluginName, batchSize + 1); + get99CharacterPathExtraFiles(pluginName, batchSize + 1); final String extraFile = batch1.removeLast(); createFakePlugin( diff --git a/script/tool/test/license_check_command_test.dart b/script/tool/test/license_check_command_test.dart index 43fbd6b5eca8..09841df74e70 100644 --- a/script/tool/test/license_check_command_test.dart +++ b/script/tool/test/license_check_command_test.dart @@ -11,7 +11,7 @@ import 'package:mockito/mockito.dart'; import 'package:platform/platform.dart'; import 'package:test/test.dart'; -import 'common/plugin_command_test.mocks.dart'; +import 'common/package_command_test.mocks.dart'; import 'mocks.dart'; import 'util.dart'; @@ -48,7 +48,7 @@ void main() { /// [commentString] is added to the start of each line. /// [prefix] is added to the start of the entire block. /// [suffix] is added to the end of the entire block. - void _writeLicense( + void writeLicense( File file, { String comment = '// ', String prefix = '', @@ -164,7 +164,7 @@ void main() { test('passes if all checked files have license blocks', () async { final File checked = root.childFile('checked.cc'); checked.createSync(); - _writeLicense(checked); + writeLicense(checked); final File notChecked = root.childFile('not_checked.md'); notChecked.createSync(); @@ -183,7 +183,7 @@ void main() { test('passes correct license blocks on Windows', () async { final File checked = root.childFile('checked.cc'); checked.createSync(); - _writeLicense(checked, useCrlf: true); + writeLicense(checked, useCrlf: true); final List output = await runCapturingPrint(runner, ['license-check']); @@ -200,13 +200,13 @@ void main() { test('handles the comment styles for all supported languages', () async { final File fileA = root.childFile('file_a.cc'); fileA.createSync(); - _writeLicense(fileA); + writeLicense(fileA); final File fileB = root.childFile('file_b.sh'); fileB.createSync(); - _writeLicense(fileB, comment: '# '); + writeLicense(fileB, comment: '# '); final File fileC = root.childFile('file_c.html'); fileC.createSync(); - _writeLicense(fileC, comment: '', prefix: ''); + writeLicense(fileC, comment: '', prefix: ''); final List output = await runCapturingPrint(runner, ['license-check']); @@ -225,10 +225,10 @@ void main() { test('fails if any checked files are missing license blocks', () async { final File goodA = root.childFile('good.cc'); goodA.createSync(); - _writeLicense(goodA); + writeLicense(goodA); final File goodB = root.childFile('good.h'); goodB.createSync(); - _writeLicense(goodB); + writeLicense(goodB); root.childFile('bad.cc').createSync(); root.childFile('bad.h').createSync(); @@ -255,10 +255,10 @@ void main() { test('fails if any checked files are missing just the copyright', () async { final File good = root.childFile('good.cc'); good.createSync(); - _writeLicense(good); + writeLicense(good); final File bad = root.childFile('bad.cc'); bad.createSync(); - _writeLicense(bad, copyright: ''); + writeLicense(bad, copyright: ''); Error? commandError; final List output = await runCapturingPrint( @@ -282,10 +282,10 @@ void main() { test('fails if any checked files are missing just the license', () async { final File good = root.childFile('good.cc'); good.createSync(); - _writeLicense(good); + writeLicense(good); final File bad = root.childFile('bad.cc'); bad.createSync(); - _writeLicense(bad, license: []); + writeLicense(bad, license: []); Error? commandError; final List output = await runCapturingPrint( @@ -310,7 +310,7 @@ void main() { () async { final File thirdPartyFile = root.childFile('third_party.cc'); thirdPartyFile.createSync(); - _writeLicense(thirdPartyFile, copyright: 'Copyright 2017 Someone Else'); + writeLicense(thirdPartyFile, copyright: 'Copyright 2017 Someone Else'); Error? commandError; final List output = await runCapturingPrint( @@ -339,7 +339,7 @@ void main() { .childDirectory('third_party') .childFile('file.cc'); thirdPartyFile.createSync(recursive: true); - _writeLicense(thirdPartyFile, + writeLicense(thirdPartyFile, copyright: 'Copyright 2017 Workiva Inc.', license: [ 'Licensed under the Apache License, Version 2.0 (the "License");', @@ -366,7 +366,7 @@ void main() { .childDirectory('third_party') .childFile('first_party.cc'); firstPartyFileInThirdParty.createSync(recursive: true); - _writeLicense(firstPartyFileInThirdParty); + writeLicense(firstPartyFileInThirdParty); final List output = await runCapturingPrint(runner, ['license-check']); @@ -383,10 +383,10 @@ void main() { test('fails for licenses that the tool does not expect', () async { final File good = root.childFile('good.cc'); good.createSync(); - _writeLicense(good); + writeLicense(good); final File bad = root.childDirectory('third_party').childFile('bad.cc'); bad.createSync(recursive: true); - _writeLicense(bad, license: [ + writeLicense(bad, license: [ 'This program is free software: you can redistribute it and/or modify', 'it under the terms of the GNU General Public License', ]); @@ -414,10 +414,10 @@ void main() { () async { final File good = root.childFile('good.cc'); good.createSync(); - _writeLicense(good); + writeLicense(good); final File bad = root.childDirectory('third_party').childFile('bad.cc'); bad.createSync(recursive: true); - _writeLicense( + writeLicense( bad, copyright: 'Copyright 2017 Some New Authors.', license: [ diff --git a/script/tool/test/list_command_test.dart b/script/tool/test/list_command_test.dart index f74431c5cee7..f19215c89b9e 100644 --- a/script/tool/test/list_command_test.dart +++ b/script/tool/test/list_command_test.dart @@ -29,17 +29,17 @@ void main() { runner.addCommand(command); }); - test('lists plugins', () async { - createFakePlugin('plugin1', packagesDir); + test('lists top-level packages', () async { + createFakePackage('package1', packagesDir); createFakePlugin('plugin2', packagesDir); final List plugins = - await runCapturingPrint(runner, ['list', '--type=plugin']); + await runCapturingPrint(runner, ['list', '--type=package']); expect( plugins, orderedEquals([ - '/packages/plugin1', + '/packages/package1', '/packages/plugin2', ]), ); @@ -64,20 +64,20 @@ void main() { ); }); - test('lists packages', () async { - createFakePlugin('plugin1', packagesDir); + test('lists packages and subpackages', () async { + createFakePackage('package1', packagesDir); createFakePlugin('plugin2', packagesDir, examples: ['example1', 'example2']); createFakePlugin('plugin3', packagesDir, examples: []); - final List packages = - await runCapturingPrint(runner, ['list', '--type=package']); + final List packages = await runCapturingPrint( + runner, ['list', '--type=package-or-subpackage']); expect( packages, unorderedEquals([ - '/packages/plugin1', - '/packages/plugin1/example', + '/packages/package1', + '/packages/package1/example', '/packages/plugin2', '/packages/plugin2/example/example1', '/packages/plugin2/example/example2', diff --git a/script/tool/test/make_deps_path_based_command_test.dart b/script/tool/test/make_deps_path_based_command_test.dart index 33d6be261e87..e846a63fc68e 100644 --- a/script/tool/test/make_deps_path_based_command_test.dart +++ b/script/tool/test/make_deps_path_based_command_test.dart @@ -11,7 +11,7 @@ import 'package:flutter_plugin_tools/src/make_deps_path_based_command.dart'; import 'package:mockito/mockito.dart'; import 'package:test/test.dart'; -import 'common/plugin_command_test.mocks.dart'; +import 'common/package_command_test.mocks.dart'; import 'mocks.dart'; import 'util.dart'; @@ -49,7 +49,7 @@ void main() { /// Adds dummy 'dependencies:' entries for each package in [dependencies] /// to [package]. - void _addDependencies( + void addDependencies( RepositoryPackage package, Iterable dependencies) { final List lines = package.pubspecFile.readAsLinesSync(); final int dependenciesStartIndex = lines.indexOf('dependencies:'); @@ -62,7 +62,7 @@ void main() { /// Adds a 'dev_dependencies:' section with entries for each package in /// [dependencies] to [package]. - void _addDevDependenciesSection( + void addDevDependenciesSection( RepositoryPackage package, Iterable devDependencies) { final String originalContent = package.pubspecFile.readAsStringSync(); package.pubspecFile.writeAsStringSync(''' @@ -77,7 +77,7 @@ ${devDependencies.map((String dep) => ' $dep: ^1.0.0').join('\n')} createFakePackage('foo', packagesDir, isFlutter: true); final RepositoryPackage packageBar = createFakePackage('bar', packagesDir, isFlutter: true); - _addDependencies(packageBar, ['foo']); + addDependencies(packageBar, ['foo']); final String originalPubspecContents = packageBar.pubspecFile.readAsStringSync(); @@ -105,16 +105,16 @@ ${devDependencies.map((String dep) => ' $dep: ^1.0.0').join('\n')} final RepositoryPackage pluginAppFacing = createFakePlugin('bar', pluginGroup); - _addDependencies(simplePackage, [ + addDependencies(simplePackage, [ 'bar', 'bar_android', 'bar_platform_interface', ]); - _addDependencies(pluginAppFacing, [ + addDependencies(pluginAppFacing, [ 'bar_platform_interface', 'bar_android', ]); - _addDependencies(pluginImplementation, [ + addDependencies(pluginImplementation, [ 'bar_platform_interface', ]); @@ -160,7 +160,7 @@ ${devDependencies.map((String dep) => ' $dep: ^1.0.0').join('\n')} final RepositoryPackage builderPackage = createFakePackage('foo_builder', packagesDir); - _addDevDependenciesSection(builderPackage, [ + addDevDependenciesSection(builderPackage, [ 'foo', ]); @@ -184,6 +184,42 @@ ${devDependencies.map((String dep) => ' $dep: ^1.0.0').join('\n')} ])); }); + test( + 'alphabetizes overrides from different sectinos to avoid lint warnings in analysis', + () async { + createFakePackage('a', packagesDir); + createFakePackage('b', packagesDir); + createFakePackage('c', packagesDir); + final RepositoryPackage targetPackage = + createFakePackage('target', packagesDir); + + addDependencies(targetPackage, ['a', 'c']); + addDevDependenciesSection(targetPackage, ['b']); + + final List output = await runCapturingPrint(runner, + ['make-deps-path-based', '--target-dependencies=c,a,b']); + + expect( + output, + containsAllInOrder([ + 'Rewriting references to: c, a, b...', + ' Modified packages/target/pubspec.yaml', + ])); + + expect( + targetPackage.pubspecFile.readAsLinesSync(), + containsAllInOrder([ + '# FOR TESTING ONLY. DO NOT MERGE.', + 'dependency_overrides:', + ' a:', + ' path: ../a', + ' b:', + ' path: ../b', + ' c:', + ' path: ../c', + ])); + }); + // This test case ensures that running CI using this command on an interim // PR that itself used this command won't fail on the rewrite step. test('running a second time no-ops without failing', () async { @@ -197,16 +233,16 @@ ${devDependencies.map((String dep) => ' $dep: ^1.0.0').join('\n')} final RepositoryPackage pluginAppFacing = createFakePlugin('bar', pluginGroup); - _addDependencies(simplePackage, [ + addDependencies(simplePackage, [ 'bar', 'bar_android', 'bar_platform_interface', ]); - _addDependencies(pluginAppFacing, [ + addDependencies(pluginAppFacing, [ 'bar_platform_interface', 'bar_android', ]); - _addDependencies(pluginImplementation, [ + addDependencies(pluginImplementation, [ 'bar_platform_interface', ]); diff --git a/script/tool/test/native_test_command_test.dart b/script/tool/test/native_test_command_test.dart index d420184b6125..f24d014bbfea 100644 --- a/script/tool/test/native_test_command_test.dart +++ b/script/tool/test/native_test_command_test.dart @@ -68,7 +68,7 @@ void _createFakeCMakeCache(RepositoryPackage plugin, Platform platform) { // TODO(stuartmorgan): Rework these tests to use a mock Xcode instead of // doing all the process mocking and validation. void main() { - const String _kDestination = '--ios-destination'; + const String kDestination = '--ios-destination'; group('test native_test_command on Posix', () { late FileSystem fileSystem; @@ -95,7 +95,7 @@ void main() { // Returns a MockProcess to provide for "xcrun xcodebuild -list" for a // project that contains [targets]. - MockProcess _getMockXcodebuildListProcess(List targets) { + MockProcess getMockXcodebuildListProcess(List targets) { final Map projects = { 'project': { 'targets': targets, @@ -106,7 +106,7 @@ void main() { // Returns the ProcessCall to expect for checking the targets present in // the [package]'s [platform]/Runner.xcodeproj. - ProcessCall _getTargetCheckCall(Directory package, String platform) { + ProcessCall getTargetCheckCall(Directory package, String platform) { return ProcessCall( 'xcrun', [ @@ -124,7 +124,7 @@ void main() { // Returns the ProcessCall to expect for running the tests in the // workspace [platform]/Runner.xcworkspace, with the given extra flags. - ProcessCall _getRunTestCall( + ProcessCall getRunTestCall( Directory package, String platform, { String? destination, @@ -150,7 +150,7 @@ void main() { // Returns the ProcessCall to expect for build the Linux unit tests for the // given plugin. - ProcessCall _getLinuxBuildCall(RepositoryPackage plugin) { + ProcessCall getLinuxBuildCall(RepositoryPackage plugin) { return ProcessCall( 'cmake', [ @@ -212,7 +212,7 @@ void main() { final Directory pluginExampleDirectory = getExampleDir(plugin); processRunner.mockProcessesForExecutable['xcrun'] = [ - _getMockXcodebuildListProcess(['RunnerTests', 'RunnerUITests']), + getMockXcodebuildListProcess(['RunnerTests', 'RunnerUITests']), // Exit code 66 from testing indicates no tests. MockProcess(exitCode: 66), ]; @@ -229,8 +229,8 @@ void main() { expect( processRunner.recordedCalls, orderedEquals([ - _getTargetCheckCall(pluginExampleDirectory, 'macos'), - _getRunTestCall(pluginExampleDirectory, 'macos', + getTargetCheckCall(pluginExampleDirectory, 'macos'), + getRunTestCall(pluginExampleDirectory, 'macos', extraFlags: ['-only-testing:RunnerUITests']), ])); }); @@ -243,7 +243,7 @@ void main() { }); final List output = await runCapturingPrint(runner, - ['native-test', '--ios', _kDestination, 'foo_destination']); + ['native-test', '--ios', kDestination, 'foo_destination']); expect( output, containsAllInOrder([ @@ -260,7 +260,7 @@ void main() { }); final List output = await runCapturingPrint(runner, - ['native-test', '--ios', _kDestination, 'foo_destination']); + ['native-test', '--ios', kDestination, 'foo_destination']); expect( output, containsAllInOrder([ @@ -279,14 +279,14 @@ void main() { final Directory pluginExampleDirectory = getExampleDir(plugin); processRunner.mockProcessesForExecutable['xcrun'] = [ - _getMockXcodebuildListProcess( + getMockXcodebuildListProcess( ['RunnerTests', 'RunnerUITests']), ]; final List output = await runCapturingPrint(runner, [ 'native-test', '--ios', - _kDestination, + kDestination, 'foo_destination', ]); @@ -300,8 +300,8 @@ void main() { expect( processRunner.recordedCalls, orderedEquals([ - _getTargetCheckCall(pluginExampleDirectory, 'ios'), - _getRunTestCall(pluginExampleDirectory, 'ios', + getTargetCheckCall(pluginExampleDirectory, 'ios'), + getRunTestCall(pluginExampleDirectory, 'ios', destination: 'foo_destination'), ])); }); @@ -316,7 +316,7 @@ void main() { processRunner.mockProcessesForExecutable['xcrun'] = [ MockProcess(stdout: jsonEncode(_kDeviceListMap)), // simctl - _getMockXcodebuildListProcess( + getMockXcodebuildListProcess( ['RunnerTests', 'RunnerUITests']), ]; @@ -336,8 +336,8 @@ void main() { '--json', ], null), - _getTargetCheckCall(pluginExampleDirectory, 'ios'), - _getRunTestCall(pluginExampleDirectory, 'ios', + getTargetCheckCall(pluginExampleDirectory, 'ios'), + getRunTestCall(pluginExampleDirectory, 'ios', destination: 'id=1E76A0FD-38AC-4537-A989-EA639D7D012A'), ])); }); @@ -386,7 +386,7 @@ void main() { final Directory pluginExampleDirectory = getExampleDir(plugin); processRunner.mockProcessesForExecutable['xcrun'] = [ - _getMockXcodebuildListProcess( + getMockXcodebuildListProcess( ['RunnerTests', 'RunnerUITests']), ]; @@ -403,8 +403,8 @@ void main() { expect( processRunner.recordedCalls, orderedEquals([ - _getTargetCheckCall(pluginExampleDirectory, 'macos'), - _getRunTestCall(pluginExampleDirectory, 'macos'), + getTargetCheckCall(pluginExampleDirectory, 'macos'), + getRunTestCall(pluginExampleDirectory, 'macos'), ])); }); }); @@ -918,7 +918,7 @@ void main() { expect( processRunner.recordedCalls, orderedEquals([ - _getLinuxBuildCall(plugin), + getLinuxBuildCall(plugin), ProcessCall(testBinary.path, const [], null), ])); }); @@ -958,7 +958,7 @@ void main() { expect( processRunner.recordedCalls, orderedEquals([ - _getLinuxBuildCall(plugin), + getLinuxBuildCall(plugin), ProcessCall(releaseTestBinary.path, const [], null), ])); }); @@ -1017,7 +1017,7 @@ void main() { expect( processRunner.recordedCalls, orderedEquals([ - _getLinuxBuildCall(plugin), + getLinuxBuildCall(plugin), ])); }); @@ -1058,7 +1058,7 @@ void main() { expect( processRunner.recordedCalls, orderedEquals([ - _getLinuxBuildCall(plugin), + getLinuxBuildCall(plugin), ProcessCall(testBinary.path, const [], null), ])); }); @@ -1102,7 +1102,7 @@ void main() { final Directory pluginExampleDirectory = getExampleDir(plugin); processRunner.mockProcessesForExecutable['xcrun'] = [ - _getMockXcodebuildListProcess( + getMockXcodebuildListProcess( ['RunnerTests', 'RunnerUITests']), ]; @@ -1121,8 +1121,8 @@ void main() { expect( processRunner.recordedCalls, orderedEquals([ - _getTargetCheckCall(pluginExampleDirectory, 'macos'), - _getRunTestCall(pluginExampleDirectory, 'macos', + getTargetCheckCall(pluginExampleDirectory, 'macos'), + getRunTestCall(pluginExampleDirectory, 'macos', extraFlags: ['-only-testing:RunnerTests']), ])); }); @@ -1137,7 +1137,7 @@ void main() { final Directory pluginExampleDirectory = getExampleDir(plugin1); processRunner.mockProcessesForExecutable['xcrun'] = [ - _getMockXcodebuildListProcess( + getMockXcodebuildListProcess( ['RunnerTests', 'RunnerUITests']), ]; @@ -1156,8 +1156,8 @@ void main() { expect( processRunner.recordedCalls, orderedEquals([ - _getTargetCheckCall(pluginExampleDirectory, 'macos'), - _getRunTestCall(pluginExampleDirectory, 'macos', + getTargetCheckCall(pluginExampleDirectory, 'macos'), + getRunTestCall(pluginExampleDirectory, 'macos', extraFlags: ['-only-testing:RunnerUITests']), ])); }); @@ -1173,7 +1173,7 @@ void main() { // Simulate a project with unit tests but no integration tests... processRunner.mockProcessesForExecutable['xcrun'] = [ - _getMockXcodebuildListProcess(['RunnerTests']), + getMockXcodebuildListProcess(['RunnerTests']), ]; // ... then try to run only integration tests. @@ -1193,7 +1193,7 @@ void main() { expect( processRunner.recordedCalls, orderedEquals([ - _getTargetCheckCall(pluginExampleDirectory, 'macos'), + getTargetCheckCall(pluginExampleDirectory, 'macos'), ])); }); @@ -1207,7 +1207,7 @@ void main() { final Directory pluginExampleDirectory = getExampleDir(plugin1); processRunner.mockProcessesForExecutable['xcrun'] = [ - _getMockXcodebuildListProcess(['RunnerUITests']), + getMockXcodebuildListProcess(['RunnerUITests']), ]; Error? commandError; @@ -1232,7 +1232,7 @@ void main() { expect( processRunner.recordedCalls, orderedEquals([ - _getTargetCheckCall(pluginExampleDirectory, 'macos'), + getTargetCheckCall(pluginExampleDirectory, 'macos'), ])); }); @@ -1269,7 +1269,7 @@ void main() { expect( processRunner.recordedCalls, orderedEquals([ - _getTargetCheckCall(pluginExampleDirectory, 'macos'), + getTargetCheckCall(pluginExampleDirectory, 'macos'), ])); }); }); @@ -1295,10 +1295,10 @@ void main() { pluginExampleDirectory.childDirectory('android'); processRunner.mockProcessesForExecutable['xcrun'] = [ - _getMockXcodebuildListProcess( + getMockXcodebuildListProcess( ['RunnerTests', 'RunnerUITests']), // iOS list MockProcess(), // iOS run - _getMockXcodebuildListProcess( + getMockXcodebuildListProcess( ['RunnerTests', 'RunnerUITests']), // macOS list MockProcess(), // macOS run ]; @@ -1308,7 +1308,7 @@ void main() { '--android', '--ios', '--macos', - _kDestination, + kDestination, 'foo_destination', ]); @@ -1325,11 +1325,11 @@ void main() { orderedEquals([ ProcessCall(androidFolder.childFile('gradlew').path, const ['testDebugUnitTest'], androidFolder.path), - _getTargetCheckCall(pluginExampleDirectory, 'ios'), - _getRunTestCall(pluginExampleDirectory, 'ios', + getTargetCheckCall(pluginExampleDirectory, 'ios'), + getRunTestCall(pluginExampleDirectory, 'ios', destination: 'foo_destination'), - _getTargetCheckCall(pluginExampleDirectory, 'macos'), - _getRunTestCall(pluginExampleDirectory, 'macos'), + getTargetCheckCall(pluginExampleDirectory, 'macos'), + getRunTestCall(pluginExampleDirectory, 'macos'), ])); }); @@ -1342,7 +1342,7 @@ void main() { final Directory pluginExampleDirectory = getExampleDir(plugin); processRunner.mockProcessesForExecutable['xcrun'] = [ - _getMockXcodebuildListProcess( + getMockXcodebuildListProcess( ['RunnerTests', 'RunnerUITests']), ]; @@ -1350,7 +1350,7 @@ void main() { 'native-test', '--ios', '--macos', - _kDestination, + kDestination, 'foo_destination', ]); @@ -1364,8 +1364,8 @@ void main() { expect( processRunner.recordedCalls, orderedEquals([ - _getTargetCheckCall(pluginExampleDirectory, 'macos'), - _getRunTestCall(pluginExampleDirectory, 'macos'), + getTargetCheckCall(pluginExampleDirectory, 'macos'), + getRunTestCall(pluginExampleDirectory, 'macos'), ])); }); @@ -1378,7 +1378,7 @@ void main() { final Directory pluginExampleDirectory = getExampleDir(plugin); processRunner.mockProcessesForExecutable['xcrun'] = [ - _getMockXcodebuildListProcess( + getMockXcodebuildListProcess( ['RunnerTests', 'RunnerUITests']), ]; @@ -1386,7 +1386,7 @@ void main() { 'native-test', '--ios', '--macos', - _kDestination, + kDestination, 'foo_destination', ]); @@ -1400,8 +1400,8 @@ void main() { expect( processRunner.recordedCalls, orderedEquals([ - _getTargetCheckCall(pluginExampleDirectory, 'ios'), - _getRunTestCall(pluginExampleDirectory, 'ios', + getTargetCheckCall(pluginExampleDirectory, 'ios'), + getRunTestCall(pluginExampleDirectory, 'ios', destination: 'foo_destination'), ])); }); @@ -1415,7 +1415,7 @@ void main() { '--ios', '--macos', '--windows', - _kDestination, + kDestination, 'foo_destination', ]); @@ -1447,7 +1447,7 @@ void main() { 'native-test', '--macos', '--windows', - _kDestination, + kDestination, 'foo_destination', ]); @@ -1477,7 +1477,7 @@ void main() { ); processRunner.mockProcessesForExecutable['xcrun'] = [ - _getMockXcodebuildListProcess( + getMockXcodebuildListProcess( ['RunnerTests', 'RunnerUITests']), ]; @@ -1598,7 +1598,7 @@ void main() { // Returns the ProcessCall to expect for build the Windows unit tests for // the given plugin. - ProcessCall _getWindowsBuildCall(RepositoryPackage plugin) { + ProcessCall getWindowsBuildCall(RepositoryPackage plugin) { return ProcessCall( _fakeCmakeCommand, [ @@ -1647,7 +1647,7 @@ void main() { expect( processRunner.recordedCalls, orderedEquals([ - _getWindowsBuildCall(plugin), + getWindowsBuildCall(plugin), ProcessCall(testBinary.path, const [], null), ])); }); @@ -1687,7 +1687,7 @@ void main() { expect( processRunner.recordedCalls, orderedEquals([ - _getWindowsBuildCall(plugin), + getWindowsBuildCall(plugin), ProcessCall(debugTestBinary.path, const [], null), ])); }); @@ -1746,7 +1746,7 @@ void main() { expect( processRunner.recordedCalls, orderedEquals([ - _getWindowsBuildCall(plugin), + getWindowsBuildCall(plugin), ])); }); @@ -1787,7 +1787,7 @@ void main() { expect( processRunner.recordedCalls, orderedEquals([ - _getWindowsBuildCall(plugin), + getWindowsBuildCall(plugin), ProcessCall(testBinary.path, const [], null), ])); }); diff --git a/script/tool/test/publish_plugin_command_test.dart b/script/tool/test/publish_command_test.dart similarity index 94% rename from script/tool/test/publish_plugin_command_test.dart rename to script/tool/test/publish_command_test.dart index f3be3b48b1f1..da5f9c871f05 100644 --- a/script/tool/test/publish_plugin_command_test.dart +++ b/script/tool/test/publish_command_test.dart @@ -10,14 +10,14 @@ import 'package:args/command_runner.dart'; import 'package:file/file.dart'; import 'package:file/memory.dart'; import 'package:flutter_plugin_tools/src/common/core.dart'; -import 'package:flutter_plugin_tools/src/publish_plugin_command.dart'; +import 'package:flutter_plugin_tools/src/publish_command.dart'; import 'package:http/http.dart' as http; import 'package:http/testing.dart'; import 'package:mockito/mockito.dart'; import 'package:platform/platform.dart'; import 'package:test/test.dart'; -import 'common/plugin_command_test.mocks.dart'; +import 'common/package_command_test.mocks.dart'; import 'mocks.dart'; import 'util.dart'; @@ -33,8 +33,8 @@ void main() { // Map of package name to mock response. late Map> mockHttpResponses; - void _createMockCredentialFile() { - final String credentialPath = PublishPluginCommand.getCredentialPath(); + void createMockCredentialFile() { + final String credentialPath = PublishCommand.getCredentialPath(); fileSystem.file(credentialPath) ..createSync(recursive: true) ..writeAsStringSync('some credential'); @@ -72,7 +72,7 @@ void main() { mockStdin = MockStdin(); commandRunner = CommandRunner('tester', '') - ..addCommand(PublishPluginCommand( + ..addCommand(PublishCommand( packagesDir, processRunner: processRunner, stdinput: mockStdin, @@ -93,7 +93,7 @@ void main() { Error? commandError; final List output = await runCapturingPrint(commandRunner, [ - 'publish-plugin', + 'publish', '--packages=foo', ], errorHandler: (Error e) { commandError = e; @@ -122,7 +122,7 @@ void main() { Error? commandError; final List output = await runCapturingPrint( - commandRunner, ['publish-plugin', '--packages=foo'], + commandRunner, ['publish', '--packages=foo'], errorHandler: (Error e) { commandError = e; }); @@ -154,8 +154,8 @@ void main() { stderrEncoding: utf8), // pub publish for plugin1 ]; - final List output = await runCapturingPrint(commandRunner, - ['publish-plugin', '--packages=plugin1,plugin2']); + final List output = await runCapturingPrint( + commandRunner, ['publish', '--packages=plugin1,plugin2']); expect( output, @@ -176,7 +176,7 @@ void main() { mockStdin.mockUserInputs.add(utf8.encode('user input')); await runCapturingPrint( - commandRunner, ['publish-plugin', '--packages=foo']); + commandRunner, ['publish', '--packages=foo']); expect(processRunner.mockPublishProcess.stdinMock.lines, contains('user input')); @@ -187,7 +187,7 @@ void main() { createFakePlugin('foo', packagesDir, examples: []); await runCapturingPrint(commandRunner, [ - 'publish-plugin', + 'publish', '--packages=foo', '--pub-publish-flags', '--dry-run,--server=bar' @@ -204,12 +204,12 @@ void main() { test( '--skip-confirmation flag automatically adds --force to --pub-publish-flags', () async { - _createMockCredentialFile(); + createMockCredentialFile(); final RepositoryPackage plugin = createFakePlugin('foo', packagesDir, examples: []); await runCapturingPrint(commandRunner, [ - 'publish-plugin', + 'publish', '--packages=foo', '--skip-confirmation', '--pub-publish-flags', @@ -225,14 +225,14 @@ void main() { }); test('--force is only added once, regardless of plugin count', () async { - _createMockCredentialFile(); + createMockCredentialFile(); final RepositoryPackage plugin1 = createFakePlugin('plugin_a', packagesDir, examples: []); final RepositoryPackage plugin2 = createFakePlugin('plugin_b', packagesDir, examples: []); await runCapturingPrint(commandRunner, [ - 'publish-plugin', + 'publish', '--packages=plugin_a,plugin_b', '--skip-confirmation', '--pub-publish-flags', @@ -263,7 +263,7 @@ void main() { Error? commandError; final List output = await runCapturingPrint(commandRunner, [ - 'publish-plugin', + 'publish', '--packages=foo', ], errorHandler: (Error e) { commandError = e; @@ -283,7 +283,7 @@ void main() { final List output = await runCapturingPrint(commandRunner, [ - 'publish-plugin', + 'publish', '--packages=foo', '--dry-run', ]); @@ -310,7 +310,7 @@ void main() { final List output = await runCapturingPrint(commandRunner, [ - 'publish-plugin', + 'publish', '--packages=$packageName', ]); @@ -330,7 +330,7 @@ void main() { test('with the version and name from the pubspec.yaml', () async { createFakePlugin('foo', packagesDir, examples: []); await runCapturingPrint(commandRunner, [ - 'publish-plugin', + 'publish', '--packages=foo', ]); @@ -348,7 +348,7 @@ void main() { Error? commandError; final List output = await runCapturingPrint(commandRunner, [ - 'publish-plugin', + 'publish', '--packages=foo', ], errorHandler: (Error e) { commandError = e; @@ -375,7 +375,7 @@ void main() { final List output = await runCapturingPrint(commandRunner, [ - 'publish-plugin', + 'publish', '--packages=foo', ]); @@ -393,12 +393,12 @@ void main() { test('does not ask for user input if the --skip-confirmation flag is on', () async { - _createMockCredentialFile(); + createMockCredentialFile(); createFakePlugin('foo', packagesDir, examples: []); final List output = await runCapturingPrint(commandRunner, [ - 'publish-plugin', + 'publish', '--skip-confirmation', '--packages=foo', ]); @@ -420,8 +420,8 @@ void main() { mockStdin.readLineOutput = 'y'; - final List output = await runCapturingPrint(commandRunner, - ['publish-plugin', '--packages=foo', '--dry-run']); + final List output = await runCapturingPrint( + commandRunner, ['publish', '--packages=foo', '--dry-run']); expect( processRunner.recordedCalls @@ -445,7 +445,7 @@ void main() { final List output = await runCapturingPrint(commandRunner, [ - 'publish-plugin', + 'publish', '--packages=foo', '--remote', 'origin', @@ -491,7 +491,7 @@ void main() { mockStdin.readLineOutput = 'y'; final List output = await runCapturingPrint(commandRunner, - ['publish-plugin', '--all-changed', '--base-sha=HEAD~']); + ['publish', '--all-changed', '--base-sha=HEAD~']); expect( output, @@ -553,7 +553,7 @@ void main() { mockStdin.readLineOutput = 'y'; final List output = await runCapturingPrint(commandRunner, - ['publish-plugin', '--all-changed', '--base-sha=HEAD~']); + ['publish', '--all-changed', '--base-sha=HEAD~']); expect( output, @@ -598,7 +598,7 @@ void main() { final List output = await runCapturingPrint( commandRunner, [ - 'publish-plugin', + 'publish', '--all-changed', '--base-sha=HEAD~', '--dry-run' @@ -651,7 +651,7 @@ void main() { mockStdin.readLineOutput = 'y'; final List output2 = await runCapturingPrint(commandRunner, - ['publish-plugin', '--all-changed', '--base-sha=HEAD~']); + ['publish', '--all-changed', '--base-sha=HEAD~']); expect( output2, containsAllInOrder([ @@ -700,7 +700,7 @@ void main() { mockStdin.readLineOutput = 'y'; final List output2 = await runCapturingPrint(commandRunner, - ['publish-plugin', '--all-changed', '--base-sha=HEAD~']); + ['publish', '--all-changed', '--base-sha=HEAD~']); expect( output2, containsAllInOrder([ @@ -749,7 +749,7 @@ void main() { ]; final List output = await runCapturingPrint(commandRunner, - ['publish-plugin', '--all-changed', '--base-sha=HEAD~']); + ['publish', '--all-changed', '--base-sha=HEAD~']); expect( output, @@ -795,7 +795,7 @@ void main() { Error? commandError; final List output = await runCapturingPrint(commandRunner, - ['publish-plugin', '--all-changed', '--base-sha=HEAD~'], + ['publish', '--all-changed', '--base-sha=HEAD~'], errorHandler: (Error e) { commandError = e; }); @@ -830,7 +830,7 @@ void main() { ]; final List output = await runCapturingPrint(commandRunner, - ['publish-plugin', '--all-changed', '--base-sha=HEAD~']); + ['publish', '--all-changed', '--base-sha=HEAD~']); expect(output, containsAllInOrder(['Ran for 0 package(s)'])); expect( @@ -852,7 +852,7 @@ void main() { ]; final List output = await runCapturingPrint(commandRunner, - ['publish-plugin', '--all-changed', '--base-sha=HEAD~']); + ['publish', '--all-changed', '--base-sha=HEAD~']); expect( output, diff --git a/script/tool/test/remove_dev_dependencies_test.dart b/script/tool/test/remove_dev_dependencies_test.dart index 6b212870c53b..776cbf197838 100644 --- a/script/tool/test/remove_dev_dependencies_test.dart +++ b/script/tool/test/remove_dev_dependencies_test.dart @@ -27,7 +27,7 @@ void main() { runner.addCommand(command); }); - void _addToPubspec(RepositoryPackage package, String addition) { + void addToPubspec(RepositoryPackage package, String addition) { final String originalContent = package.pubspecFile.readAsStringSync(); package.pubspecFile.writeAsStringSync(''' $originalContent @@ -53,7 +53,7 @@ $addition final RepositoryPackage package = createFakePackage('a_package', packagesDir, version: '1.0.0'); - _addToPubspec(package, ''' + addToPubspec(package, ''' dev_dependencies: some_dependency: ^2.1.8 another_dependency: ^1.0.0 @@ -79,7 +79,7 @@ dev_dependencies: createFakePackage('a_package', packagesDir, version: '1.0.0'); final RepositoryPackage example = package.getExamples().first; - _addToPubspec(example, ''' + addToPubspec(example, ''' dev_dependencies: some_dependency: ^2.1.8 another_dependency: ^1.0.0 diff --git a/script/tool/test/update_excerpts_command_test.dart b/script/tool/test/update_excerpts_command_test.dart index 34c85cc172fe..79f53d8779bb 100644 --- a/script/tool/test/update_excerpts_command_test.dart +++ b/script/tool/test/update_excerpts_command_test.dart @@ -12,7 +12,7 @@ import 'package:flutter_plugin_tools/src/update_excerpts_command.dart'; import 'package:mockito/mockito.dart'; import 'package:test/test.dart'; -import 'common/plugin_command_test.mocks.dart'; +import 'common/package_command_test.mocks.dart'; import 'mocks.dart'; import 'util.dart'; diff --git a/script/tool/test/update_release_info_command_test.dart b/script/tool/test/update_release_info_command_test.dart index 7e7ff54d5947..8cd2e9591e70 100644 --- a/script/tool/test/update_release_info_command_test.dart +++ b/script/tool/test/update_release_info_command_test.dart @@ -12,7 +12,7 @@ import 'package:flutter_plugin_tools/src/update_release_info_command.dart'; import 'package:mockito/mockito.dart'; import 'package:test/test.dart'; -import 'common/plugin_command_test.mocks.dart'; +import 'common/package_command_test.mocks.dart'; import 'mocks.dart'; import 'util.dart'; diff --git a/script/tool/test/version_check_command_test.dart b/script/tool/test/version_check_command_test.dart index 0e94712e9ef0..d485d81ceaf2 100644 --- a/script/tool/test/version_check_command_test.dart +++ b/script/tool/test/version_check_command_test.dart @@ -16,7 +16,7 @@ import 'package:mockito/mockito.dart'; import 'package:pub_semver/pub_semver.dart'; import 'package:test/test.dart'; -import 'common/plugin_command_test.mocks.dart'; +import 'common/package_command_test.mocks.dart'; import 'mocks.dart'; import 'util.dart'; @@ -681,8 +681,7 @@ void main() { }); group('missing change detection', () { - Future> _runWithMissingChangeDetection( - List extraArgs, + Future> runWithMissingChangeDetection(List extraArgs, {void Function(Error error)? errorHandler}) async { return runCapturingPrint( runner, @@ -712,7 +711,7 @@ void main() { ]; final List output = - await _runWithMissingChangeDetection([]); + await runWithMissingChangeDetection([]); expect( output, @@ -743,7 +742,7 @@ packages/plugin/lib/plugin.dart ]; Error? commandError; - final List output = await _runWithMissingChangeDetection( + final List output = await runWithMissingChangeDetection( [], errorHandler: (Error e) { commandError = e; }); @@ -780,7 +779,7 @@ packages/plugin/pubspec.yaml ]; final List output = - await _runWithMissingChangeDetection([]); + await runWithMissingChangeDetection([]); expect( output, @@ -810,7 +809,7 @@ tool/plugin/lib/plugin.dart ]; final List output = - await _runWithMissingChangeDetection([]); + await runWithMissingChangeDetection([]); expect( output, @@ -843,7 +842,7 @@ packages/plugin/CHANGELOG.md ]; final List output = - await _runWithMissingChangeDetection([]); + await runWithMissingChangeDetection([]); expect( output, @@ -874,7 +873,7 @@ packages/plugin/pubspec.yaml ]; final List output = - await _runWithMissingChangeDetection([ + await runWithMissingChangeDetection([ '--pr-labels=some label,override: no versioning needed,another-label' ]); @@ -906,7 +905,7 @@ packages/plugin/example/lib/foo.dart ]; Error? commandError; - final List output = await _runWithMissingChangeDetection( + final List output = await runWithMissingChangeDetection( [], errorHandler: (Error e) { commandError = e; }); @@ -942,7 +941,7 @@ packages/plugin/CHANGELOG.md ]; final List output = - await _runWithMissingChangeDetection([]); + await runWithMissingChangeDetection([]); expect( output, @@ -973,7 +972,7 @@ packages/another_plugin/CHANGELOG.md ]; Error? commandError; - final List output = await _runWithMissingChangeDetection( + final List output = await runWithMissingChangeDetection( [], errorHandler: (Error e) { commandError = e; }); @@ -1006,7 +1005,7 @@ packages/plugin/example/lib/foo.dart ]; final List output = - await _runWithMissingChangeDetection([ + await runWithMissingChangeDetection([ '--pr-labels=some label,override: no changelog needed,another-label' ]); @@ -1050,7 +1049,7 @@ packages/plugin/android/build.gradle ]; final List output = - await _runWithMissingChangeDetection([]); + await runWithMissingChangeDetection([]); expect( output, @@ -1082,7 +1081,7 @@ packages/plugin/run_tests.sh ]; final List output = - await _runWithMissingChangeDetection([]); + await runWithMissingChangeDetection([]); expect( output,