From 4c18648650aefa681c83b1d371c9a728d4d769a2 Mon Sep 17 00:00:00 2001
From: Maurice Parrish <10687576+bparrishMines@users.noreply.github.com>
Date: Wed, 11 Sep 2024 11:28:24 -0600
Subject: [PATCH] Adds internal wrapper for Android native
`ContentProgressProvider` (#7461)
---
packages/interactive_media_ads/CHANGELOG.md | 4 +
.../AdsRequestProxyApi.kt | 2 +-
.../ContentProgressProviderProxyApi.kt | 28 +++++-
.../InteractiveMediaAdsLibrary.g.kt | 85 +++++++++++++++++--
.../ContentProgressProviderProxyApiTest.kt | 36 ++++++++
.../AdsRequestProxyAPIDelegate.swift | 2 +-
.../src/android/interactive_media_ads.g.dart | 71 +++++++++++++++-
.../interactive_media_ads_android.dart | 10 ++-
packages/interactive_media_ads/pubspec.yaml | 2 +-
9 files changed, 227 insertions(+), 13 deletions(-)
create mode 100644 packages/interactive_media_ads/android/src/test/kotlin/dev/flutter/packages/interactive_media_ads/ContentProgressProviderProxyApiTest.kt
diff --git a/packages/interactive_media_ads/CHANGELOG.md b/packages/interactive_media_ads/CHANGELOG.md
index 5ff40f5153bc..211bf9ea278e 100644
--- a/packages/interactive_media_ads/CHANGELOG.md
+++ b/packages/interactive_media_ads/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.2.1
+
+* Adds internal wrapper for Android native `ContentProgressProvider`.
+
## 0.2.0
* Adds support for pausing and resuming Ad playback. See `AdsManager.pause` and `AdsManager.resume`.
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 bde68a301c99..4f07af1d8142 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.2.0"
+ const val pluginVersion = "0.2.1"
}
override fun setAdTagUrl(pigeon_instance: AdsRequest, adTagUrl: String) {
diff --git a/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/ContentProgressProviderProxyApi.kt b/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/ContentProgressProviderProxyApi.kt
index 0fa1308d1383..de942c05aa3c 100644
--- a/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/ContentProgressProviderProxyApi.kt
+++ b/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/ContentProgressProviderProxyApi.kt
@@ -4,12 +4,34 @@
package dev.flutter.packages.interactive_media_ads
+import com.google.ads.interactivemedia.v3.api.player.ContentProgressProvider
+import com.google.ads.interactivemedia.v3.api.player.VideoProgressUpdate
+
/**
- * ProxyApi implementation for
- * [com.google.ads.interactivemedia.v3.api.player.ContentProgressProvider].
+ * ProxyApi implementation for [ContentProgressProvider].
*
*
This class may handle instantiating native object instances that are attached to a Dart
* instance or handle method calls on the associated native class or an instance of that class.
*/
class ContentProgressProviderProxyApi(override val pigeonRegistrar: ProxyApiRegistrar) :
- PigeonApiContentProgressProvider(pigeonRegistrar)
+ PigeonApiContentProgressProvider(pigeonRegistrar) {
+ internal class ContentProgressProviderImpl(val api: ContentProgressProviderProxyApi) :
+ ContentProgressProvider {
+ var currentProgress = VideoProgressUpdate.VIDEO_TIME_NOT_READY
+
+ override fun getContentProgress(): VideoProgressUpdate {
+ return currentProgress
+ }
+ }
+
+ override fun pigeon_defaultConstructor(): ContentProgressProvider {
+ return ContentProgressProviderImpl(this)
+ }
+
+ override fun setContentProgress(
+ pigeon_instance: ContentProgressProvider,
+ update: VideoProgressUpdate
+ ) {
+ (pigeon_instance as ContentProgressProviderImpl).currentProgress = update
+ }
+}
diff --git a/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/InteractiveMediaAdsLibrary.g.kt b/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/InteractiveMediaAdsLibrary.g.kt
index ea53d0b11d36..4056a3d980b6 100644
--- a/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/InteractiveMediaAdsLibrary.g.kt
+++ b/packages/interactive_media_ads/android/src/main/kotlin/dev/flutter/packages/interactive_media_ads/InteractiveMediaAdsLibrary.g.kt
@@ -1,7 +1,7 @@
// 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.
-// Autogenerated from Pigeon (v22.2.0), do not edit directly.
+// Autogenerated from Pigeon (v22.3.0), do not edit directly.
// See also: https://pub.dev/packages/pigeon
@file:Suppress("UNCHECKED_CAST", "ArrayInDataClass", "SyntheticAccessor")
@@ -423,9 +423,7 @@ abstract class InteractiveMediaAdsLibraryPigeonProxyApiRegistrar(
* An implementation of [PigeonApiContentProgressProvider] used to add a new Dart instance of
* `ContentProgressProvider` to the Dart `InstanceManager`.
*/
- open fun getPigeonApiContentProgressProvider(): PigeonApiContentProgressProvider {
- return PigeonApiContentProgressProvider(this)
- }
+ abstract fun getPigeonApiContentProgressProvider(): PigeonApiContentProgressProvider
/**
* An implementation of [PigeonApiAdsManager] used to add a new Dart instance of `AdsManager` to
@@ -544,6 +542,8 @@ abstract class InteractiveMediaAdsLibraryPigeonProxyApiRegistrar(
binaryMessenger, instanceManager)
PigeonApiAdsLoader.setUpMessageHandlers(binaryMessenger, getPigeonApiAdsLoader())
PigeonApiAdsRequest.setUpMessageHandlers(binaryMessenger, getPigeonApiAdsRequest())
+ PigeonApiContentProgressProvider.setUpMessageHandlers(
+ binaryMessenger, getPigeonApiContentProgressProvider())
PigeonApiAdsManager.setUpMessageHandlers(binaryMessenger, getPigeonApiAdsManager())
PigeonApiBaseManager.setUpMessageHandlers(binaryMessenger, getPigeonApiBaseManager())
PigeonApiImaSdkFactory.setUpMessageHandlers(binaryMessenger, getPigeonApiImaSdkFactory())
@@ -566,6 +566,7 @@ abstract class InteractiveMediaAdsLibraryPigeonProxyApiRegistrar(
InteractiveMediaAdsLibraryPigeonInstanceManagerApi.setUpMessageHandlers(binaryMessenger, null)
PigeonApiAdsLoader.setUpMessageHandlers(binaryMessenger, null)
PigeonApiAdsRequest.setUpMessageHandlers(binaryMessenger, null)
+ PigeonApiContentProgressProvider.setUpMessageHandlers(binaryMessenger, null)
PigeonApiAdsManager.setUpMessageHandlers(binaryMessenger, null)
PigeonApiBaseManager.setUpMessageHandlers(binaryMessenger, null)
PigeonApiImaSdkFactory.setUpMessageHandlers(binaryMessenger, null)
@@ -1429,9 +1430,83 @@ abstract class PigeonApiAdsRequest(
* https://developers.google.com/ad-manager/dynamic-ad-insertion/sdk/android/api/reference/com/google/ads/interactivemedia/v3/api/player/ContentProgressProvider.html.
*/
@Suppress("UNCHECKED_CAST")
-open class PigeonApiContentProgressProvider(
+abstract class PigeonApiContentProgressProvider(
open val pigeonRegistrar: InteractiveMediaAdsLibraryPigeonProxyApiRegistrar
) {
+ abstract fun pigeon_defaultConstructor():
+ com.google.ads.interactivemedia.v3.api.player.ContentProgressProvider
+
+ /**
+ * Sets an update on the progress of the video.
+ *
+ * This is a custom method added to the native class because the native method
+ * `getContentProgress` requires a synchronous return value.
+ */
+ abstract fun setContentProgress(
+ pigeon_instance: com.google.ads.interactivemedia.v3.api.player.ContentProgressProvider,
+ update: com.google.ads.interactivemedia.v3.api.player.VideoProgressUpdate
+ )
+
+ companion object {
+ @Suppress("LocalVariableName")
+ fun setUpMessageHandlers(
+ binaryMessenger: BinaryMessenger,
+ api: PigeonApiContentProgressProvider?
+ ) {
+ val codec = api?.pigeonRegistrar?.codec ?: InteractiveMediaAdsLibraryPigeonCodec()
+ run {
+ val channel =
+ BasicMessageChannel(
+ binaryMessenger,
+ "dev.flutter.pigeon.interactive_media_ads.ContentProgressProvider.pigeon_defaultConstructor",
+ codec)
+ if (api != null) {
+ channel.setMessageHandler { message, reply ->
+ val args = message as List
+ val pigeon_identifierArg = args[0] as Long
+ val wrapped: List =
+ try {
+ api.pigeonRegistrar.instanceManager.addDartCreatedInstance(
+ api.pigeon_defaultConstructor(), pigeon_identifierArg)
+ listOf(null)
+ } catch (exception: Throwable) {
+ wrapError(exception)
+ }
+ reply.reply(wrapped)
+ }
+ } else {
+ channel.setMessageHandler(null)
+ }
+ }
+ run {
+ val channel =
+ BasicMessageChannel(
+ binaryMessenger,
+ "dev.flutter.pigeon.interactive_media_ads.ContentProgressProvider.setContentProgress",
+ codec)
+ if (api != null) {
+ channel.setMessageHandler { message, reply ->
+ val args = message as List
+ val pigeon_instanceArg =
+ args[0] as com.google.ads.interactivemedia.v3.api.player.ContentProgressProvider
+ val updateArg =
+ args[1] as com.google.ads.interactivemedia.v3.api.player.VideoProgressUpdate
+ val wrapped: List =
+ try {
+ api.setContentProgress(pigeon_instanceArg, updateArg)
+ listOf(null)
+ } catch (exception: Throwable) {
+ wrapError(exception)
+ }
+ reply.reply(wrapped)
+ }
+ } else {
+ channel.setMessageHandler(null)
+ }
+ }
+ }
+ }
+
@Suppress("LocalVariableName", "FunctionName")
/** Creates a Dart instance of ContentProgressProvider and attaches it to [pigeon_instanceArg]. */
fun pigeon_newInstance(
diff --git a/packages/interactive_media_ads/android/src/test/kotlin/dev/flutter/packages/interactive_media_ads/ContentProgressProviderProxyApiTest.kt b/packages/interactive_media_ads/android/src/test/kotlin/dev/flutter/packages/interactive_media_ads/ContentProgressProviderProxyApiTest.kt
new file mode 100644
index 000000000000..55c8accb055e
--- /dev/null
+++ b/packages/interactive_media_ads/android/src/test/kotlin/dev/flutter/packages/interactive_media_ads/ContentProgressProviderProxyApiTest.kt
@@ -0,0 +1,36 @@
+// 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 dev.flutter.packages.interactive_media_ads
+
+import com.google.ads.interactivemedia.v3.api.player.VideoProgressUpdate
+import kotlin.test.Test
+import kotlin.test.assertEquals
+import kotlin.test.assertTrue
+import org.mockito.kotlin.mock
+
+class ContentProgressProviderProxyApiTest {
+ @Test
+ fun pigeon_defaultConstructor() {
+ val api = TestProxyApiRegistrar().getPigeonApiContentProgressProvider()
+
+ assertTrue(
+ api.pigeon_defaultConstructor()
+ is ContentProgressProviderProxyApi.ContentProgressProviderImpl)
+ }
+
+ @Test
+ fun setContentProgress() {
+ val api = TestProxyApiRegistrar().getPigeonApiContentProgressProvider()
+
+ val instance =
+ ContentProgressProviderProxyApi.ContentProgressProviderImpl(
+ api as ContentProgressProviderProxyApi)
+ val mockProgressUpdate = mock()
+ api.setContentProgress(instance, mockProgressUpdate)
+
+ assertEquals(mockProgressUpdate, instance.currentProgress)
+ assertEquals(mockProgressUpdate, instance.contentProgress)
+ }
+}
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 a929dae41f5e..4ecd85c58c2f 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.2.0"
+ static let pluginVersion = "0.2.1"
func pigeonDefaultConstructor(
pigeonApi: PigeonApiIMAAdsRequest, adTagUrl: String, adDisplayContainer: IMAAdDisplayContainer,
diff --git a/packages/interactive_media_ads/lib/src/android/interactive_media_ads.g.dart b/packages/interactive_media_ads/lib/src/android/interactive_media_ads.g.dart
index eb6f95166738..927161d0bcee 100644
--- a/packages/interactive_media_ads/lib/src/android/interactive_media_ads.g.dart
+++ b/packages/interactive_media_ads/lib/src/android/interactive_media_ads.g.dart
@@ -1,7 +1,7 @@
// 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.
-// Autogenerated from Pigeon (v22.2.0), do not edit directly.
+// Autogenerated from Pigeon (v22.3.0), do not edit directly.
// See also: https://pub.dev/packages/pigeon
// ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import, unnecessary_parenthesis, prefer_null_aware_operators, omit_local_variable_types, unused_shown_name, unnecessary_import, no_leading_underscores_for_local_identifiers
@@ -1397,6 +1397,40 @@ class AdsRequest extends PigeonInternalProxyApiBaseClass {
///
/// See https://developers.google.com/ad-manager/dynamic-ad-insertion/sdk/android/api/reference/com/google/ads/interactivemedia/v3/api/player/ContentProgressProvider.html.
class ContentProgressProvider extends PigeonInternalProxyApiBaseClass {
+ ContentProgressProvider({
+ super.pigeon_binaryMessenger,
+ super.pigeon_instanceManager,
+ }) {
+ final int pigeonVar_instanceIdentifier =
+ pigeon_instanceManager.addDartCreatedInstance(this);
+ final _PigeonInternalProxyApiBaseCodec pigeonChannelCodec =
+ _pigeonVar_codecContentProgressProvider;
+ final BinaryMessenger? pigeonVar_binaryMessenger = pigeon_binaryMessenger;
+ () async {
+ const String pigeonVar_channelName =
+ 'dev.flutter.pigeon.interactive_media_ads.ContentProgressProvider.pigeon_defaultConstructor';
+ final BasicMessageChannel