|
3 | 3 | // found in the LICENSE file. |
4 | 4 | package io.flutter.plugins.firebase.installations.firebase_app_installations |
5 | 5 |
|
| 6 | +import android.os.Handler |
| 7 | +import android.os.Looper |
6 | 8 | import com.google.firebase.installations.FirebaseInstallations |
7 | 9 | import com.google.firebase.installations.internal.FidListener |
| 10 | +import com.google.firebase.installations.internal.FidListenerHandle |
8 | 11 | import io.flutter.plugin.common.EventChannel |
9 | 12 |
|
10 | 13 | class TokenChannelStreamHandler(private val firebaseInstallations: FirebaseInstallations) : |
11 | 14 | EventChannel.StreamHandler { |
12 | 15 |
|
13 | 16 | private var listener: FidListener? = null |
| 17 | + private var listenerHandle: FidListenerHandle? = null |
| 18 | + private val mainHandler = Handler(Looper.getMainLooper()) |
14 | 19 |
|
15 | 20 | override fun onListen(arguments: Any?, events: EventChannel.EventSink) { |
16 | 21 | listener = createTokenEventListener(events) |
17 | | - firebaseInstallations.registerFidListener(listener!!) |
| 22 | + listenerHandle = firebaseInstallations.registerFidListener(listener!!) |
18 | 23 | } |
19 | 24 |
|
20 | 25 | override fun onCancel(arguments: Any?) { |
| 26 | + listenerHandle?.unregister() |
| 27 | + listenerHandle = null |
21 | 28 | listener = null |
22 | 29 | } |
23 | 30 |
|
24 | 31 | 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 | + } |
26 | 37 | } |
27 | 38 | } |
0 commit comments