Skip to content

Commit bdda3d2

Browse files
committed
[Experimental] Use dagger in functions.
1 parent 283e2c8 commit bdda3d2

File tree

10 files changed

+116
-56
lines changed

10 files changed

+116
-56
lines changed

firebase-functions/firebase-functions.gradle

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
plugins {
1616
id 'firebase-library'
17+
id 'firebase-vendor'
1718
}
1819

1920
firebaseLibrary {
@@ -68,6 +69,12 @@ dependencies {
6869

6970
implementation 'com.squareup.okhttp3:okhttp:3.12.1'
7071

72+
implementation 'javax.inject:javax.inject:1'
73+
vendor ('com.google.dagger:dagger:2.43.2') {
74+
exclude group: "javax.inject", module: "javax.inject"
75+
}
76+
annotationProcessor 'com.google.dagger:dagger-compiler:2.43.2'
77+
7178
annotationProcessor 'com.google.auto.value:auto-value:1.6.2'
7279

7380
javadocClasspath 'com.google.code.findbugs:jsr305:3.0.2'

firebase-functions/src/androidTest/java/com/google/firebase/functions/CallTest.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222

2323
import androidx.test.InstrumentationRegistry;
2424
import androidx.test.ext.junit.runners.AndroidJUnit4;
25-
2625
import com.google.android.gms.tasks.Task;
2726
import com.google.android.gms.tasks.Tasks;
2827
import com.google.firebase.FirebaseApp;
@@ -86,7 +85,6 @@ public void testToken() throws InterruptedException, ExecutionException {
8685
// Override the normal token provider to simulate FirebaseAuth being logged in.
8786
FirebaseFunctions functions =
8887
new FirebaseFunctions(
89-
app,
9088
app.getApplicationContext(),
9189
app.getOptions().getProjectId(),
9290
"us-central1",
@@ -108,7 +106,6 @@ public void testInstanceId() throws InterruptedException, ExecutionException {
108106
// Override the normal token provider to simulate FirebaseAuth being logged in.
109107
FirebaseFunctions functions =
110108
new FirebaseFunctions(
111-
app,
112109
app.getApplicationContext(),
113110
app.getOptions().getProjectId(),
114111
"us-central1",
@@ -130,7 +127,6 @@ public void testAppCheck() throws InterruptedException, ExecutionException {
130127
// Override the normal token provider to simulate FirebaseAuth being logged in.
131128
FirebaseFunctions functions =
132129
new FirebaseFunctions(
133-
app,
134130
app.getApplicationContext(),
135131
app.getOptions().getProjectId(),
136132
"us-central1",

firebase-functions/src/main/java/com/google/firebase/functions/FirebaseContextProvider.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,11 @@
2626
import com.google.firebase.internal.api.FirebaseNoSignedInUserException;
2727
import java.util.concurrent.Executor;
2828
import java.util.concurrent.atomic.AtomicReference;
29+
import javax.inject.Inject;
30+
import javax.inject.Singleton;
2931

3032
/** A ContextProvider that uses FirebaseAuth to get the token. */
33+
@Singleton
3134
class FirebaseContextProvider implements ContextProvider {
3235
private final String TAG = "FirebaseContextProvider";
3336

@@ -37,6 +40,7 @@ class FirebaseContextProvider implements ContextProvider {
3740
new AtomicReference<>();
3841
private final Executor executor;
3942

43+
@Inject
4044
FirebaseContextProvider(
4145
Provider<InternalAuthProvider> tokenProvider,
4246
Provider<FirebaseInstanceIdInternal> instanceId,

firebase-functions/src/main/java/com/google/firebase/functions/FirebaseFunctions.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,16 @@
3030
import com.google.firebase.annotations.concurrent.Lightweight;
3131
import com.google.firebase.emulators.EmulatedServiceSettings;
3232
import com.google.firebase.functions.FirebaseFunctionsException.Code;
33+
import dagger.assisted.Assisted;
34+
import dagger.assisted.AssistedInject;
3335
import java.io.IOException;
3436
import java.io.InterruptedIOException;
3537
import java.net.MalformedURLException;
3638
import java.net.URL;
3739
import java.util.HashMap;
3840
import java.util.Map;
3941
import java.util.concurrent.Executor;
42+
import javax.inject.Named;
4043
import okhttp3.Call;
4144
import okhttp3.Callback;
4245
import okhttp3.MediaType;
@@ -59,9 +62,6 @@ public class FirebaseFunctions {
5962
*/
6063
private static boolean providerInstallStarted = false;
6164

62-
// The FirebaseApp instance
63-
private final FirebaseApp app;
64-
6565
// The network client to use for HTTPS requests.
6666
private final OkHttpClient client;
6767

@@ -88,14 +88,13 @@ public class FirebaseFunctions {
8888
// Emulator settings
8989
@Nullable private EmulatedServiceSettings emulatorSettings;
9090

91+
@AssistedInject
9192
FirebaseFunctions(
92-
FirebaseApp app,
9393
Context context,
94-
String projectId,
95-
String regionOrCustomDomain,
94+
@Named("projectId") String projectId,
95+
@Assisted String regionOrCustomDomain,
9696
ContextProvider contextProvider,
9797
@Lightweight Executor executor) {
98-
this.app = app;
9998
this.executor = executor;
10099
this.client = new OkHttpClient();
101100
this.serializer = new Serializer();
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.google.firebase.functions;
2+
3+
import dagger.assisted.Assisted;
4+
import dagger.assisted.AssistedFactory;
5+
6+
@AssistedFactory
7+
interface FirebaseFunctionsFactory {
8+
FirebaseFunctions create(@Assisted String regionOrCustomDomain);
9+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package com.google.firebase.functions;
2+
3+
import android.content.Context;
4+
import com.google.firebase.FirebaseOptions;
5+
import com.google.firebase.annotations.concurrent.Lightweight;
6+
import com.google.firebase.appcheck.interop.InternalAppCheckTokenProvider;
7+
import com.google.firebase.auth.internal.InternalAuthProvider;
8+
import com.google.firebase.iid.internal.FirebaseInstanceIdInternal;
9+
import com.google.firebase.inject.Deferred;
10+
import com.google.firebase.inject.Provider;
11+
import dagger.BindsInstance;
12+
import dagger.Component;
13+
import java.util.concurrent.Executor;
14+
import javax.inject.Singleton;
15+
16+
/** @hide */
17+
@Component(modules = MainModule.class)
18+
@Singleton
19+
interface FunctionsComponent {
20+
FunctionsMultiResourceComponent getMultiResourceComponent();
21+
22+
@Component.Builder
23+
interface Builder {
24+
@BindsInstance
25+
Builder setApplicationContext(Context applicationContext);
26+
27+
@BindsInstance
28+
Builder setFirebaseOptions(FirebaseOptions options);
29+
30+
@BindsInstance
31+
Builder setLiteExecutor(@Lightweight Executor executor);
32+
33+
@BindsInstance
34+
Builder setAuth(Provider<InternalAuthProvider> auth);
35+
36+
@BindsInstance
37+
Builder setIid(Provider<FirebaseInstanceIdInternal> iid);
38+
39+
@BindsInstance
40+
Builder setAppCheck(Deferred<InternalAppCheckTokenProvider> appCheck);
41+
42+
FunctionsComponent build();
43+
}
44+
}

firebase-functions/src/main/java/com/google/firebase/functions/FunctionsMultiResourceComponent.java

Lines changed: 11 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,14 @@
1414

1515
package com.google.firebase.functions;
1616

17-
import android.content.Context;
1817
import androidx.annotation.GuardedBy;
19-
import com.google.firebase.FirebaseApp;
20-
import com.google.firebase.annotations.concurrent.Lightweight;
2118
import java.util.HashMap;
2219
import java.util.Map;
23-
import java.util.concurrent.Executor;
20+
import javax.inject.Inject;
21+
import javax.inject.Singleton;
2422

2523
/** Multi-resource container for Functions. */
24+
@Singleton
2625
class FunctionsMultiResourceComponent {
2726
/**
2827
* A static map from instance key to FirebaseFunctions instances. Instance keys region names.
@@ -32,32 +31,20 @@ class FunctionsMultiResourceComponent {
3231
@GuardedBy("this")
3332
private final Map<String, FirebaseFunctions> instances = new HashMap<>();
3433

35-
private final Context applicationContext;
36-
private final ContextProvider contextProvider;
37-
private final FirebaseApp app;
38-
private final Executor executor;
34+
private final FirebaseFunctionsFactory functionsFactory;
3935

40-
FunctionsMultiResourceComponent(
41-
Context applicationContext,
42-
ContextProvider contextProvider,
43-
FirebaseApp app,
44-
@Lightweight Executor executor) {
45-
this.applicationContext = applicationContext;
46-
this.contextProvider = contextProvider;
47-
this.app = app;
48-
this.executor = executor;
36+
@Inject
37+
FunctionsMultiResourceComponent(FirebaseFunctionsFactory functionsFactory) {
38+
this.functionsFactory = functionsFactory;
4939
}
5040

5141
synchronized FirebaseFunctions get(String regionOrCustomDomain) {
5242
FirebaseFunctions functions = instances.get(regionOrCustomDomain);
53-
String projectId = app.getOptions().getProjectId();
54-
55-
if (functions == null) {
56-
functions =
57-
new FirebaseFunctions(
58-
app, applicationContext, projectId, regionOrCustomDomain, contextProvider, executor);
59-
instances.put(regionOrCustomDomain, functions);
43+
if (functions != null) {
44+
return functions;
6045
}
46+
functions = functionsFactory.create(regionOrCustomDomain);
47+
instances.put(regionOrCustomDomain, functions);
6148
return functions;
6249
}
6350
}

firebase-functions/src/main/java/com/google/firebase/functions/FunctionsRegistrar.java

Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
import android.content.Context;
1818
import androidx.annotation.Keep;
19-
import com.google.firebase.FirebaseApp;
19+
import com.google.firebase.FirebaseOptions;
2020
import com.google.firebase.annotations.concurrent.Lightweight;
2121
import com.google.firebase.appcheck.interop.InternalAppCheckTokenProvider;
2222
import com.google.firebase.auth.internal.InternalAuthProvider;
@@ -43,30 +43,25 @@ public class FunctionsRegistrar implements ComponentRegistrar {
4343
public List<Component<?>> getComponents() {
4444
Qualified<Executor> liteExecutor = Qualified.qualified(Lightweight.class, Executor.class);
4545
return Arrays.asList(
46-
Component.builder(ContextProvider.class)
47-
.add(Dependency.optionalProvider(InternalAuthProvider.class))
48-
.add(Dependency.requiredProvider(FirebaseInstanceIdInternal.class))
49-
.add(Dependency.deferred(InternalAppCheckTokenProvider.class))
50-
.factory(
51-
c ->
52-
new FirebaseContextProvider(
53-
c.getProvider(InternalAuthProvider.class),
54-
c.getProvider(FirebaseInstanceIdInternal.class),
55-
c.getDeferred(InternalAppCheckTokenProvider.class),
56-
c.get(liteExecutor)))
57-
.build(),
5846
Component.builder(FunctionsMultiResourceComponent.class)
5947
.name(LIBRARY_NAME)
6048
.add(Dependency.required(Context.class))
61-
.add(Dependency.required(ContextProvider.class))
62-
.add(Dependency.required(FirebaseApp.class))
49+
.add(Dependency.required(FirebaseOptions.class))
50+
.add(Dependency.required(liteExecutor))
51+
.add(Dependency.optionalProvider(InternalAuthProvider.class))
52+
.add(Dependency.requiredProvider(FirebaseInstanceIdInternal.class))
53+
.add(Dependency.deferred(InternalAppCheckTokenProvider.class))
6354
.factory(
6455
c ->
65-
new FunctionsMultiResourceComponent(
66-
c.get(Context.class),
67-
c.get(ContextProvider.class),
68-
c.get(FirebaseApp.class),
69-
c.get(liteExecutor)))
56+
DaggerFunctionsComponent.builder()
57+
.setApplicationContext(c.get(Context.class))
58+
.setFirebaseOptions(c.get(FirebaseOptions.class))
59+
.setLiteExecutor(c.get(liteExecutor))
60+
.setAuth(c.getProvider(InternalAuthProvider.class))
61+
.setIid(c.getProvider(FirebaseInstanceIdInternal.class))
62+
.setAppCheck(c.getDeferred(InternalAppCheckTokenProvider.class))
63+
.build()
64+
.getMultiResourceComponent())
7065
.build(),
7166
LibraryVersionComponent.create(LIBRARY_NAME, BuildConfig.VERSION_NAME));
7267
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.google.firebase.functions;
2+
3+
import com.google.firebase.FirebaseOptions;
4+
import dagger.Binds;
5+
import dagger.Module;
6+
import dagger.Provides;
7+
import javax.inject.Named;
8+
9+
@Module
10+
interface MainModule {
11+
@Provides
12+
@Named("projectId")
13+
static String bindProjectId(FirebaseOptions options) {
14+
return options.getProjectId();
15+
}
16+
17+
@Binds
18+
ContextProvider contextProvider(FirebaseContextProvider provider);
19+
}

firebase-functions/src/main/java/com/google/firebase/functions/Serializer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ class Serializer {
3838

3939
private final DateFormat dateFormat;
4040

41-
public Serializer() {
41+
Serializer() {
4242
// Encode Dates as UTC ISO 8601 strings.
4343
dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US);
4444
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));

0 commit comments

Comments
 (0)