Skip to content

Commit 542fec0

Browse files
committed
fix auth state change not broadcast to listeners due to some listeners are in different RestAuthProvider instance
1 parent be586f7 commit 542fec0

File tree

2 files changed

+23
-10
lines changed

2 files changed

+23
-10
lines changed

firebase-auth-rest/core/src/main/java/com/anotherdev/firebase/auth/FirebaseAuthRest.java

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,26 @@
66

77
import java.util.Collection;
88
import java.util.Collections;
9-
import java.util.Map;
109
import java.util.concurrent.ConcurrentHashMap;
1110

1211
public class FirebaseAuthRest {
1312

14-
private static final Map<String, RestAuthTokenRefresher> TOKEN_REFRESHER_MAP = new ConcurrentHashMap<>();
13+
private static final ConcurrentHashMap<String, RestAuthTokenRefresher> TOKEN_REFRESHER_MAP = new ConcurrentHashMap<>();
1514
private static final Collection<RestAuthTokenRefresher> TOKEN_REFRESHER_VIEW =
1615
Collections.unmodifiableCollection(TOKEN_REFRESHER_MAP.values());
1716

1817

1918
public static FirebaseAuth getInstance(FirebaseApp app) {
2019
final String name = app.getName();
21-
final RestAuthProvider auth = new RestAuthProvider(app);
22-
if (!TOKEN_REFRESHER_MAP.containsKey(name)) {
23-
TOKEN_REFRESHER_MAP.put(name, new RestAuthTokenRefresher(auth));
20+
RestAuthTokenRefresher tokenRefresher = TOKEN_REFRESHER_MAP.get(name);
21+
if (tokenRefresher == null) {
22+
RestAuthProvider newAuth = new RestAuthProvider(app);
23+
RestAuthTokenRefresher newTokenRefresher = new RestAuthTokenRefresher(newAuth);
24+
RestAuthTokenRefresher current = TOKEN_REFRESHER_MAP.putIfAbsent(name, newTokenRefresher);
25+
return current != null ? current.getAuth() : newTokenRefresher.getAuth();
26+
} else {
27+
return tokenRefresher.getAuth();
2428
}
25-
return auth;
2629
}
2730

2831
public static Collection<RestAuthTokenRefresher> getTokenRefreshers() {

firebase-auth-rest/core/src/main/java/com/anotherdev/firebase/auth/rest/RestAuthProvider.java

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.anotherdev.firebase.auth.rest;
22

3+
import android.annotation.SuppressLint;
34
import android.text.TextUtils;
45

56
import androidx.annotation.NonNull;
@@ -64,6 +65,19 @@ public class RestAuthProvider implements FirebaseAuth, InternalAuthProvider {
6465
public RestAuthProvider(FirebaseApp app) {
6566
this.app = app;
6667
userStore = Data.from(app.getApplicationContext()).getCurrentUser(SIGNED_OUT);
68+
initIdTokenBroadcast();
69+
}
70+
71+
@SuppressLint("CheckResult")
72+
private void initIdTokenBroadcast() {
73+
//noinspection ResultOfMethodCallIgnored
74+
userStore.asObservable()
75+
.skip(1)
76+
.subscribe(user -> {
77+
for (IdTokenListener listener : listeners) {
78+
listener.onIdTokenChanged(new InternalTokenResult(user.getIdToken()));
79+
}
80+
}, RxUtil.ON_ERROR_LOG_V2);
6781
}
6882

6983
@NonNull
@@ -290,10 +304,6 @@ private void saveCurrentUser(String idToken, String refreshToken) throws Firebas
290304

291305
FirebaseUserImpl user = FirebaseUserImpl.from(app.getName(), idToken, refreshToken);
292306
userStore.set(user);
293-
294-
for (IdTokenListener l : listeners) {
295-
l.onIdTokenChanged(new InternalTokenResult(idToken));
296-
}
297307
}
298308

299309
private SignInResponse getAccountInfo(SignInResponse signInResponse) {

0 commit comments

Comments
 (0)