@@ -48,6 +48,8 @@ static Listener* g_listener = nullptr;
48
48
49
49
// Keep track of the most recent token received.
50
50
static std::string* g_prev_token_received = nullptr ;
51
+ // Keep track if that token was receieved without a listener set.
52
+ static bool g_has_pending_token = false ;
51
53
52
54
namespace internal {
53
55
@@ -91,11 +93,17 @@ Listener* SetListener(Listener* listener) {
91
93
g_prev_token_received = new std::string;
92
94
}
93
95
g_listener = listener;
96
+ // If we have a pending token, send it before notifying other systems about the listener.
97
+ if (g_listener && g_has_pending_token && g_prev_token_received) {
98
+ g_listener->OnTokenReceived (g_prev_token_received->c_str ());
99
+ g_has_pending_token = false ;
100
+ }
94
101
NotifyListenerSet (listener);
95
102
if (!listener && g_prev_token_received) {
96
103
std::string* ptr = g_prev_token_received;
97
104
g_prev_token_received = nullptr ;
98
105
delete ptr;
106
+ g_has_pending_token = false ;
99
107
}
100
108
return previous_listener;
101
109
}
@@ -119,13 +127,20 @@ void NotifyListenerOnTokenReceived(const char* token) {
119
127
MutexLock lock (g_listener_lock);
120
128
// If we have a previous token that we've notified any listener about, check
121
129
// to ensure no repeat.
122
- if (g_prev_token_received) {
123
- if (*g_prev_token_received == token) {
124
- return ;
125
- }
126
- *g_prev_token_received = token;
130
+ if (g_prev_token_received && *g_prev_token_received == token) {
131
+ return ;
132
+ }
133
+
134
+ if (!g_prev_token_received) g_prev_token_received = new std::string;
135
+ *g_prev_token_received = token;
136
+
137
+ if (g_listener) {
138
+ g_listener->OnTokenReceived (token);
139
+ } else {
140
+ // Set so that if a listener is set in the future, it will be sent
141
+ // the token, since the underlying platform won't send it again.
142
+ g_has_pending_token = true ;
127
143
}
128
- if (g_listener) g_listener->OnTokenReceived (token);
129
144
}
130
145
131
146
class PollableListenerImpl {
0 commit comments