@@ -46,6 +46,7 @@ public class DefaultFirebaseAppCheck extends FirebaseAppCheck {
46
46
private final Provider <UserAgentPublisher > userAgentPublisherProvider ;
47
47
private final Provider <HeartBeatInfo > heartBeatInfoProvider ;
48
48
private final List <AppCheckTokenListener > appCheckTokenListenerList ;
49
+ private final List <AppCheckListener > appCheckListenerList ;
49
50
private final StorageHelper storageHelper ;
50
51
private final TokenRefreshManager tokenRefreshManager ;
51
52
private final Clock clock ;
@@ -65,6 +66,7 @@ public DefaultFirebaseAppCheck(
65
66
this .userAgentPublisherProvider = userAgentPublisherProvider ;
66
67
this .heartBeatInfoProvider = heartBeatInfoProvider ;
67
68
this .appCheckTokenListenerList = new ArrayList <>();
69
+ this .appCheckListenerList = new ArrayList <>();
68
70
this .storageHelper =
69
71
new StorageHelper (firebaseApp .getApplicationContext (), firebaseApp .getPersistenceKey ());
70
72
this .tokenRefreshManager =
@@ -110,7 +112,8 @@ public void resetAppCheckState() {
110
112
public void addAppCheckTokenListener (@ NonNull AppCheckTokenListener listener ) {
111
113
checkNotNull (listener );
112
114
appCheckTokenListenerList .add (listener );
113
- tokenRefreshManager .onListenerCountChanged (appCheckTokenListenerList .size ());
115
+ tokenRefreshManager .onListenerCountChanged (
116
+ appCheckTokenListenerList .size () + appCheckListenerList .size ());
114
117
// If there is a token available, trigger the listener with the current token.
115
118
if (hasValidToken ()) {
116
119
listener .onAppCheckTokenChanged (
@@ -122,7 +125,28 @@ public void addAppCheckTokenListener(@NonNull AppCheckTokenListener listener) {
122
125
public void removeAppCheckTokenListener (@ NonNull AppCheckTokenListener listener ) {
123
126
checkNotNull (listener );
124
127
appCheckTokenListenerList .remove (listener );
125
- tokenRefreshManager .onListenerCountChanged (appCheckTokenListenerList .size ());
128
+ tokenRefreshManager .onListenerCountChanged (
129
+ appCheckTokenListenerList .size () + appCheckListenerList .size ());
130
+ }
131
+
132
+ @ Override
133
+ public void addAppCheckListener (@ NonNull AppCheckListener listener ) {
134
+ checkNotNull (listener );
135
+ appCheckListenerList .add (listener );
136
+ tokenRefreshManager .onListenerCountChanged (
137
+ appCheckTokenListenerList .size () + appCheckListenerList .size ());
138
+ // If there is a token available, trigger the listener with the current token.
139
+ if (hasValidToken ()) {
140
+ listener .onAppCheckTokenChanged (cachedToken );
141
+ }
142
+ }
143
+
144
+ @ Override
145
+ public void removeAppCheckListener (@ NonNull AppCheckListener listener ) {
146
+ checkNotNull (listener );
147
+ appCheckListenerList .remove (listener );
148
+ tokenRefreshManager .onListenerCountChanged (
149
+ appCheckTokenListenerList .size () + appCheckListenerList .size ());
126
150
}
127
151
128
152
@ NonNull
@@ -137,33 +161,58 @@ public Task<AppCheckTokenResult> getToken(boolean forceRefresh) {
137
161
new FirebaseException ("No AppCheckProvider installed." )));
138
162
}
139
163
// TODO: Cache the in-flight task.
164
+ return fetchTokenFromProvider ()
165
+ .continueWithTask (
166
+ new Continuation <AppCheckToken , Task <AppCheckTokenResult >>() {
167
+ @ Override
168
+ public Task <AppCheckTokenResult > then (@ NonNull Task <AppCheckToken > task ) {
169
+ if (task .isSuccessful ()) {
170
+ return Tasks .forResult (
171
+ DefaultAppCheckTokenResult .constructFromAppCheckToken (task .getResult ()));
172
+ }
173
+ // If the token exchange failed, return a dummy token for integrators to attach in
174
+ // their headers.
175
+ return Tasks .forResult (
176
+ DefaultAppCheckTokenResult .constructFromError (
177
+ new FirebaseException (
178
+ task .getException ().getMessage (), task .getException ())));
179
+ }
180
+ });
181
+ }
182
+
183
+ @ NonNull
184
+ @ Override
185
+ public Task <AppCheckToken > getAppCheckToken (boolean forceRefresh ) {
186
+ if (!forceRefresh && hasValidToken ()) {
187
+ return Tasks .forResult (cachedToken );
188
+ }
189
+ if (appCheckProvider == null ) {
190
+ return Tasks .forException (new FirebaseException ("No AppCheckProvider installed." ));
191
+ }
140
192
return fetchTokenFromProvider ();
141
193
}
142
194
143
- /** Fetches an {@link AppCheckTokenResult } via the installed {@link AppCheckProvider}. */
144
- Task <AppCheckTokenResult > fetchTokenFromProvider () {
195
+ /** Fetches an {@link AppCheckToken } via the installed {@link AppCheckProvider}. */
196
+ Task <AppCheckToken > fetchTokenFromProvider () {
145
197
return appCheckProvider
146
198
.getToken ()
147
199
.continueWithTask (
148
- new Continuation <AppCheckToken , Task <AppCheckTokenResult >>() {
200
+ new Continuation <AppCheckToken , Task <AppCheckToken >>() {
149
201
@ Override
150
- public Task <AppCheckTokenResult > then (@ NonNull Task <AppCheckToken > task ) {
202
+ public Task <AppCheckToken > then (@ NonNull Task <AppCheckToken > task ) {
151
203
if (task .isSuccessful ()) {
152
204
AppCheckToken token = task .getResult ();
153
205
updateStoredToken (token );
206
+ for (AppCheckListener listener : appCheckListenerList ) {
207
+ listener .onAppCheckTokenChanged (token );
208
+ }
154
209
AppCheckTokenResult tokenResult =
155
210
DefaultAppCheckTokenResult .constructFromAppCheckToken (token );
156
211
for (AppCheckTokenListener listener : appCheckTokenListenerList ) {
157
212
listener .onAppCheckTokenChanged (tokenResult );
158
213
}
159
- return Tasks .forResult (tokenResult );
160
214
}
161
- // If the token exchange failed, return a dummy token for integrators to attach in
162
- // their headers.
163
- return Tasks .forResult (
164
- DefaultAppCheckTokenResult .constructFromError (
165
- new FirebaseException (
166
- task .getException ().getMessage (), task .getException ())));
215
+ return task ;
167
216
}
168
217
});
169
218
}
0 commit comments