Visitar URL original
refactor(in_app_messaging): migrate platform channels to Pigeon (#18529) · firebase/flutterfire@17c4d6f · GitHub
Skip to content

Commit 17c4d6f

Browse files
authored
refactor(in_app_messaging): migrate platform channels to Pigeon (#18529)
1 parent 1e6da07 commit 17c4d6f

13 files changed

Lines changed: 855 additions & 81 deletions

File tree

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# Copyright 2026 The Chromium Authors. All rights reserved.
2+
# Use of this source code is governed by a BSD-style license that can be
3+
# found in the LICENSE file.
4+
5+
include: ../../analysis_options.yaml
6+
7+
analyzer:
8+
exclude:
9+
- firebase_in_app_messaging_platform_interface/lib/src/pigeon/messages.pigeon.dart
10+
- firebase_in_app_messaging_platform_interface/test/pigeon/test_api.dart
11+
- firebase_in_app_messaging_platform_interface/pigeons/messages.dart

‎packages/firebase_in_app_messaging/firebase_in_app_messaging/android/src/main/kotlin/io/flutter/plugins/firebase/inappmessaging/FirebaseInAppMessagingPlugin.kt‎

Lines changed: 51 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -9,49 +9,76 @@ import com.google.firebase.FirebaseApp
99
import com.google.firebase.inappmessaging.FirebaseInAppMessaging
1010
import io.flutter.embedding.engine.plugins.FlutterPlugin
1111
import io.flutter.embedding.engine.plugins.FlutterPlugin.FlutterPluginBinding
12-
import io.flutter.plugin.common.MethodCall
13-
import io.flutter.plugin.common.MethodChannel
14-
import io.flutter.plugin.common.MethodChannel.MethodCallHandler
15-
import io.flutter.plugin.common.MethodChannel.Result
12+
import io.flutter.plugin.common.BinaryMessenger
1613
import io.flutter.plugins.firebase.core.FlutterFirebasePlugin
14+
import io.flutter.plugins.firebase.core.FlutterFirebasePluginRegistry
1715

1816
/** FirebaseInAppMessagingPlugin */
19-
class FirebaseInAppMessagingPlugin : FlutterFirebasePlugin, FlutterPlugin, MethodCallHandler {
20-
private var channel: MethodChannel? = null
17+
class FirebaseInAppMessagingPlugin :
18+
FlutterFirebasePlugin, FlutterPlugin, FirebaseInAppMessagingHostApi {
19+
private var binaryMessenger: BinaryMessenger? = null
20+
21+
private fun initInstance(messenger: BinaryMessenger) {
22+
FlutterFirebasePluginRegistry.registerPlugin(METHOD_CHANNEL_NAME, this)
23+
binaryMessenger = messenger
24+
FirebaseInAppMessagingHostApi.setUp(messenger, this)
25+
}
2126

2227
override fun onAttachedToEngine(binding: FlutterPluginBinding) {
23-
channel =
24-
MethodChannel(binding.binaryMessenger, METHOD_CHANNEL_NAME).also {
25-
it.setMethodCallHandler(this)
26-
}
28+
initInstance(binding.binaryMessenger)
2729
}
2830

2931
override fun onDetachedFromEngine(binding: FlutterPluginBinding) {
30-
channel?.setMethodCallHandler(null)
31-
channel = null
32+
binaryMessenger = null
33+
FirebaseInAppMessagingHostApi.setUp(binding.binaryMessenger, null)
3234
}
3335

34-
override fun onMethodCall(call: MethodCall, result: Result) {
35-
when (call.method) {
36-
"FirebaseInAppMessaging#triggerEvent" -> {
37-
val eventName = requireNotNull(call.argument<String>("eventName"))
36+
override fun triggerEvent(appName: String, eventName: String, callback: (Result<Unit>) -> Unit) {
37+
FlutterFirebasePlugin.cachedThreadPool.execute {
38+
try {
3839
FirebaseInAppMessaging.getInstance().triggerEvent(eventName)
39-
result.success(null)
40+
callback(Result.success(Unit))
41+
} catch (exception: Exception) {
42+
handleFailure(callback, exception)
4043
}
41-
"FirebaseInAppMessaging#setMessagesSuppressed" -> {
42-
val suppress = requireNotNull(call.argument<Boolean>("suppress"))
44+
}
45+
}
46+
47+
override fun setMessagesSuppressed(
48+
appName: String,
49+
suppress: Boolean,
50+
callback: (Result<Unit>) -> Unit
51+
) {
52+
FlutterFirebasePlugin.cachedThreadPool.execute {
53+
try {
4354
FirebaseInAppMessaging.getInstance().setMessagesSuppressed(suppress)
44-
result.success(null)
55+
callback(Result.success(Unit))
56+
} catch (exception: Exception) {
57+
handleFailure(callback, exception)
4558
}
46-
"FirebaseInAppMessaging#setAutomaticDataCollectionEnabled" -> {
47-
val enabled = call.argument<Boolean>("enabled")
59+
}
60+
}
61+
62+
override fun setAutomaticDataCollectionEnabled(
63+
appName: String,
64+
enabled: Boolean,
65+
callback: (Result<Unit>) -> Unit
66+
) {
67+
FlutterFirebasePlugin.cachedThreadPool.execute {
68+
try {
4869
FirebaseInAppMessaging.getInstance().setAutomaticDataCollectionEnabled(enabled)
49-
result.success(null)
70+
callback(Result.success(Unit))
71+
} catch (exception: Exception) {
72+
handleFailure(callback, exception)
5073
}
51-
else -> result.notImplemented()
5274
}
5375
}
5476

77+
private fun <T> handleFailure(callback: (Result<T>) -> Unit, exception: Exception?) {
78+
val message = exception?.message ?: "An unknown error occurred"
79+
callback(Result.failure(FlutterError("firebase_in_app_messaging", message, null)))
80+
}
81+
5582
override fun getPluginConstantsForFirebaseApp(firebaseApp: FirebaseApp): Task<Map<String, Any>?> {
5683
val taskCompletionSource = TaskCompletionSource<Map<String, Any>?>()
5784

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
// Copyright 2026, the Chromium project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
// Autogenerated from Pigeon (v26.3.4), do not edit directly.
5+
// See also: https://pub.dev/packages/pigeon
6+
@file:Suppress("UNCHECKED_CAST", "ArrayInDataClass")
7+
8+
package io.flutter.plugins.firebase.inappmessaging
9+
10+
import android.util.Log
11+
import io.flutter.plugin.common.BasicMessageChannel
12+
import io.flutter.plugin.common.BinaryMessenger
13+
import io.flutter.plugin.common.MessageCodec
14+
import io.flutter.plugin.common.StandardMessageCodec
15+
import java.io.ByteArrayOutputStream
16+
import java.nio.ByteBuffer
17+
18+
private object GeneratedAndroidFirebaseInAppMessagingPigeonUtils {
19+
20+
fun wrapResult(result: Any?): List<Any?> {
21+
return listOf(result)
22+
}
23+
24+
fun wrapError(exception: Throwable): List<Any?> {
25+
return if (exception is FlutterError) {
26+
listOf(exception.code, exception.message, exception.details)
27+
} else {
28+
listOf(
29+
exception.javaClass.simpleName,
30+
exception.toString(),
31+
"Cause: " + exception.cause + ", Stacktrace: " + Log.getStackTraceString(exception))
32+
}
33+
}
34+
}
35+
36+
/**
37+
* Error class for passing custom error details to Flutter via a thrown PlatformException.
38+
*
39+
* @property code The error code.
40+
* @property message The error message.
41+
* @property details The error details. Must be a datatype supported by the api codec.
42+
*/
43+
class FlutterError(
44+
val code: String,
45+
override val message: String? = null,
46+
val details: Any? = null
47+
) : RuntimeException()
48+
49+
private open class GeneratedAndroidFirebaseInAppMessagingPigeonCodec : StandardMessageCodec() {
50+
override fun readValueOfType(type: Byte, buffer: ByteBuffer): Any? {
51+
return super.readValueOfType(type, buffer)
52+
}
53+
54+
override fun writeValue(stream: ByteArrayOutputStream, value: Any?) {
55+
super.writeValue(stream, value)
56+
}
57+
}
58+
59+
/** Generated interface from Pigeon that represents a handler of messages from Flutter. */
60+
interface FirebaseInAppMessagingHostApi {
61+
fun triggerEvent(appName: String, eventName: String, callback: (Result<Unit>) -> Unit)
62+
63+
fun setMessagesSuppressed(appName: String, suppress: Boolean, callback: (Result<Unit>) -> Unit)
64+
65+
fun setAutomaticDataCollectionEnabled(
66+
appName: String,
67+
enabled: Boolean,
68+
callback: (Result<Unit>) -> Unit
69+
)
70+
71+
companion object {
72+
/** The codec used by FirebaseInAppMessagingHostApi. */
73+
val codec: MessageCodec<Any?> by lazy { GeneratedAndroidFirebaseInAppMessagingPigeonCodec() }
74+
/**
75+
* Sets up an instance of `FirebaseInAppMessagingHostApi` to handle messages through the
76+
* `binaryMessenger`.
77+
*/
78+
@JvmOverloads
79+
fun setUp(
80+
binaryMessenger: BinaryMessenger,
81+
api: FirebaseInAppMessagingHostApi?,
82+
messageChannelSuffix: String = ""
83+
) {
84+
val separatedMessageChannelSuffix =
85+
if (messageChannelSuffix.isNotEmpty()) ".$messageChannelSuffix" else ""
86+
run {
87+
val channel =
88+
BasicMessageChannel<Any?>(
89+
binaryMessenger,
90+
"dev.flutter.pigeon.firebase_in_app_messaging_platform_interface.FirebaseInAppMessagingHostApi.triggerEvent$separatedMessageChannelSuffix",
91+
codec)
92+
if (api != null) {
93+
channel.setMessageHandler { message, reply ->
94+
val args = message as List<Any?>
95+
val appNameArg = args[0] as String
96+
val eventNameArg = args[1] as String
97+
api.triggerEvent(appNameArg, eventNameArg) { result: Result<Unit> ->
98+
val error = result.exceptionOrNull()
99+
if (error != null) {
100+
reply.reply(GeneratedAndroidFirebaseInAppMessagingPigeonUtils.wrapError(error))
101+
} else {
102+
reply.reply(GeneratedAndroidFirebaseInAppMessagingPigeonUtils.wrapResult(null))
103+
}
104+
}
105+
}
106+
} else {
107+
channel.setMessageHandler(null)
108+
}
109+
}
110+
run {
111+
val channel =
112+
BasicMessageChannel<Any?>(
113+
binaryMessenger,
114+
"dev.flutter.pigeon.firebase_in_app_messaging_platform_interface.FirebaseInAppMessagingHostApi.setMessagesSuppressed$separatedMessageChannelSuffix",
115+
codec)
116+
if (api != null) {
117+
channel.setMessageHandler { message, reply ->
118+
val args = message as List<Any?>
119+
val appNameArg = args[0] as String
120+
val suppressArg = args[1] as Boolean
121+
api.setMessagesSuppressed(appNameArg, suppressArg) { result: Result<Unit> ->
122+
val error = result.exceptionOrNull()
123+
if (error != null) {
124+
reply.reply(GeneratedAndroidFirebaseInAppMessagingPigeonUtils.wrapError(error))
125+
} else {
126+
reply.reply(GeneratedAndroidFirebaseInAppMessagingPigeonUtils.wrapResult(null))
127+
}
128+
}
129+
}
130+
} else {
131+
channel.setMessageHandler(null)
132+
}
133+
}
134+
run {
135+
val channel =
136+
BasicMessageChannel<Any?>(
137+
binaryMessenger,
138+
"dev.flutter.pigeon.firebase_in_app_messaging_platform_interface.FirebaseInAppMessagingHostApi.setAutomaticDataCollectionEnabled$separatedMessageChannelSuffix",
139+
codec)
140+
if (api != null) {
141+
channel.setMessageHandler { message, reply ->
142+
val args = message as List<Any?>
143+
val appNameArg = args[0] as String
144+
val enabledArg = args[1] as Boolean
145+
api.setAutomaticDataCollectionEnabled(appNameArg, enabledArg) { result: Result<Unit> ->
146+
val error = result.exceptionOrNull()
147+
if (error != null) {
148+
reply.reply(GeneratedAndroidFirebaseInAppMessagingPigeonUtils.wrapError(error))
149+
} else {
150+
reply.reply(GeneratedAndroidFirebaseInAppMessagingPigeonUtils.wrapResult(null))
151+
}
152+
}
153+
}
154+
} else {
155+
channel.setMessageHandler(null)
156+
}
157+
}
158+
}
159+
}
160+
}

0 commit comments

Comments
 (0)