diff --git a/pom.xml b/pom.xml
index 13b51555c..ab02b660a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -398,6 +398,11 @@
api-common
1.2.0
+
+ com.google.api
+ gax
+ 1.30.0
+
com.google.auth
google-auth-library-oauth2-http
@@ -411,7 +416,7 @@
com.google.cloud
google-cloud-firestore
- 0.45.0-beta
+ 0.61.0-beta
diff --git a/src/main/java/com/google/firebase/FirebaseOptions.java b/src/main/java/com/google/firebase/FirebaseOptions.java
index ae9b23370..3377ee1f9 100644
--- a/src/main/java/com/google/firebase/FirebaseOptions.java
+++ b/src/main/java/com/google/firebase/FirebaseOptions.java
@@ -66,6 +66,7 @@ public final class FirebaseOptions {
private final int readTimeout;
private final JsonFactory jsonFactory;
private final ThreadManager threadManager;
+ private final boolean firestoreTimestampsInSnapshotsEnabled;
private FirebaseOptions(@NonNull FirebaseOptions.Builder builder) {
this.credentials = checkNotNull(builder.credentials,
@@ -94,6 +95,8 @@ private FirebaseOptions(@NonNull FirebaseOptions.Builder builder) {
this.connectTimeout = builder.connectTimeout;
checkArgument(builder.readTimeout >= 0);
this.readTimeout = builder.readTimeout;
+ this.firestoreTimestampsInSnapshotsEnabled =
+ builder.firestoreTimestampsInSnapshotsEnabled;
}
/**
@@ -188,6 +191,14 @@ public int getReadTimeout() {
return readTimeout;
}
+ /**
+ * Returns whether or not {@link com.google.cloud.firestore.DocumentSnapshot DocumentSnapshots}
+ * return timestamp fields as {@link com.google.cloud.Timestamp Timestamps}.
+ */
+ public boolean areFirestoreTimestampsInSnapshotsEnabled() {
+ return firestoreTimestampsInSnapshotsEnabled;
+ }
+
@NonNull
ThreadManager getThreadManager() {
return threadManager;
@@ -218,6 +229,7 @@ public static final class Builder {
private ThreadManager threadManager = FirebaseThreadManagers.DEFAULT_THREAD_MANAGER;
private int connectTimeout;
private int readTimeout;
+ private boolean firestoreTimestampsInSnapshotsEnabled;
/** Constructs an empty builder. */
public Builder() {}
@@ -239,6 +251,7 @@ public Builder(FirebaseOptions options) {
threadManager = options.threadManager;
connectTimeout = options.connectTimeout;
readTimeout = options.readTimeout;
+ firestoreTimestampsInSnapshotsEnabled = options.firestoreTimestampsInSnapshotsEnabled;
}
/**
@@ -411,6 +424,20 @@ public Builder setReadTimeout(int readTimeout) {
return this;
}
+ /**
+ * Sets whether timestamps are enabled in Firestore
+ * {@link com.google.cloud.firestore.DocumentSnapshot DocumentSnapshots}.
+ *
+ * @param firestoreTimestampsInSnapshotsEnabled If true, timestamps are enabled in Firestore
+ * DocumentSnapshots.
+ * @return This Builder
instance is returned so subsequent calls can be chained.
+ */
+ public Builder setFirestoreTimestampsInSnapshotsEnabled(
+ boolean firestoreTimestampsInSnapshotsEnabled) {
+ this.firestoreTimestampsInSnapshotsEnabled = firestoreTimestampsInSnapshotsEnabled;
+ return this;
+ }
+
/**
* Builds the {@link FirebaseOptions} instance from the previously set options.
*
diff --git a/src/main/java/com/google/firebase/cloud/FirestoreClient.java b/src/main/java/com/google/firebase/cloud/FirestoreClient.java
index 210124972..1a9027cae 100644
--- a/src/main/java/com/google/firebase/cloud/FirestoreClient.java
+++ b/src/main/java/com/google/firebase/cloud/FirestoreClient.java
@@ -35,6 +35,8 @@ private FirestoreClient(FirebaseApp app) {
+ "set the project ID explicitly via FirebaseOptions. Alternatively you can also "
+ "set the project ID via the GOOGLE_CLOUD_PROJECT environment variable.");
this.firestore = FirestoreOptions.newBuilder()
+ .setTimestampsInSnapshotsEnabled(
+ app.getOptions().areFirestoreTimestampsInSnapshotsEnabled())
.setCredentials(ImplFirebaseTrampolines.getCredentials(app))
.setProjectId(projectId)
.build()
diff --git a/src/test/java/com/google/firebase/cloud/FirestoreClientTest.java b/src/test/java/com/google/firebase/cloud/FirestoreClientTest.java
index 737eab1fe..46755f255 100644
--- a/src/test/java/com/google/firebase/cloud/FirestoreClientTest.java
+++ b/src/test/java/com/google/firebase/cloud/FirestoreClientTest.java
@@ -46,6 +46,33 @@ public void testServiceAccountProjectId() throws IOException {
assertEquals("mock-project-id", firestore.getOptions().getProjectId());
}
+ @Test
+ public void testFirestoreTimestampsInSnapshotsEnabled_defaultsToFalse() throws IOException {
+ FirebaseApp app = FirebaseApp.initializeApp(new FirebaseOptions.Builder()
+ .setCredentials(GoogleCredentials.fromStream(ServiceAccount.EDITOR.asStream()))
+ .setProjectId("explicit-project-id")
+ .build());
+ Firestore firestore = FirestoreClient.getFirestore(app);
+ assertEquals(false, firestore.getOptions().areTimestampsInSnapshotsEnabled());
+
+ firestore = FirestoreClient.getFirestore();
+ assertEquals(false, firestore.getOptions().areTimestampsInSnapshotsEnabled());
+ }
+
+ @Test
+ public void testFirestoreTimestampsInSnapshotsEnabled_setToTrue() throws IOException {
+ FirebaseApp app = FirebaseApp.initializeApp(new FirebaseOptions.Builder()
+ .setCredentials(GoogleCredentials.fromStream(ServiceAccount.EDITOR.asStream()))
+ .setProjectId("explicit-project-id")
+ .setFirestoreTimestampsInSnapshotsEnabled(true)
+ .build());
+ Firestore firestore = FirestoreClient.getFirestore(app);
+ assertEquals(true, firestore.getOptions().areTimestampsInSnapshotsEnabled());
+
+ firestore = FirestoreClient.getFirestore();
+ assertEquals(true, firestore.getOptions().areTimestampsInSnapshotsEnabled());
+ }
+
@Test
public void testAppDelete() throws IOException {
FirebaseApp app = FirebaseApp.initializeApp(new FirebaseOptions.Builder()