@@ -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,22 +161,31 @@ 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 fetchTokenResultFromProvider ();
165
+ }
166
+
167
+ @ NonNull
168
+ @ Override
169
+ public Task <AppCheckToken > getAppCheckToken (boolean forceRefresh ) {
170
+ if (!forceRefresh && hasValidToken ()) {
171
+ return Tasks .forResult (cachedToken );
172
+ }
173
+ if (appCheckProvider == null ) {
174
+ return Tasks .forException (new FirebaseException ("No AppCheckProvider installed." ));
175
+ }
140
176
return fetchTokenFromProvider ();
141
177
}
142
178
143
179
/** Fetches an {@link AppCheckTokenResult} via the installed {@link AppCheckProvider}. */
144
- Task <AppCheckTokenResult > fetchTokenFromProvider () {
145
- return appCheckProvider
146
- .getToken ()
180
+ Task <AppCheckTokenResult > fetchTokenResultFromProvider () {
181
+ return fetchTokenFromProvider ()
147
182
.continueWithTask (
148
183
new Continuation <AppCheckToken , Task <AppCheckTokenResult >>() {
149
184
@ Override
150
185
public Task <AppCheckTokenResult > then (@ NonNull Task <AppCheckToken > task ) {
151
186
if (task .isSuccessful ()) {
152
- AppCheckToken token = task .getResult ();
153
- updateStoredToken (token );
154
187
AppCheckTokenResult tokenResult =
155
- DefaultAppCheckTokenResult .constructFromAppCheckToken (token );
188
+ DefaultAppCheckTokenResult .constructFromAppCheckToken (task . getResult () );
156
189
for (AppCheckTokenListener listener : appCheckTokenListenerList ) {
157
190
listener .onAppCheckTokenChanged (tokenResult );
158
191
}
@@ -168,6 +201,26 @@ public Task<AppCheckTokenResult> then(@NonNull Task<AppCheckToken> task) {
168
201
});
169
202
}
170
203
204
+ /** Fetches an {@link AppCheckToken} via the installed {@link AppCheckProvider}. */
205
+ Task <AppCheckToken > fetchTokenFromProvider () {
206
+ return appCheckProvider
207
+ .getToken ()
208
+ .continueWithTask (
209
+ new Continuation <AppCheckToken , Task <AppCheckToken >>() {
210
+ @ Override
211
+ public Task <AppCheckToken > then (@ NonNull Task <AppCheckToken > task ) {
212
+ if (task .isSuccessful ()) {
213
+ AppCheckToken token = task .getResult ();
214
+ updateStoredToken (token );
215
+ for (AppCheckListener listener : appCheckListenerList ) {
216
+ listener .onAppCheckTokenChanged (token );
217
+ }
218
+ }
219
+ return task ;
220
+ }
221
+ });
222
+ }
223
+
171
224
@ Nullable
172
225
String getUserAgent () {
173
226
return userAgentPublisherProvider .get () != null
0 commit comments