Skip to content

Commit efed3e2

Browse files
authored
fix(app_installations,android): dispatch ID-change events on the main thread (#18652)
FidListener runs on Firebase's blocking executor, and EventSink.success must be called on the main looper. Fixes #18646
1 parent 2fd8aa8 commit efed3e2

1 file changed

Lines changed: 13 additions & 2 deletions

File tree

  • packages/firebase_app_installations/firebase_app_installations/android/src/main/kotlin/io/flutter/plugins/firebase/installations/firebase_app_installations

‎packages/firebase_app_installations/firebase_app_installations/android/src/main/kotlin/io/flutter/plugins/firebase/installations/firebase_app_installations/TokenChannelStreamHandler.kt‎

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,36 @@
33
// found in the LICENSE file.
44
package io.flutter.plugins.firebase.installations.firebase_app_installations
55

6+
import android.os.Handler
7+
import android.os.Looper
68
import com.google.firebase.installations.FirebaseInstallations
79
import com.google.firebase.installations.internal.FidListener
10+
import com.google.firebase.installations.internal.FidListenerHandle
811
import io.flutter.plugin.common.EventChannel
912

1013
class TokenChannelStreamHandler(private val firebaseInstallations: FirebaseInstallations) :
1114
EventChannel.StreamHandler {
1215

1316
private var listener: FidListener? = null
17+
private var listenerHandle: FidListenerHandle? = null
18+
private val mainHandler = Handler(Looper.getMainLooper())
1419

1520
override fun onListen(arguments: Any?, events: EventChannel.EventSink) {
1621
listener = createTokenEventListener(events)
17-
firebaseInstallations.registerFidListener(listener!!)
22+
listenerHandle = firebaseInstallations.registerFidListener(listener!!)
1823
}
1924

2025
override fun onCancel(arguments: Any?) {
26+
listenerHandle?.unregister()
27+
listenerHandle = null
2128
listener = null
2229
}
2330

2431
internal fun createTokenEventListener(events: EventChannel.EventSink): FidListener {
25-
return FidListener { token -> events.success(mapOf("token" to token)) }
32+
return FidListener { token ->
33+
// FidListener is invoked on Firebase's blocking executor. EventSink
34+
// must be used on the main thread.
35+
mainHandler.post { events.success(mapOf("token" to token)) }
36+
}
2637
}
2738
}

0 commit comments

Comments
 (0)