diff --git a/src/main/java/com/google/firebase/FirebaseOptions.java b/src/main/java/com/google/firebase/FirebaseOptions.java index 8e7a29ccb..a7aeed498 100644 --- a/src/main/java/com/google/firebase/FirebaseOptions.java +++ b/src/main/java/com/google/firebase/FirebaseOptions.java @@ -24,6 +24,7 @@ import com.google.api.client.util.Key; import com.google.auth.oauth2.GoogleCredentials; import com.google.cloud.firestore.FirestoreOptions; +import com.google.cloud.storage.StorageOptions; import com.google.common.base.Strings; import com.google.common.base.Supplier; import com.google.common.base.Suppliers; @@ -86,6 +87,8 @@ public GoogleCredentials get() { private final ThreadManager threadManager; private final FirestoreOptions firestoreOptions; + private final StorageOptions storageOptions; + private FirebaseOptions(@NonNull final FirebaseOptions.Builder builder) { this.databaseUrl = builder.databaseUrl; this.credentialsSupplier = checkNotNull( @@ -113,6 +116,7 @@ private FirebaseOptions(@NonNull final FirebaseOptions.Builder builder) { checkArgument(builder.readTimeout >= 0); this.readTimeout = builder.readTimeout; this.firestoreOptions = builder.firestoreOptions; + this.storageOptions = builder.storageOptions; } /** @@ -216,6 +220,10 @@ FirestoreOptions getFirestoreOptions() { return firestoreOptions; } + public StorageOptions getStorageOptions() { + return storageOptions; + } + /** * Creates an empty builder. * @@ -251,6 +259,8 @@ public static final class Builder { @Key("storageBucket") private String storageBucket; + private StorageOptions storageOptions; + @Key("serviceAccountId") private String serviceAccountId; private Supplier credentialsSupplier; @@ -290,6 +300,7 @@ public Builder(FirebaseOptions options) { connectTimeout = options.connectTimeout; readTimeout = options.readTimeout; firestoreOptions = options.firestoreOptions; + storageOptions = options.storageOptions; } /** @@ -495,6 +506,11 @@ public Builder setReadTimeout(int readTimeout) { return this; } + public Builder setStorageOptions(StorageOptions storageOptions) { + this.storageOptions = storageOptions; + return this; + } + /** * Builds the {@link FirebaseOptions} instance from the previously set options. * diff --git a/src/main/java/com/google/firebase/cloud/StorageClient.java b/src/main/java/com/google/firebase/cloud/StorageClient.java index 955abd7e2..8c727f08c 100644 --- a/src/main/java/com/google/firebase/cloud/StorageClient.java +++ b/src/main/java/com/google/firebase/cloud/StorageClient.java @@ -19,6 +19,7 @@ import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; +import com.google.cloud.firestore.FirestoreOptions; import com.google.cloud.storage.Bucket; import com.google.cloud.storage.Storage; import com.google.cloud.storage.StorageOptions; @@ -46,6 +47,9 @@ public class StorageClient { StorageClient(FirebaseApp app, Storage storage) { this.app = checkNotNull(app, "FirebaseApp must not be null"); this.storage = checkNotNull(storage, "Storage must not be null"); + + StorageOptions userOptions = app.getOptions().getStorageOptions(); + } public static StorageClient getInstance() { @@ -56,7 +60,10 @@ public static synchronized StorageClient getInstance(FirebaseApp app) { StorageClientService service = ImplFirebaseTrampolines.getService(app, SERVICE_ID, StorageClientService.class); if (service == null) { - Storage storage = StorageOptions.newBuilder() + StorageOptions userOptions = app.getOptions().getStorageOptions(); + StorageOptions.Builder builder = userOptions != null ? userOptions.toBuilder() : + StorageOptions.newBuilder(); + Storage storage = builder .setCredentials(ImplFirebaseTrampolines.getCredentials(app)) .build() .getService(); diff --git a/src/test/java/com/google/firebase/cloud/StorageClientIT.java b/src/test/java/com/google/firebase/cloud/StorageClientIT.java index 57fe58b82..f9087817c 100644 --- a/src/test/java/com/google/firebase/cloud/StorageClientIT.java +++ b/src/test/java/com/google/firebase/cloud/StorageClientIT.java @@ -21,10 +21,14 @@ import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; +import com.google.auth.oauth2.GoogleCredentials; import com.google.cloud.storage.Blob; import com.google.cloud.storage.Bucket; +import com.google.cloud.storage.Storage; +import com.google.cloud.storage.StorageOptions; import com.google.common.io.CharStreams; import com.google.firebase.testing.IntegrationTestUtils; +import com.google.firebase.testing.ServiceAccount; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; @@ -88,4 +92,15 @@ private Blob createTextBlob(Bucket bucket, String contents) { return bucket.create(fileName, contents.getBytes(), "text/plain"); } + @Test + public void testStorageOptions() throws IOException { + Storage storage = StorageOptions.newBuilder() + .setCredentials(GoogleCredentials.fromStream(ServiceAccount.EDITOR.asStream())) + .setProjectId("explicit-project-id") + .setHost("explicit-host") + .build().getService(); + assertEquals("explicit-project-id", storage.getOptions().getProjectId()); + assertEquals("explicit-host", storage.getOptions().getHost()); + } + }