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()