Skip to content

Commit 5974c5e

Browse files
Make Auth an deferred dependency (#2418)
1 parent ea89473 commit 5974c5e

File tree

6 files changed

+63
-69
lines changed

6 files changed

+63
-69
lines changed

firebase-database/firebase-database.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ dependencies {
7878
implementation 'com.google.android.gms:play-services-basement:17.0.0'
7979
implementation 'com.google.android.gms:play-services-base:17.0.0'
8080
implementation 'com.google.android.gms:play-services-tasks:17.0.0'
81-
implementation('com.google.firebase:firebase-auth-interop:18.0.0') {
81+
implementation('com.google.firebase:firebase-auth-interop:19.0.2') {
8282
exclude group: "com.google.firebase", module: "firebase-common"
8383
}
8484

firebase-database/src/androidTest/java/com/google/firebase/database/IntegrationTestHelpers.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,11 @@ public static DatabaseConfig newTestConfig() {
261261
config.setEventTarget(new TestEventTarget());
262262
config.setRunLoop(runLoop);
263263
config.setFirebaseApp(FirebaseApp.getInstance());
264-
config.setAuthTokenProvider(AndroidAuthTokenProvider.forUnauthenticatedAccess());
264+
config.setAuthTokenProvider(
265+
new AndroidAuthTokenProvider(
266+
never -> {
267+
// Auth is not available in our integration tests
268+
}));
265269
config.setSessionPersistenceKey(UUID.randomUUID().toString());
266270
return config;
267271
}

firebase-database/src/main/java/com/google/firebase/database/DatabaseRegistrar.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,11 @@ public List<Component<?>> getComponents() {
3434
return Arrays.asList(
3535
Component.builder(FirebaseDatabaseComponent.class)
3636
.add(Dependency.required(FirebaseApp.class))
37-
.add(Dependency.optional(InternalAuthProvider.class))
37+
.add(Dependency.deferred(InternalAuthProvider.class))
3838
.factory(
3939
c ->
4040
new FirebaseDatabaseComponent(
41-
c.get(FirebaseApp.class), c.get(InternalAuthProvider.class)))
41+
c.get(FirebaseApp.class), c.getDeferred(InternalAuthProvider.class)))
4242
.build(),
4343
LibraryVersionComponent.create("fire-rtdb", BuildConfig.VERSION_NAME));
4444
}

firebase-database/src/main/java/com/google/firebase/database/FirebaseDatabaseComponent.java

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,13 @@
1515
package com.google.firebase.database;
1616

1717
import androidx.annotation.NonNull;
18-
import androidx.annotation.Nullable;
1918
import com.google.firebase.FirebaseApp;
2019
import com.google.firebase.auth.internal.InternalAuthProvider;
2120
import com.google.firebase.database.android.AndroidAuthTokenProvider;
2221
import com.google.firebase.database.core.AuthTokenProvider;
2322
import com.google.firebase.database.core.DatabaseConfig;
2423
import com.google.firebase.database.core.RepoInfo;
24+
import com.google.firebase.inject.Deferred;
2525
import java.util.HashMap;
2626
import java.util.Map;
2727

@@ -38,14 +38,9 @@ class FirebaseDatabaseComponent {
3838
private final FirebaseApp app;
3939
private final AuthTokenProvider authProvider;
4040

41-
FirebaseDatabaseComponent(@NonNull FirebaseApp app, @Nullable InternalAuthProvider authProvider) {
41+
FirebaseDatabaseComponent(@NonNull FirebaseApp app, Deferred<InternalAuthProvider> authProvider) {
4242
this.app = app;
43-
44-
if (authProvider != null) {
45-
this.authProvider = AndroidAuthTokenProvider.forAuthenticatedAccess(authProvider);
46-
} else {
47-
this.authProvider = AndroidAuthTokenProvider.forUnauthenticatedAccess();
48-
}
43+
this.authProvider = new AndroidAuthTokenProvider(authProvider);
4944
}
5045

5146
/** Provides instances of Firebase Database for the given RepoInfo */

firebase-database/src/main/java/com/google/firebase/database/android/AndroidAuthTokenProvider.java

Lines changed: 47 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -18,76 +18,67 @@
1818
import com.google.android.gms.tasks.Task;
1919
import com.google.firebase.FirebaseApiNotAvailableException;
2020
import com.google.firebase.auth.GetTokenResult;
21-
import com.google.firebase.auth.internal.IdTokenListener;
2221
import com.google.firebase.auth.internal.InternalAuthProvider;
2322
import com.google.firebase.database.core.AuthTokenProvider;
23+
import com.google.firebase.inject.Deferred;
2424
import com.google.firebase.internal.api.FirebaseNoSignedInUserException;
2525
import java.util.concurrent.ExecutorService;
26+
import java.util.concurrent.atomic.AtomicReference;
2627

27-
public abstract class AndroidAuthTokenProvider implements AuthTokenProvider {
28+
public class AndroidAuthTokenProvider implements AuthTokenProvider {
29+
private final Deferred<InternalAuthProvider> deferredAuthProvider;
30+
private final AtomicReference<InternalAuthProvider> internalAuth;
2831

29-
public static AuthTokenProvider forAuthenticatedAccess(
30-
@NonNull final InternalAuthProvider authProvider) {
31-
return new AuthTokenProvider() {
32-
@Override
33-
public void getToken(
34-
boolean forceRefresh, @NonNull final GetTokenCompletionListener listener) {
35-
Task<GetTokenResult> getTokenResult = authProvider.getAccessToken(forceRefresh);
32+
public AndroidAuthTokenProvider(Deferred<InternalAuthProvider> deferredAuthProvider) {
33+
this.deferredAuthProvider = deferredAuthProvider;
34+
this.internalAuth = new AtomicReference<>();
3635

37-
getTokenResult
38-
.addOnSuccessListener(result -> listener.onSuccess(result.getToken()))
39-
.addOnFailureListener(
40-
e -> {
41-
if (isUnauthenticatedUsage(e)) {
42-
listener.onSuccess(null);
43-
} else {
44-
// TODO: Figure out how to plumb errors through in a sane way.
45-
listener.onError(e.getMessage());
46-
}
47-
});
48-
}
36+
deferredAuthProvider.whenAvailable(authProvider -> internalAuth.set(authProvider.get()));
37+
}
4938

50-
@Override
51-
public void addTokenChangeListener(
52-
final ExecutorService executorService, final TokenChangeListener tokenListener) {
53-
IdTokenListener idTokenListener =
54-
tokenResult ->
55-
executorService.execute(
56-
() -> tokenListener.onTokenChange(/* nullable */ tokenResult.getToken()));
57-
authProvider.addIdTokenListener(idTokenListener);
58-
}
39+
@Override
40+
public void getToken(boolean forceRefresh, @NonNull final GetTokenCompletionListener listener) {
41+
InternalAuthProvider authProvider = internalAuth.get();
5942

60-
@Override
61-
public void removeTokenChangeListener(TokenChangeListener tokenListener) {
62-
// TODO Implement removeIdTokenListener.
63-
}
64-
};
65-
}
43+
if (authProvider != null) {
44+
Task<GetTokenResult> getTokenResult = authProvider.getAccessToken(forceRefresh);
6645

67-
public static AuthTokenProvider forUnauthenticatedAccess() {
68-
return new AuthTokenProvider() {
69-
@Override
70-
public void getToken(boolean forceRefresh, GetTokenCompletionListener listener) {
71-
listener.onSuccess(null);
72-
}
46+
getTokenResult
47+
.addOnSuccessListener(result -> listener.onSuccess(result.getToken()))
48+
.addOnFailureListener(
49+
e -> {
50+
if (isUnauthenticatedUsage(e)) {
51+
listener.onSuccess(null);
52+
} else {
53+
// TODO: Figure out how to plumb errors through in a sane way.
54+
listener.onError(e.getMessage());
55+
}
56+
});
57+
} else {
58+
listener.onSuccess(null);
59+
}
60+
}
7361

74-
@Override
75-
public void addTokenChangeListener(
76-
ExecutorService executorService, TokenChangeListener listener) {
77-
executorService.execute(() -> listener.onTokenChange(null));
78-
}
62+
@Override
63+
public void addTokenChangeListener(
64+
final ExecutorService executorService, final TokenChangeListener tokenListener) {
65+
deferredAuthProvider.whenAvailable(
66+
provider ->
67+
provider
68+
.get()
69+
.addIdTokenListener(
70+
tokenResult ->
71+
executorService.execute(
72+
() -> tokenListener.onTokenChange(tokenResult.getToken()))));
73+
}
7974

80-
@Override
81-
public void removeTokenChangeListener(TokenChangeListener listener) {}
82-
};
75+
@Override
76+
public void removeTokenChangeListener(TokenChangeListener tokenListener) {
77+
// TODO Implement removeIdTokenListener.
8378
}
8479

8580
private static boolean isUnauthenticatedUsage(Exception e) {
86-
if (e instanceof FirebaseApiNotAvailableException
87-
|| e instanceof FirebaseNoSignedInUserException) {
88-
return true;
89-
}
90-
91-
return false;
81+
return e instanceof FirebaseApiNotAvailableException
82+
|| e instanceof FirebaseNoSignedInUserException;
9283
}
9384
}

firebase-database/src/test/java/com/google/firebase/database/UnitTestHelpers.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,11 @@ public static DatabaseConfig newTestConfig() {
167167
config.setEventTarget(new TestEventTarget());
168168
config.setRunLoop(runLoop);
169169
config.setFirebaseApp(FirebaseApp.getInstance());
170-
config.setAuthTokenProvider(AndroidAuthTokenProvider.forUnauthenticatedAccess());
170+
config.setAuthTokenProvider(
171+
new AndroidAuthTokenProvider(
172+
never -> {
173+
// Auth is not available in our unit tests
174+
}));
171175
return config;
172176
}
173177

0 commit comments

Comments
 (0)