15
15
package com .google .firebase .inappmessaging .internal ;
16
16
17
17
import android .os .Bundle ;
18
+ import androidx .annotation .GuardedBy ;
18
19
import androidx .annotation .NonNull ;
19
20
import androidx .annotation .Nullable ;
20
21
import com .google .firebase .analytics .connector .AnalyticsConnector ;
@@ -110,23 +111,32 @@ public int getMaxUserProperties(@NonNull String s) {
110
111
111
112
private static class ProxyAnalyticsConnectorHandle implements AnalyticsConnectorHandle {
112
113
private static final Object UNREGISTERED = new Object ();
114
+
115
+ @ GuardedBy ("this" )
113
116
private Set <String > eventNames = new HashSet <>();
114
- private Object instance ;
117
+
118
+ private volatile Object instance ;
115
119
116
120
private ProxyAnalyticsConnectorHandle (
117
121
String s ,
118
122
AnalyticsConnectorListener listener ,
119
123
Deferred <AnalyticsConnector > analyticsConnector ) {
120
124
analyticsConnector .whenAvailable (
121
125
connectorProvider -> {
126
+ Object result = instance ;
127
+ if (result == UNREGISTERED ) {
128
+ return ;
129
+ }
130
+ AnalyticsConnector connector = connectorProvider .get ();
131
+ // Now that analytics is available:
132
+
133
+ // register the listener with analytics.
134
+ AnalyticsConnectorHandle handle =
135
+ connector .registerAnalyticsConnectorListener (s , listener );
136
+ instance = handle ;
137
+
138
+ // propagate registered event names to analytics.
122
139
synchronized (ProxyAnalyticsConnectorHandle .this ) {
123
- if (instance == UNREGISTERED ) {
124
- return ;
125
- }
126
- AnalyticsConnector connector = connectorProvider .get ();
127
- AnalyticsConnectorHandle handle =
128
- connector .registerAnalyticsConnectorListener (s , listener );
129
- instance = handle ;
130
140
if (!eventNames .isEmpty ()) {
131
141
handle .registerEventNames (eventNames );
132
142
eventNames = new HashSet <>();
@@ -136,42 +146,53 @@ private ProxyAnalyticsConnectorHandle(
136
146
}
137
147
138
148
@ Override
139
- public synchronized void unregister () {
140
- if (instance == UNREGISTERED ) {
149
+ public void unregister () {
150
+ Object result = instance ;
151
+ if (result == UNREGISTERED ) {
141
152
return ;
142
153
}
143
- if (instance != null ) {
144
- AnalyticsConnectorHandle handle = (AnalyticsConnectorHandle ) this .instance ;
154
+
155
+ if (result != null ) {
156
+ AnalyticsConnectorHandle handle = (AnalyticsConnectorHandle ) result ;
145
157
handle .unregister ();
146
158
}
147
159
instance = UNREGISTERED ;
148
- eventNames .clear ();
160
+ synchronized (this ) {
161
+ eventNames .clear ();
162
+ }
149
163
}
150
164
151
165
@ Override
152
- public synchronized void registerEventNames (@ NonNull Set <String > set ) {
153
- if (instance == UNREGISTERED ) {
166
+ public void registerEventNames (@ NonNull Set <String > set ) {
167
+ Object result = instance ;
168
+ if (result == UNREGISTERED ) {
154
169
return ;
155
170
}
156
- if (instance != null ) {
157
- AnalyticsConnectorHandle handle = (AnalyticsConnectorHandle ) this .instance ;
171
+
172
+ if (result != null ) {
173
+ AnalyticsConnectorHandle handle = (AnalyticsConnectorHandle ) result ;
158
174
handle .registerEventNames (set );
159
175
return ;
160
176
}
161
- eventNames .addAll (set );
177
+ synchronized (this ) {
178
+ eventNames .addAll (set );
179
+ }
162
180
}
163
181
164
182
@ Override
165
- public synchronized void unregisterEventNames () {
166
- if (instance == UNREGISTERED ) {
183
+ public void unregisterEventNames () {
184
+ Object result = instance ;
185
+ if (result == UNREGISTERED ) {
167
186
return ;
168
187
}
169
- if (instance != null ) {
170
- AnalyticsConnectorHandle handle = (AnalyticsConnectorHandle ) this . instance ;
188
+ if (result != null ) {
189
+ AnalyticsConnectorHandle handle = (AnalyticsConnectorHandle ) result ;
171
190
handle .unregisterEventNames ();
172
191
return ;
173
192
}
174
- eventNames .clear ();
193
+ synchronized (this ) {
194
+ eventNames .clear ();
195
+ }
175
196
}
176
197
}
177
198
}
0 commit comments