27
27
import com .google .android .gms .tasks .Tasks ;
28
28
import com .google .firebase .FirebaseApp ;
29
29
import com .google .firebase .auth .internal .InternalAuthProvider ;
30
+ import com .google .firebase .emulators .EmulatedServiceSettings ;
31
+ import com .google .firebase .emulators .EmulatorSettings ;
32
+ import com .google .firebase .emulators .FirebaseEmulator ;
30
33
import com .google .firebase .firestore .FirebaseFirestoreException .Code ;
31
34
import com .google .firebase .firestore .auth .CredentialsProvider ;
32
35
import com .google .firebase .firestore .auth .EmptyCredentialsProvider ;
55
58
*/
56
59
public class FirebaseFirestore {
57
60
61
+ /** Emulator identifier. See {@link FirebaseApp#enableEmulators(EmulatorSettings)} */
62
+ public static FirebaseEmulator EMULATOR = FirebaseEmulator .forName ("firestore" );
63
+
58
64
/**
59
65
* Provides a registry management interface for {@code FirebaseFirestore} instances.
60
66
*
@@ -81,6 +87,7 @@ public interface InstanceRegistry {
81
87
private FirebaseFirestoreSettings settings ;
82
88
private volatile FirestoreClient client ;
83
89
private final GrpcMetadataProvider metadataProvider ;
90
+ private final EmulatedServiceSettings emulatorSettings ;
84
91
85
92
@ NonNull
86
93
public static FirebaseFirestore getInstance () {
@@ -144,7 +151,8 @@ static FirebaseFirestore newInstance(
144
151
queue ,
145
152
app ,
146
153
instanceRegistry ,
147
- metadataProvider );
154
+ metadataProvider ,
155
+ app .getEmulatorSettings ().getServiceSettings (EMULATOR ));
148
156
return firestore ;
149
157
}
150
158
@@ -157,7 +165,8 @@ static FirebaseFirestore newInstance(
157
165
AsyncQueue asyncQueue ,
158
166
@ Nullable FirebaseApp firebaseApp ,
159
167
InstanceRegistry instanceRegistry ,
160
- @ Nullable GrpcMetadataProvider metadataProvider ) {
168
+ @ Nullable GrpcMetadataProvider metadataProvider ,
169
+ @ Nullable EmulatedServiceSettings emulatorSettings ) {
161
170
this .context = checkNotNull (context );
162
171
this .databaseId = checkNotNull (checkNotNull (databaseId ));
163
172
this .userDataReader = new UserDataReader (databaseId );
@@ -168,8 +177,12 @@ static FirebaseFirestore newInstance(
168
177
this .firebaseApp = firebaseApp ;
169
178
this .instanceRegistry = instanceRegistry ;
170
179
this .metadataProvider = metadataProvider ;
180
+ this .emulatorSettings = emulatorSettings ;
171
181
172
- settings = new FirebaseFirestoreSettings .Builder ().build ();
182
+ this .settings = new FirebaseFirestoreSettings .Builder ().build ();
183
+ if (this .emulatorSettings != null ) {
184
+ this .settings = mergeEmulatorSettings (settings , emulatorSettings );
185
+ }
173
186
}
174
187
175
188
/** Returns the settings used by this {@code FirebaseFirestore} object. */
@@ -193,6 +206,11 @@ public void setFirestoreSettings(@NonNull FirebaseFirestoreSettings settings) {
193
206
+ "You can only call setFirestoreSettings() before calling any other methods on a "
194
207
+ "FirebaseFirestore object." );
195
208
}
209
+
210
+ if (this .emulatorSettings != null ) {
211
+ settings = mergeEmulatorSettings (settings , this .emulatorSettings );
212
+ }
213
+
196
214
this .settings = settings ;
197
215
}
198
216
}
@@ -215,6 +233,23 @@ private void ensureClientConfigured() {
215
233
}
216
234
}
217
235
236
+ private FirebaseFirestoreSettings mergeEmulatorSettings (
237
+ @ NonNull FirebaseFirestoreSettings settings ,
238
+ @ NonNull EmulatedServiceSettings emulatorSettings ) {
239
+
240
+ if (!FirebaseFirestoreSettings .DEFAULT_HOST .equals (settings .getHost ())) {
241
+ throw new IllegalStateException (
242
+ "Cannot change the Firestore host through FirebaseFirestoreSettings when "
243
+ + "EmulatedServiceSettings are also in effect. "
244
+ + "Make sure to only set the host in one location." );
245
+ }
246
+
247
+ return new FirebaseFirestoreSettings .Builder (settings )
248
+ .setHost (emulatorSettings .getHost () + ":" + emulatorSettings .getPort ())
249
+ .setSslEnabled (false )
250
+ .build ();
251
+ }
252
+
218
253
/** Returns the FirebaseApp instance to which this {@code FirebaseFirestore} belongs. */
219
254
@ NonNull
220
255
public FirebaseApp getApp () {
0 commit comments