From 894e314c349ec0237ac24ca146852e3c0ae64aa3 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Thu, 15 Aug 2024 12:06:39 -0400 Subject: [PATCH 01/15] start of contributing doc --- .../interactive_media_ads/CONTRIBUTING.md | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 packages/interactive_media_ads/CONTRIBUTING.md diff --git a/packages/interactive_media_ads/CONTRIBUTING.md b/packages/interactive_media_ads/CONTRIBUTING.md new file mode 100644 index 00000000000..ce416acae97 --- /dev/null +++ b/packages/interactive_media_ads/CONTRIBUTING.md @@ -0,0 +1,51 @@ +# Contributing to `interactive_media_ads` + +## Package Structure + +The structure of this plugin is similar to a [federated plugin](https://docs.flutter.dev/packages-and-plugins/developing-packages#federated-plugins), +except the code for each package (platform interface, platform implementations, and app-facing +interface) are maintained in this one plugin. The sections below will overview how this plugin +implements each portion. + +If you are familiar with [changing federated plugin](https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins) +in the `flutter/packages`, the process is similar except that all changes are made in this plugin. + +### Platform Interface + +Code location: `lib/src/platform_interface`. + +Should note that the main philosophy is to make testing easy and to minimize breaking changes. + + + +This portion declares an interface that each platform must implement to support the +app-facing interface. The central [InteractiveMediaAdsPlatform](lib/src/platform_interface/interactive_media_ads_platform.dart) +class. + +Classes can be split into two kinds: + +* Classes instantiated by the central platform class +* Classes that are not instantiated by the central classes + * These are classes that are returned by the SDK (e.g. `AdsManager`). Are data classes. + * + +### Platform Implementations + +Code found in: +* Android: `lib/src/android` +* iOS: `lib/srcios` + +This uses `pigeon` to wrap. + +### App-facing Interface + +Code location: `lib/src`. + +Philosophy to create an api that follows the structure of the underlying SDKs + +## Recommended Process for Adding a New Feature + +* Create an issue that includes the specific native classes/methods that this feature requires on +each platform. + +* provide where this could be included in the platform interface and app-facing interface \ No newline at end of file From fa0b3113166a6a2e5e618e1c92785a49e94beb25 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Tue, 20 Aug 2024 13:14:08 -0400 Subject: [PATCH 02/15] more work towards it --- .../interactive_media_ads/CONTRIBUTING.md | 182 ++++++++++++++++-- 1 file changed, 163 insertions(+), 19 deletions(-) diff --git a/packages/interactive_media_ads/CONTRIBUTING.md b/packages/interactive_media_ads/CONTRIBUTING.md index ce416acae97..b3de563ff36 100644 --- a/packages/interactive_media_ads/CONTRIBUTING.md +++ b/packages/interactive_media_ads/CONTRIBUTING.md @@ -4,44 +4,188 @@ The structure of this plugin is similar to a [federated plugin](https://docs.flutter.dev/packages-and-plugins/developing-packages#federated-plugins), except the code for each package (platform interface, platform implementations, and app-facing -interface) are maintained in this one plugin. The sections below will overview how this plugin -implements each portion. +interface) are maintained in this one plugin. The sections below will provide overview how this +plugin implements each portion. If you are familiar with [changing federated plugin](https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins) -in the `flutter/packages`, the process is similar except that all changes are made in this plugin. +in the `flutter/packages` repo, the process is similar except that all changes are made in this +plugin. Therefore, it is not necessary to run the script that makes dependencies path based. + +### Quick Overview + +This plugin uses the native IMA SDKs for Android and iOS. The API for the SDK of both platforms are +relatively similar, so this plugin attempts to maintain an interface that is similar to the native +SDKs. + +The app-facing interface uses delegation to interact with the underlying platform implementation. +Therefore the platform interface is similar to the app-facing interfaces with the differences being +explained in the sections below. Many classes will contain a `platform` field that is used to call +methods on the platform implementation: + +```dart +// App-facing class used by apps +class AdsLoader { + AdsLoader.fromPlatform(this.platform); + + final PlatformAdsLoader platform; + + Future requestAds(AdsRequest request) { + return platform.requestAds(request); + } +} + +// Platform interface class implemented by each platform +abstract base class PlatformAdsLoader { + Future requestAds(AdsRequest request); +} +``` + +The `platform` variable should also be used to provide access to platform specific methods or +platform specific creation parameters: + +```dart +final AdsLoader loader = AdsLoader(); +(loader.platform as AndroidAdsLoader).callAndroidSpecificMethod(); +``` + +The other classes/enums included in the app-facing interface are typically exported from the +platform interface. Data classes being a good example of a class that is exported. ### Platform Interface -Code location: `lib/src/platform_interface`. +Code location: `lib/src/platform_interface/`. -Should note that the main philosophy is to make testing easy and to minimize breaking changes. +This declares an interface that each platform must implement to be supported by the +app-facing interface. +The design of the platform interface should prioritize: +* Minimizing the chances of needing a breaking change when adding a new feature. +* Allowing platform implementations to easily add platform specific features. +* Being easy to unit test. +Each platform creates a subclass of the central [InteractiveMediaAdsPlatform](lib/src/platform_interface/interactive_media_ads_platform.dart) +class. A platform implementation is set by setting `InteractiveMediaAdsPlatform.instance` to an +instance of a platform implementation of `InteractiveMediaAdsPlatform`. -This portion declares an interface that each platform must implement to support the -app-facing interface. The central [InteractiveMediaAdsPlatform](lib/src/platform_interface/interactive_media_ads_platform.dart) -class. +### Platform Interface Class Types -Classes can be split into two kinds: +Below are the types of classes in the interface. -* Classes instantiated by the central platform class -* Classes that are not instantiated by the central classes - * These are classes that are returned by the SDK (e.g. `AdsManager`). Are data classes. - * +#### Delegate Platform Class + +These are classes where the app-facing interface needs to delegate handling to the platform +implementation. These classes are prefixed with `Platform`. + +If the corresponding app-facing class can be instantiated by the app (e.g. `AdsLoader`), +the `InteractiveMediaAdsPlatform.instance` field should be used in a factory to instantiate the +correct platform implementation. See `PlatformAdsLoader` as an example. This class should should +also take a creation params class as the only constructor parameter. + +If the corresponding app-facing class can't instantiated by the app (e.g. AdsManager), the class +should only have a single protected constructor. See `PlatformAdsManager`. + +If the corresponding app-facing class needs to be a `Widget` (e.g. `AdDisplayContainer`), this +should follow the same pattern as being instantiable by the app except it should contain a single +method: `Widget build(BuildContext)`. See `PlatformAdDisplayContainer`. + +**Note** + +Every method should contain no more than one parameter. This allows the platform interface and +platform implementation to add new features without requiring a breaking change. + +#### Data Class + +Each data class should be made `@immutable`. ### Platform Implementations -Code found in: -* Android: `lib/src/android` -* iOS: `lib/srcios` +Code location: +* Android: `lib/src/android/` +* iOS: `lib/src/ios/` + +The platform implementations create a subclass of `InteractiveMediaAdsPlatform` and implement the +platform classes that are returned by this. + +#### SDK Wrappers + +The platform implementations use Dart wrappers of their native SDKs. The SDKs are wrapped using +using the `pigeon` package. However, the code that handles generating the wrappers are still in the +process of review and must use a git dependency in the pubspec. + +The wrappers for the SDK of each platform can be updated and modify by changing the pigeon files: +* Android: + * `pigeons/interactive_media_ads_android.dart` + * `android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/InteractiveMediaAdsLibrary.g.kt` +* iOS: + * `pigeons/interactive_media_ads_ios.dart` + * `ios/interactive_media_ads/Sources/interactive_media_ads/InteractiveMediaAdsLibrary.g.swift` + +To update a wrapper for a platform, follow the steps below: + +1. Ensure the project has been built at least once. + +Android: Run `flutter build apk --debug` in `example/`. +iOS: Run `flutter build ios --simulator` in `example/` + +2. Add pigeon to `dev_depdencies` in the `pubspec.yaml` and run `pub upgrade`. + +Android: + +```yaml +pigeon: + git: + url: git@github.com:bparrishMines/packages.git + ref: pigeon_kotlin_split + path: packages/pigeon +``` + +iOS: + +```yaml +pigeon: + git: + url: git@github.com:bparrishMines/packages.git + ref: pigeon_wrapper_swift + path: packages/pigeon +``` + +3. Remove the multiline comments in the pigeon file. + +Android: `pigeons/interactive_media_ads_android.dart` +iOS: `pigeons/interactive_media_ads_ios.dart` + +4. Make changes that match the native SDK. + +Android SDK: https://developers.google.com/interactive-media-ads/docs/sdks/android/client-side/api/reference/com/google/ads/interactivemedia/v3/api/package-summary +iOS SDK: https://developers.google.com/interactive-media-ads/docs/sdks/ios/client-side/reference/Classes + +5. Run the code generator from the terminal. + +Android: `dart run pigeon --input pigeons/interactive_media_ads_android.dart` +iOS: `dart run pigeon --input pigeons/interactive_media_ads_ios.dart` + +6. Update the generated APIs in native code. + +Running the `flutter build` step from step 1 again should provide build errors and indicate what +needs to be done. Alternatively, it can be easier to update native code with the platform's specific +IDE: + +Android: Open `android/` in a separate Android Studio project. +iOS: Open `example/ios/` in Xcode. + +7. Write API tests. + +Assuming a non-static method or constructor was added to the native wrapper, a native test will need +to be added. + +Android: + -This uses `pigeon` to wrap. ### App-facing Interface -Code location: `lib/src`. +Code location: `lib/src/`. -Philosophy to create an api that follows the structure of the underlying SDKs ## Recommended Process for Adding a New Feature From bd064e1badbdaa913c7eec7f14360d07ccc5e30f Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Tue, 20 Aug 2024 14:42:58 -0400 Subject: [PATCH 03/15] improvements --- .../interactive_media_ads/CONTRIBUTING.md | 81 ++++++++++++------- packages/interactive_media_ads/README.md | 4 + packages/interactive_media_ads/pubspec.yaml | 2 +- 3 files changed, 58 insertions(+), 29 deletions(-) diff --git a/packages/interactive_media_ads/CONTRIBUTING.md b/packages/interactive_media_ads/CONTRIBUTING.md index b3de563ff36..9f5aac5869d 100644 --- a/packages/interactive_media_ads/CONTRIBUTING.md +++ b/packages/interactive_media_ads/CONTRIBUTING.md @@ -17,8 +17,8 @@ This plugin uses the native IMA SDKs for Android and iOS. The API for the SDK of relatively similar, so this plugin attempts to maintain an interface that is similar to the native SDKs. -The app-facing interface uses delegation to interact with the underlying platform implementation. -Therefore the platform interface is similar to the app-facing interfaces with the differences being +The app-facing interface uses delegation to interact with the underlying platform implementations. +Therefore, the platform interface is similar to the app-facing interface with the differences being explained in the sections below. Many classes will contain a `platform` field that is used to call methods on the platform implementation: @@ -49,14 +49,14 @@ final AdsLoader loader = AdsLoader(); ``` The other classes/enums included in the app-facing interface are typically exported from the -platform interface. Data classes being a good example of a class that is exported. +platform interface. A Data class being a good example of a class that is exported. ### Platform Interface Code location: `lib/src/platform_interface/`. -This declares an interface that each platform must implement to be supported by the -app-facing interface. +This declares an interface that each platform must implement to be supported by the app-facing +interface. The design of the platform interface should prioritize: * Minimizing the chances of needing a breaking change when adding a new feature. @@ -69,20 +69,20 @@ instance of a platform implementation of `InteractiveMediaAdsPlatform`. ### Platform Interface Class Types -Below are the types of classes in the interface. +Below are some of the types of classes in the interface. #### Delegate Platform Class These are classes where the app-facing interface needs to delegate handling to the platform -implementation. These classes are prefixed with `Platform`. +implementation. These classes are typically prefixed with `Platform`. If the corresponding app-facing class can be instantiated by the app (e.g. `AdsLoader`), the `InteractiveMediaAdsPlatform.instance` field should be used in a factory to instantiate the correct platform implementation. See `PlatformAdsLoader` as an example. This class should should also take a creation params class as the only constructor parameter. -If the corresponding app-facing class can't instantiated by the app (e.g. AdsManager), the class -should only have a single protected constructor. See `PlatformAdsManager`. +If the corresponding app-facing class can't be instantiated by the app (e.g. `AdsManager`), the +class should only have a single protected constructor. See `PlatformAdsManager`. If the corresponding app-facing class needs to be a `Widget` (e.g. `AdDisplayContainer`), this should follow the same pattern as being instantiable by the app except it should contain a single @@ -93,9 +93,9 @@ method: `Widget build(BuildContext)`. See `PlatformAdDisplayContainer`. Every method should contain no more than one parameter. This allows the platform interface and platform implementation to add new features without requiring a breaking change. -#### Data Class +#### Data Classes -Each data class should be made `@immutable`. +These classes contain only fields and no methods. Each data class should be made `@immutable`. ### Platform Implementations @@ -110,24 +110,29 @@ platform classes that are returned by this. The platform implementations use Dart wrappers of their native SDKs. The SDKs are wrapped using using the `pigeon` package. However, the code that handles generating the wrappers are still in the -process of review and must use a git dependency in the pubspec. +process of review, so this plugin must use a git dependency in the pubspec. -The wrappers for the SDK of each platform can be updated and modify by changing the pigeon files: +The wrappers for the SDK of each platform can be updated and modified by changing the pigeon files: + +Android: `pigeons/interactive_media_ads_android.dart` +iOS: `pigeons/interactive_media_ads_ios.dart` + +The generated files are located: * Android: - * `pigeons/interactive_media_ads_android.dart` - * `android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/InteractiveMediaAdsLibrary.g.kt` -* iOS: - * `pigeons/interactive_media_ads_ios.dart` - * `ios/interactive_media_ads/Sources/interactive_media_ads/InteractiveMediaAdsLibrary.g.swift` + * `lib/src/android/interactive_media_ads.g.dart` + * `android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/InteractiveMediaAdsLibrary.g.kt` +* iOS + * `lib/src/ios/interactive_media_ads.g.dart` + * `ios/interactive_media_ads/Sources/interactive_media_ads/InteractiveMediaAdsLibrary.g.swift` -To update a wrapper for a platform, follow the steps below: +To update a wrapper for a platform, follow the steps: 1. Ensure the project has been built at least once. Android: Run `flutter build apk --debug` in `example/`. iOS: Run `flutter build ios --simulator` in `example/` -2. Add pigeon to `dev_depdencies` in the `pubspec.yaml` and run `pub upgrade`. +2. Add the correct `pigeon` package to `dev_depdencies` in the `pubspec.yaml` and run `pub upgrade`. Android: @@ -154,7 +159,7 @@ pigeon: Android: `pigeons/interactive_media_ads_android.dart` iOS: `pigeons/interactive_media_ads_ios.dart` -4. Make changes that match the native SDK. +4. Make changes that match the native SDK. Android SDK: https://developers.google.com/interactive-media-ads/docs/sdks/android/client-side/api/reference/com/google/ads/interactivemedia/v3/api/package-summary iOS SDK: https://developers.google.com/interactive-media-ads/docs/sdks/ios/client-side/reference/Classes @@ -178,18 +183,38 @@ iOS: Open `example/ios/` in Xcode. Assuming a non-static method or constructor was added to the native wrapper, a native test will need to be added. -Android: - - +Android native tests location: `android/src/test/kotlin/dev/flutter/packages/interactive_media_ads/` +iOS native tests location `example/ios/RunnerTests/` ### App-facing Interface -Code location: `lib/src/`. +Code location: `lib/src/` +The app-facing interface shares the same structure as the platform interface and uses delegation +to forward handling to the platform implementation. Note a few differences from the platform +interface: + +* Constructors and methods can contain more than one parameter. +* Platform classes can be instantiated with a platform implementation or creation params of + the corresponding platform interface class. See `AdsLoader.fromPlatform` and + `AdsLoader.fromPlatformCreationParams`. ## Recommended Process for Adding a New Feature -* Create an issue that includes the specific native classes/methods that this feature requires on -each platform. +1. Create a new feature request issue in the `flutter/flutter` repo. See +https://github.com/flutter/flutter/issues/new?assignees=&labels=&projects=&template=3_feature_request.yml + +2. In that issue add the specific native classes/methods that this feature requires for each +platform: + +Android SDK: https://developers.google.com/interactive-media-ads/docs/sdks/android/client-side/api/reference/com/google/ads/interactivemedia/v3/api/package-summary +iOS SDK: https://developers.google.com/interactive-media-ads/docs/sdks/ios/client-side/reference/Classes + +Add a note if this feature only exist for a single platform. + +3. Add a design where the feature can be added to the platform interface and app-facing interface. +If this is only supported on a single platform, add where it can be added in the platform +implementation. -* provide where this could be included in the platform interface and app-facing interface \ No newline at end of file +4. Work can be started on the feature request or you can wait for feedback from a Flutter +contributor. \ No newline at end of file diff --git a/packages/interactive_media_ads/README.md b/packages/interactive_media_ads/README.md index 4b585e746a8..8cad701b0c2 100644 --- a/packages/interactive_media_ads/README.md +++ b/packages/interactive_media_ads/README.md @@ -268,6 +268,10 @@ void dispose() { That's it! You're now requesting and displaying ads with the IMA SDK. To learn about additional SDK features, see the [API reference](https://pub.dev/documentation/interactive_media_ads/latest/). +## Contributing + +For information on contributing to this plugin, see [`CONTRIBUTING.md`](CONTRIBUTING.md). + [1]: https://developers.google.com/interactive-media-ads [2]: https://www.iab.com/guidelines/vast/ [3]: https://pub.dev/documentation/interactive_media_ads/latest/interactive_media_ads/AdDisplayContainer-class.html diff --git a/packages/interactive_media_ads/pubspec.yaml b/packages/interactive_media_ads/pubspec.yaml index a2d935ccb72..35c2e1f8f99 100644 --- a/packages/interactive_media_ads/pubspec.yaml +++ b/packages/interactive_media_ads/pubspec.yaml @@ -2,7 +2,7 @@ name: interactive_media_ads description: A Flutter plugin for using the Interactive Media Ads SDKs on Android and iOS. repository: https://github.com/flutter/packages/tree/main/packages/interactive_media_ads issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+interactive_media_ads%22 -version: 0.1.2 # This must match the version in +version: 0.1.2+1 # This must match the version in # `android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/AdsRequestProxyApi.kt` and # `ios/interactive_media_ads/Sources/interactive_media_ads/AdsRequestProxyAPIDelegate.swift` From 95ccf552855301bf085f49a3cb18f306da341519 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Tue, 20 Aug 2024 14:55:26 -0400 Subject: [PATCH 04/15] try some changes --- packages/interactive_media_ads/CHANGELOG.md | 4 ++++ packages/interactive_media_ads/CONTRIBUTING.md | 7 +++++-- .../packages/interactive_media_ads/AdsRequestProxyApi.kt | 2 +- .../interactive_media_ads/AdsRequestProxyAPIDelegate.swift | 2 +- 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/packages/interactive_media_ads/CHANGELOG.md b/packages/interactive_media_ads/CHANGELOG.md index b85f09593a8..9b41d25f798 100644 --- a/packages/interactive_media_ads/CHANGELOG.md +++ b/packages/interactive_media_ads/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.1.2+1 + +* Adds a contribution guide. See `CONTRIBUTING.md`. + ## 0.1.2 * Adds support for all `AdEventType`s and ad data. See `AdEvent.adData`. diff --git a/packages/interactive_media_ads/CONTRIBUTING.md b/packages/interactive_media_ads/CONTRIBUTING.md index 9f5aac5869d..c1a9fe73fe7 100644 --- a/packages/interactive_media_ads/CONTRIBUTING.md +++ b/packages/interactive_media_ads/CONTRIBUTING.md @@ -161,7 +161,7 @@ iOS: `pigeons/interactive_media_ads_ios.dart` 4. Make changes that match the native SDK. -Android SDK: https://developers.google.com/interactive-media-ads/docs/sdks/android/client-side/api/reference/com/google/ads/interactivemedia/v3/api/package-summary +[Android SDK][Android SDK] iOS SDK: https://developers.google.com/interactive-media-ads/docs/sdks/ios/client-side/reference/Classes 5. Run the code generator from the terminal. @@ -217,4 +217,7 @@ If this is only supported on a single platform, add where it can be added in the implementation. 4. Work can be started on the feature request or you can wait for feedback from a Flutter -contributor. \ No newline at end of file +contributor. + +[Android SDK]: https://developers.google.com/interactive-media-ads/docs/sdks/android/client-side/api/reference/com/google/ads/interactivemedia/v3/api/package-summary +[1]: https://developers.google.com/interactive-media-ads \ No newline at end of file diff --git a/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/AdsRequestProxyApi.kt b/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/AdsRequestProxyApi.kt index 295adef3dcb..c4ef80ccbc3 100644 --- a/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/AdsRequestProxyApi.kt +++ b/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/AdsRequestProxyApi.kt @@ -21,7 +21,7 @@ class AdsRequestProxyApi(override val pigeonRegistrar: ProxyApiRegistrar) : * * This must match the version in pubspec.yaml. */ - const val pluginVersion = "0.1.2" + const val pluginVersion = "0.1.2+1" } override fun setAdTagUrl(pigeon_instance: AdsRequest, adTagUrl: String) { diff --git a/packages/interactive_media_ads/ios/interactive_media_ads/Sources/interactive_media_ads/AdsRequestProxyAPIDelegate.swift b/packages/interactive_media_ads/ios/interactive_media_ads/Sources/interactive_media_ads/AdsRequestProxyAPIDelegate.swift index 429393dda5c..5d76d718c81 100644 --- a/packages/interactive_media_ads/ios/interactive_media_ads/Sources/interactive_media_ads/AdsRequestProxyAPIDelegate.swift +++ b/packages/interactive_media_ads/ios/interactive_media_ads/Sources/interactive_media_ads/AdsRequestProxyAPIDelegate.swift @@ -13,7 +13,7 @@ class AdsRequestProxyAPIDelegate: PigeonApiDelegateIMAAdsRequest { /// The current version of the `interactive_media_ads` plugin. /// /// This must match the version in pubspec.yaml. - static let pluginVersion = "0.1.2" + static let pluginVersion = "0.1.2+1" func pigeonDefaultConstructor( pigeonApi: PigeonApiIMAAdsRequest, adTagUrl: String, adDisplayContainer: IMAAdDisplayContainer, From 30ef11c81fee7658270accba622a51e57dfaa7fa Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Tue, 20 Aug 2024 14:57:53 -0400 Subject: [PATCH 05/15] try --- packages/interactive_media_ads/CONTRIBUTING.md | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/interactive_media_ads/CONTRIBUTING.md b/packages/interactive_media_ads/CONTRIBUTING.md index c1a9fe73fe7..db435326d52 100644 --- a/packages/interactive_media_ads/CONTRIBUTING.md +++ b/packages/interactive_media_ads/CONTRIBUTING.md @@ -162,6 +162,7 @@ iOS: `pigeons/interactive_media_ads_ios.dart` 4. Make changes that match the native SDK. [Android SDK][Android SDK] +[Android SDK] iOS SDK: https://developers.google.com/interactive-media-ads/docs/sdks/ios/client-side/reference/Classes 5. Run the code generator from the terminal. From 45b05530b92a81ba9a76f167dcbd47bf3d2cb3db Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Tue, 20 Aug 2024 15:14:08 -0400 Subject: [PATCH 06/15] updates --- .../interactive_media_ads/CONTRIBUTING.md | 40 ++++++++++--------- 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/packages/interactive_media_ads/CONTRIBUTING.md b/packages/interactive_media_ads/CONTRIBUTING.md index db435326d52..ddea8606aae 100644 --- a/packages/interactive_media_ads/CONTRIBUTING.md +++ b/packages/interactive_media_ads/CONTRIBUTING.md @@ -4,7 +4,7 @@ The structure of this plugin is similar to a [federated plugin](https://docs.flutter.dev/packages-and-plugins/developing-packages#federated-plugins), except the code for each package (platform interface, platform implementations, and app-facing -interface) are maintained in this one plugin. The sections below will provide overview how this +interface) are maintained in this single plugin. The sections below will provide overview how this plugin implements each portion. If you are familiar with [changing federated plugin](https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins) @@ -13,14 +13,14 @@ plugin. Therefore, it is not necessary to run the script that makes dependencies ### Quick Overview -This plugin uses the native IMA SDKs for Android and iOS. The API for the SDK of both platforms are -relatively similar, so this plugin attempts to maintain an interface that is similar to the native -SDKs. +This plugin uses the native [IMA SDKs] for Android and iOS. The API for the SDK of both platforms +are relatively similar, so this plugin attempts to maintain an interface that is similar to the +native SDKs. The app-facing interface uses delegation to interact with the underlying platform implementations. Therefore, the platform interface is similar to the app-facing interface with the differences being -explained in the sections below. Many classes will contain a `platform` field that is used to call -methods on the platform implementation: +explained in the sections below. Many app-facing interface classes will contain a `platform` field +that is used to forward handling to the platform implementation: ```dart // App-facing class used by apps @@ -49,7 +49,7 @@ final AdsLoader loader = AdsLoader(); ``` The other classes/enums included in the app-facing interface are typically exported from the -platform interface. A Data class being a good example of a class that is exported. +platform interface. A data class being a good example of a class that is exported. ### Platform Interface @@ -61,7 +61,7 @@ interface. The design of the platform interface should prioritize: * Minimizing the chances of needing a breaking change when adding a new feature. * Allowing platform implementations to easily add platform specific features. -* Being easy to unit test. +* Being straight-forward to write unit tests. Each platform creates a subclass of the central [InteractiveMediaAdsPlatform](lib/src/platform_interface/interactive_media_ads_platform.dart) class. A platform implementation is set by setting `InteractiveMediaAdsPlatform.instance` to an @@ -76,17 +76,17 @@ Below are some of the types of classes in the interface. These are classes where the app-facing interface needs to delegate handling to the platform implementation. These classes are typically prefixed with `Platform`. -If the corresponding app-facing class can be instantiated by the app (e.g. `AdsLoader`), +If the corresponding app-facing class can be instantiated by the app (e.g. [AdsLoader]), the `InteractiveMediaAdsPlatform.instance` field should be used in a factory to instantiate the -correct platform implementation. See `PlatformAdsLoader` as an example. This class should should +correct platform implementation. See [PlatformAdsLoader] as an example. This class should should also take a creation params class as the only constructor parameter. If the corresponding app-facing class can't be instantiated by the app (e.g. `AdsManager`), the -class should only have a single protected constructor. See `PlatformAdsManager`. +class should only have a single protected constructor. See [PlatformAdsManager]. -If the corresponding app-facing class needs to be a `Widget` (e.g. `AdDisplayContainer`), this +If the corresponding app-facing class needs to be a `Widget` (e.g. [AdDisplayContainer]), this should follow the same pattern as being instantiable by the app except it should contain a single -method: `Widget build(BuildContext)`. See `PlatformAdDisplayContainer`. +method: `Widget build(BuildContext)`. See [PlatformAdDisplayContainer]. **Note** @@ -160,10 +160,8 @@ Android: `pigeons/interactive_media_ads_android.dart` iOS: `pigeons/interactive_media_ads_ios.dart` 4. Make changes that match the native SDK. - -[Android SDK][Android SDK] -[Android SDK] -iOS SDK: https://developers.google.com/interactive-media-ads/docs/sdks/ios/client-side/reference/Classes + * [Android SDK] + * [iOS SDK] 5. Run the code generator from the terminal. @@ -220,5 +218,11 @@ implementation. 4. Work can be started on the feature request or you can wait for feedback from a Flutter contributor. +[IMA SDKs]: https://developers.google.com/interactive-media-ads +[AdsLoader]: lib/src/ads_loader.dart +[AdDisplayContainer]: lib/src/ad_display_container.dart.dart +[PlatformAdsLoader]: lib/src/platform_interface/platform_ads_loader.dart +[PlatformAdsManager]: lib/src/platform_interface/platform_ads_manager.dart +[PlatformAdDisplayContainer]: lib/src/platform_interface/platform_ad_display_container.dart [Android SDK]: https://developers.google.com/interactive-media-ads/docs/sdks/android/client-side/api/reference/com/google/ads/interactivemedia/v3/api/package-summary -[1]: https://developers.google.com/interactive-media-ads \ No newline at end of file +[iOS SDK]: https://developers.google.com/interactive-media-ads/docs/sdks/ios/client-side/reference/Classes From 64d33d919b2c3bc7e9645aded5963c8c7b96fd85 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Tue, 20 Aug 2024 15:30:14 -0400 Subject: [PATCH 07/15] fix formatting --- .../interactive_media_ads/CONTRIBUTING.md | 55 ++++++++++--------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/packages/interactive_media_ads/CONTRIBUTING.md b/packages/interactive_media_ads/CONTRIBUTING.md index ddea8606aae..5e1d9c5aa4a 100644 --- a/packages/interactive_media_ads/CONTRIBUTING.md +++ b/packages/interactive_media_ads/CONTRIBUTING.md @@ -4,8 +4,8 @@ The structure of this plugin is similar to a [federated plugin](https://docs.flutter.dev/packages-and-plugins/developing-packages#federated-plugins), except the code for each package (platform interface, platform implementations, and app-facing -interface) are maintained in this single plugin. The sections below will provide overview how this -plugin implements each portion. +interface) are maintained in this single plugin. The sections below will provide an overview of how +this plugin implements each portion. If you are familiar with [changing federated plugin](https://github.com/flutter/flutter/blob/master/docs/ecosystem/contributing/README.md#changing-federated-plugins) in the `flutter/packages` repo, the process is similar except that all changes are made in this @@ -91,7 +91,7 @@ method: `Widget build(BuildContext)`. See [PlatformAdDisplayContainer]. **Note** Every method should contain no more than one parameter. This allows the platform interface and -platform implementation to add new features without requiring a breaking change. +platform implementations to add new features without requiring a breaking change. #### Data Classes @@ -114,8 +114,8 @@ process of review, so this plugin must use a git dependency in the pubspec. The wrappers for the SDK of each platform can be updated and modified by changing the pigeon files: -Android: `pigeons/interactive_media_ads_android.dart` -iOS: `pigeons/interactive_media_ads_ios.dart` +* Android: `pigeons/interactive_media_ads_android.dart` +* iOS: `pigeons/interactive_media_ads_ios.dart` The generated files are located: * Android: @@ -127,12 +127,12 @@ The generated files are located: To update a wrapper for a platform, follow the steps: -1. Ensure the project has been built at least once. +##### 1. Ensure the project has been built at least once. -Android: Run `flutter build apk --debug` in `example/`. -iOS: Run `flutter build ios --simulator` in `example/` +* Android: Run `flutter build apk --debug` in `example/`. +* iOS: Run `flutter build ios --simulator` in `example/` -2. Add the correct `pigeon` package to `dev_depdencies` in the `pubspec.yaml` and run `pub upgrade`. +##### 2. Add the correct `pigeon` package to `dev_depdencies` in the `pubspec.yaml` and run `pub upgrade`. Android: @@ -154,36 +154,37 @@ pigeon: path: packages/pigeon ``` -3. Remove the multiline comments in the pigeon file. +##### 3. Remove the multiline comments in the pigeon file. -Android: `pigeons/interactive_media_ads_android.dart` -iOS: `pigeons/interactive_media_ads_ios.dart` +* Android: `pigeons/interactive_media_ads_android.dart` +* iOS: `pigeons/interactive_media_ads_ios.dart` -4. Make changes that match the native SDK. - * [Android SDK] - * [iOS SDK] +##### 4. Make changes that match the native SDK. -5. Run the code generator from the terminal. +* [Android SDK] +* [iOS SDK] -Android: `dart run pigeon --input pigeons/interactive_media_ads_android.dart` -iOS: `dart run pigeon --input pigeons/interactive_media_ads_ios.dart` +##### 5. Run the code generator from the terminal. -6. Update the generated APIs in native code. +* Android: `dart run pigeon --input pigeons/interactive_media_ads_android.dart` +* iOS: `dart run pigeon --input pigeons/interactive_media_ads_ios.dart` + +##### 6. Update the generated APIs in native code. Running the `flutter build` step from step 1 again should provide build errors and indicate what needs to be done. Alternatively, it can be easier to update native code with the platform's specific IDE: -Android: Open `android/` in a separate Android Studio project. -iOS: Open `example/ios/` in Xcode. +* Android: Open `android/` in a separate Android Studio project. +* iOS: Open `example/ios/` in Xcode. -7. Write API tests. +##### 7. Write API tests. Assuming a non-static method or constructor was added to the native wrapper, a native test will need to be added. -Android native tests location: `android/src/test/kotlin/dev/flutter/packages/interactive_media_ads/` -iOS native tests location `example/ios/RunnerTests/` +* Android native tests location: `android/src/test/kotlin/dev/flutter/packages/interactive_media_ads/` +* iOS native tests location `example/ios/RunnerTests/` ### App-facing Interface @@ -206,8 +207,8 @@ https://github.com/flutter/flutter/issues/new?assignees=&labels=&projects=&templ 2. In that issue add the specific native classes/methods that this feature requires for each platform: -Android SDK: https://developers.google.com/interactive-media-ads/docs/sdks/android/client-side/api/reference/com/google/ads/interactivemedia/v3/api/package-summary -iOS SDK: https://developers.google.com/interactive-media-ads/docs/sdks/ios/client-side/reference/Classes +* [Android SDK] +* [iOS SDK] Add a note if this feature only exist for a single platform. @@ -220,7 +221,7 @@ contributor. [IMA SDKs]: https://developers.google.com/interactive-media-ads [AdsLoader]: lib/src/ads_loader.dart -[AdDisplayContainer]: lib/src/ad_display_container.dart.dart +[AdDisplayContainer]: lib/src/ad_display_container.dart [PlatformAdsLoader]: lib/src/platform_interface/platform_ads_loader.dart [PlatformAdsManager]: lib/src/platform_interface/platform_ads_manager.dart [PlatformAdDisplayContainer]: lib/src/platform_interface/platform_ad_display_container.dart From 7f5d67219a114383d029477ee78fabda2473daf2 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Tue, 20 Aug 2024 15:32:17 -0400 Subject: [PATCH 08/15] fis formatting --- packages/interactive_media_ads/CONTRIBUTING.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/interactive_media_ads/CONTRIBUTING.md b/packages/interactive_media_ads/CONTRIBUTING.md index 5e1d9c5aa4a..b923035ebfe 100644 --- a/packages/interactive_media_ads/CONTRIBUTING.md +++ b/packages/interactive_media_ads/CONTRIBUTING.md @@ -201,10 +201,10 @@ interface: ## Recommended Process for Adding a New Feature -1. Create a new feature request issue in the `flutter/flutter` repo. See +### 1. Create a new feature request issue in the `flutter/flutter` repo. See https://github.com/flutter/flutter/issues/new?assignees=&labels=&projects=&template=3_feature_request.yml -2. In that issue add the specific native classes/methods that this feature requires for each +### 2. In that issue add the specific native classes/methods that this feature requires for each platform: * [Android SDK] @@ -212,11 +212,11 @@ platform: Add a note if this feature only exist for a single platform. -3. Add a design where the feature can be added to the platform interface and app-facing interface. +### 3. Add a design where the feature can be added to the platform interface and app-facing interface. If this is only supported on a single platform, add where it can be added in the platform implementation. -4. Work can be started on the feature request or you can wait for feedback from a Flutter +### 4. Work can be started on the feature request or you can wait for feedback from a Flutter contributor. [IMA SDKs]: https://developers.google.com/interactive-media-ads From a13688398d842e441d3f9524843abf8817f3d034 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Tue, 20 Aug 2024 15:39:00 -0400 Subject: [PATCH 09/15] remove comments and use uncomment --- packages/interactive_media_ads/CONTRIBUTING.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/interactive_media_ads/CONTRIBUTING.md b/packages/interactive_media_ads/CONTRIBUTING.md index b923035ebfe..4c9d51d205a 100644 --- a/packages/interactive_media_ads/CONTRIBUTING.md +++ b/packages/interactive_media_ads/CONTRIBUTING.md @@ -127,12 +127,12 @@ The generated files are located: To update a wrapper for a platform, follow the steps: -##### 1. Ensure the project has been built at least once. +##### 1. Ensure the project has been built at least once * Android: Run `flutter build apk --debug` in `example/`. * iOS: Run `flutter build ios --simulator` in `example/` -##### 2. Add the correct `pigeon` package to `dev_depdencies` in the `pubspec.yaml` and run `pub upgrade`. +##### 2. Add the correct `pigeon` package to `dev_depdencies` in the `pubspec.yaml` and run `pub upgrade` Android: @@ -154,22 +154,22 @@ pigeon: path: packages/pigeon ``` -##### 3. Remove the multiline comments in the pigeon file. +##### 3. Uncomment the multiline comments in the pigeon file * Android: `pigeons/interactive_media_ads_android.dart` * iOS: `pigeons/interactive_media_ads_ios.dart` -##### 4. Make changes that match the native SDK. +##### 4. Make changes that match the native SDK * [Android SDK] * [iOS SDK] -##### 5. Run the code generator from the terminal. +##### 5. Run the code generator from the terminal * Android: `dart run pigeon --input pigeons/interactive_media_ads_android.dart` * iOS: `dart run pigeon --input pigeons/interactive_media_ads_ios.dart` -##### 6. Update the generated APIs in native code. +##### 6. Update the generated APIs in native code Running the `flutter build` step from step 1 again should provide build errors and indicate what needs to be done. Alternatively, it can be easier to update native code with the platform's specific @@ -178,7 +178,7 @@ IDE: * Android: Open `android/` in a separate Android Studio project. * iOS: Open `example/ios/` in Xcode. -##### 7. Write API tests. +##### 7. Write API tests Assuming a non-static method or constructor was added to the native wrapper, a native test will need to be added. From 42e6f413b3ab43d2035a66b03cd64ece305e865e Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Tue, 20 Aug 2024 15:51:24 -0400 Subject: [PATCH 10/15] testing --- packages/interactive_media_ads/CONTRIBUTING.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/interactive_media_ads/CONTRIBUTING.md b/packages/interactive_media_ads/CONTRIBUTING.md index 4c9d51d205a..3653162c7e8 100644 --- a/packages/interactive_media_ads/CONTRIBUTING.md +++ b/packages/interactive_media_ads/CONTRIBUTING.md @@ -1,5 +1,8 @@ # Contributing to `interactive_media_ads` +Please start by taking a look at the general guide to contributing to `flutter/packages` repo: +https://github.com/flutter/packages/blob/main/CONTRIBUTING.md + ## Package Structure The structure of this plugin is similar to a [federated plugin](https://docs.flutter.dev/packages-and-plugins/developing-packages#federated-plugins), @@ -186,6 +189,12 @@ to be added. * Android native tests location: `android/src/test/kotlin/dev/flutter/packages/interactive_media_ads/` * iOS native tests location `example/ios/RunnerTests/` +#### Testing + +Tests for the platform implementations use [mockito] to generate mock objects of the native Dart +wrappers. To generate the mock objects in `test/`, run +`dart run build_runner build --delete-conflicting-outputs`. + ### App-facing Interface Code location: `lib/src/` @@ -227,3 +236,4 @@ contributor. [PlatformAdDisplayContainer]: lib/src/platform_interface/platform_ad_display_container.dart [Android SDK]: https://developers.google.com/interactive-media-ads/docs/sdks/android/client-side/api/reference/com/google/ads/interactivemedia/v3/api/package-summary [iOS SDK]: https://developers.google.com/interactive-media-ads/docs/sdks/ios/client-side/reference/Classes +[mockito]: https://pub.dev/packages/mockito From 083e2c60d11f1b03f9cac1f0a786a801c219f51b Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Tue, 20 Aug 2024 16:03:05 -0400 Subject: [PATCH 11/15] more cleanup --- packages/interactive_media_ads/CONTRIBUTING.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/interactive_media_ads/CONTRIBUTING.md b/packages/interactive_media_ads/CONTRIBUTING.md index 3653162c7e8..7de099aeaab 100644 --- a/packages/interactive_media_ads/CONTRIBUTING.md +++ b/packages/interactive_media_ads/CONTRIBUTING.md @@ -1,6 +1,6 @@ # Contributing to `interactive_media_ads` -Please start by taking a look at the general guide to contributing to `flutter/packages` repo: +Please start by taking a look at the general guide to contributing to the `flutter/packages` repo: https://github.com/flutter/packages/blob/main/CONTRIBUTING.md ## Package Structure @@ -178,7 +178,7 @@ Running the `flutter build` step from step 1 again should provide build errors a needs to be done. Alternatively, it can be easier to update native code with the platform's specific IDE: -* Android: Open `android/` in a separate Android Studio project. +* Android: Open `example/android/` in a separate Android Studio project. * iOS: Open `example/ios/` in Xcode. ##### 7. Write API tests @@ -189,7 +189,7 @@ to be added. * Android native tests location: `android/src/test/kotlin/dev/flutter/packages/interactive_media_ads/` * iOS native tests location `example/ios/RunnerTests/` -#### Testing +#### Dart Unit Testing Tests for the platform implementations use [mockito] to generate mock objects of the native Dart wrappers. To generate the mock objects in `test/`, run @@ -210,11 +210,11 @@ interface: ## Recommended Process for Adding a New Feature -### 1. Create a new feature request issue in the `flutter/flutter` repo. See -https://github.com/flutter/flutter/issues/new?assignees=&labels=&projects=&template=3_feature_request.yml +### 1. Create a new feature request issue in the `flutter/flutter` repo. -### 2. In that issue add the specific native classes/methods that this feature requires for each -platform: +See https://github.com/flutter/flutter/issues/new?assignees=&labels=&projects=&template=3_feature_request.yml + +### 2. In that issue add the specific native classes/methods that this feature requires for each platform: * [Android SDK] * [iOS SDK] @@ -222,11 +222,11 @@ platform: Add a note if this feature only exist for a single platform. ### 3. Add a design where the feature can be added to the platform interface and app-facing interface. + If this is only supported on a single platform, add where it can be added in the platform implementation. -### 4. Work can be started on the feature request or you can wait for feedback from a Flutter -contributor. +### 4. Work can be started on the feature request or you can wait for feedback from a Flutter contributor. [IMA SDKs]: https://developers.google.com/interactive-media-ads [AdsLoader]: lib/src/ads_loader.dart From 7221e21af4a5235acb587a436d23d22d26936a2b Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Tue, 20 Aug 2024 16:24:38 -0400 Subject: [PATCH 12/15] fix version --- packages/interactive_media_ads/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/interactive_media_ads/pubspec.yaml b/packages/interactive_media_ads/pubspec.yaml index 35c2e1f8f99..2bf47bbc8b8 100644 --- a/packages/interactive_media_ads/pubspec.yaml +++ b/packages/interactive_media_ads/pubspec.yaml @@ -2,7 +2,7 @@ name: interactive_media_ads description: A Flutter plugin for using the Interactive Media Ads SDKs on Android and iOS. repository: https://github.com/flutter/packages/tree/main/packages/interactive_media_ads issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+interactive_media_ads%22 -version: 0.1.2+1 # This must match the version in +version: 0.1.2+2 # This must match the version in # `android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/AdsRequestProxyApi.kt` and # `ios/interactive_media_ads/Sources/interactive_media_ads/AdsRequestProxyAPIDelegate.swift` From 6f084fc2360cf34f1e22ff4904547406116ec3a2 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Tue, 20 Aug 2024 16:47:24 -0400 Subject: [PATCH 13/15] fix readme --- packages/interactive_media_ads/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/interactive_media_ads/README.md b/packages/interactive_media_ads/README.md index b3a40c8f491..01324117f22 100644 --- a/packages/interactive_media_ads/README.md +++ b/packages/interactive_media_ads/README.md @@ -15,9 +15,9 @@ a separate video player positioned on top of the app's content video player. **NOTE:** * The initial release for this package supports linear pre-roll video ads on iOS and Android -* platforms. + platforms. * Companion ads, Background Audio ads and Google Dynamic Ad Insertion methods are currently not -* supported. + supported. ## IMA client-side overview From 85fa03918b9088b1415a253a0756cf15d7452b90 Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Wed, 21 Aug 2024 13:51:59 -0400 Subject: [PATCH 14/15] pubspec version --- packages/interactive_media_ads/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/interactive_media_ads/pubspec.yaml b/packages/interactive_media_ads/pubspec.yaml index a6a59d96cda..37b8a923e2b 100644 --- a/packages/interactive_media_ads/pubspec.yaml +++ b/packages/interactive_media_ads/pubspec.yaml @@ -2,7 +2,7 @@ name: interactive_media_ads description: A Flutter plugin for using the Interactive Media Ads SDKs on Android and iOS. repository: https://github.com/flutter/packages/tree/main/packages/interactive_media_ads issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+interactive_media_ads%22 -version: 0.1.2+2 # This must match the version in +version: 0.1.2+3 # This must match the version in # `android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/AdsRequestProxyApi.kt` and # `ios/interactive_media_ads/Sources/interactive_media_ads/AdsRequestProxyAPIDelegate.swift` From 397070aecb1423e67e7ff75c35fe0814bc988c0e Mon Sep 17 00:00:00 2001 From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com> Date: Wed, 21 Aug 2024 14:03:03 -0400 Subject: [PATCH 15/15] fix spelling --- packages/interactive_media_ads/CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/interactive_media_ads/CONTRIBUTING.md b/packages/interactive_media_ads/CONTRIBUTING.md index 7de099aeaab..7ea6e025646 100644 --- a/packages/interactive_media_ads/CONTRIBUTING.md +++ b/packages/interactive_media_ads/CONTRIBUTING.md @@ -135,7 +135,7 @@ To update a wrapper for a platform, follow the steps: * Android: Run `flutter build apk --debug` in `example/`. * iOS: Run `flutter build ios --simulator` in `example/` -##### 2. Add the correct `pigeon` package to `dev_depdencies` in the `pubspec.yaml` and run `pub upgrade` +##### 2. Add the correct `pigeon` package to `dev_dependencies` in the `pubspec.yaml` and run `pub upgrade` Android: