Skip to content

Commit 82a8c04

Browse files
add setup for Firebase Storage and initial FirebaseStorage class
1 parent 2fc9c04 commit 82a8c04

File tree

12 files changed

+331
-1
lines changed

12 files changed

+331
-1
lines changed

build.gradle.kts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ tasks {
4444
"firebase-firestore:updateVersion", "firebase-firestore:updateDependencyVersion",
4545
"firebase-functions:updateVersion", "firebase-functions:updateDependencyVersion",
4646
"firebase-installations:updateVersion", "firebase-installations:updateDependencyVersion",
47-
"firebase-perf:updateVersion", "firebase-perf:updateDependencyVersion"
47+
"firebase-perf:updateVersion", "firebase-perf:updateDependencyVersion",
48+
"firebase-storage:updateVersion", "firebase-storage:updateDependencyVersion"
4849
)
4950
}
5051
}

firebase-storage/build.gradle.kts

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
/*
2+
* Copyright (c) 2020 GitLive Ltd. Use of this source code is governed by the Apache 2.0 license.
3+
*/
4+
5+
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
6+
import org.jetbrains.kotlin.konan.target.KonanTarget
7+
8+
version = project.property("firebase-storage.version") as String
9+
10+
plugins {
11+
id("com.android.library")
12+
kotlin("multiplatform")
13+
kotlin("native.cocoapods")
14+
}
15+
16+
android {
17+
compileSdk = property("targetSdkVersion") as Int
18+
defaultConfig {
19+
minSdk = property("minSdkVersion") as Int
20+
targetSdk = property("targetSdkVersion") as Int
21+
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
22+
multiDexEnabled = true
23+
}
24+
sourceSets {
25+
getByName("main") {
26+
manifest.srcFile("src/androidMain/AndroidManifest.xml")
27+
}
28+
getByName("androidTest"){
29+
java.srcDir(file("src/androidAndroidTest/kotlin"))
30+
manifest.srcFile("src/androidAndroidTest/AndroidManifest.xml")
31+
}
32+
}
33+
testOptions {
34+
unitTests.apply {
35+
isIncludeAndroidResources = true
36+
}
37+
}
38+
packagingOptions {
39+
resources.pickFirsts.add("META-INF/kotlinx-serialization-core.kotlin_module")
40+
resources.pickFirsts.add("META-INF/AL2.0")
41+
resources.pickFirsts.add("META-INF/LGPL2.1")
42+
}
43+
lint {
44+
abortOnError = false
45+
}
46+
}
47+
48+
val supportIosTarget = project.property("skipIosTarget") != "true"
49+
50+
kotlin {
51+
52+
android {
53+
publishAllLibraryVariants()
54+
}
55+
56+
if (supportIosTarget) {
57+
ios()
58+
iosSimulatorArm64()
59+
cocoapods {
60+
ios.deploymentTarget = "11.0"
61+
framework {
62+
baseName = "FirebaseStorage"
63+
}
64+
noPodspec()
65+
pod("FirebaseStorage") {
66+
version = "10.7.0"
67+
}
68+
}
69+
}
70+
71+
js {
72+
useCommonJs()
73+
browser {
74+
testTask {
75+
useKarma {
76+
useChromeHeadless()
77+
}
78+
}
79+
}
80+
}
81+
82+
sourceSets {
83+
all {
84+
languageSettings.apply {
85+
apiVersion = "1.6"
86+
languageVersion = "1.6"
87+
progressiveMode = true
88+
optIn("kotlinx.coroutines.ExperimentalCoroutinesApi")
89+
}
90+
}
91+
92+
val commonMain by getting {
93+
dependencies {
94+
api(project(":firebase-app"))
95+
implementation(project(":firebase-common"))
96+
}
97+
}
98+
99+
val androidMain by getting {
100+
dependencies {
101+
api("com.google.firebase:firebase-storage")
102+
}
103+
}
104+
105+
if (supportIosTarget) {
106+
val iosMain by getting
107+
val iosSimulatorArm64Main by getting
108+
iosSimulatorArm64Main.dependsOn(iosMain)
109+
110+
val iosTest by sourceSets.getting
111+
val iosSimulatorArm64Test by sourceSets.getting
112+
iosSimulatorArm64Test.dependsOn(iosTest)
113+
}
114+
115+
val jsMain by getting
116+
}
117+
}
118+
119+
if (project.property("firebase-storage.skipIosTests") == "true") {
120+
tasks.forEach {
121+
if (it.name.contains("ios", true) && it.name.contains("test", true)) { it.enabled = false }
122+
}
123+
}
124+
125+
if (project.property("firebase-storage.skipJsTests") == "true") {
126+
tasks.forEach {
127+
if (it.name.contains("js", true) && it.name.contains("test", true)) { it.enabled = false }
128+
}
129+
}
130+
131+
signing {
132+
val signingKey: String? by project
133+
val signingPassword: String? by project
134+
useInMemoryPgpKeys(signingKey, signingPassword)
135+
sign(publishing.publications)
136+
}

firebase-storage/firebase_storage.podspec

Whitespace-only changes.

firebase-storage/package.json

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
{
2+
"name": "@gitlive/firebase-storage",
3+
"version": "1.8.1",
4+
"description": "Wrapper around firebase for usage in Kotlin Multiplatform projects",
5+
"main": "firebase-storage.js",
6+
"scripts": {
7+
"test": "echo \"Error: no test specified\" && exit 1"
8+
},
9+
"repository": {
10+
"type": "git",
11+
"url": "git+https://github.com/GitLiveApp/firebase-kotlin-sdk.git"
12+
},
13+
"keywords": [
14+
"kotlin",
15+
"multiplatform",
16+
"kotlin-js",
17+
"firebase"
18+
],
19+
"author": "dev.gitlive",
20+
"license": "Apache-2.0",
21+
"bugs": {
22+
"url": "https://github.com/GitLiveApp/firebase-kotlin-sdk/issues"
23+
},
24+
"homepage": "https://github.com/GitLiveApp/firebase-kotlin-sdk",
25+
"dependencies": {
26+
"@gitlive/firebase-app": "1.8.1",
27+
"firebase": "9.19.1",
28+
"kotlin": "1.6.10",
29+
"kotlinx-coroutines-core": "1.6.1-native-mt"
30+
}
31+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
2+
package="dev.gitlive.firebase.storage">
3+
4+
<application android:usesCleartextTraffic="true" />
5+
</manifest>
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<manifest package="dev.gitlive.firebase.storage"/>
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/*
2+
* Copyright (c) 2020 GitLive Ltd. Use of this source code is governed by the Apache 2.0 license.
3+
*/
4+
5+
@file:JvmName("android")
6+
package dev.gitlive.firebase.storage
7+
8+
import dev.gitlive.firebase.Firebase
9+
import dev.gitlive.firebase.FirebaseApp
10+
import dev.gitlive.firebase.FirebaseException
11+
12+
actual val Firebase.storage get() =
13+
FirebaseStorage(com.google.firebase.storage.FirebaseStorage.getInstance())
14+
15+
actual fun Firebase.storage(app: FirebaseApp) =
16+
FirebaseStorage(com.google.firebase.storage.FirebaseStorage.getInstance(app.android))
17+
18+
actual class FirebaseStorage(val android: com.google.firebase.storage.FirebaseStorage) {
19+
20+
actual fun getMaxOperationRetryTimeMillis(): Long = android.maxOperationRetryTimeMillis
21+
22+
actual fun getMaxUploadRetryTimeMillis(): Long = android.maxUploadRetryTimeMillis
23+
24+
actual fun setMaxOperationRetryTimeMillis(maxOperationRetryTimeMillis: Long) {
25+
android.maxOperationRetryTimeMillis = maxOperationRetryTimeMillis
26+
}
27+
28+
actual fun setMaxUploadRetryTimeMillis(maxUploadRetryTimeMillis: Long) {
29+
android.maxUploadRetryTimeMillis = maxUploadRetryTimeMillis
30+
}
31+
32+
actual fun useEmulator(host: String, port: Int) {
33+
android.useEmulator(host, port)
34+
}
35+
36+
}
37+
38+
actual open class StorageException(message: String) : FirebaseException(message)
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package dev.gitlive.firebase.storage
2+
3+
import dev.gitlive.firebase.Firebase
4+
import dev.gitlive.firebase.FirebaseApp
5+
import dev.gitlive.firebase.FirebaseException
6+
import kotlinx.coroutines.flow.Flow
7+
8+
/** Returns the [FirebaseStorage] instance of the default [FirebaseApp]. */
9+
expect val Firebase.storage: FirebaseStorage
10+
11+
/** Returns the [FirebaseStorage] instance of a given [FirebaseApp]. */
12+
expect fun Firebase.storage(app: FirebaseApp): FirebaseStorage
13+
14+
expect class FirebaseStorage {
15+
fun getMaxOperationRetryTimeMillis(): Long
16+
fun getMaxUploadRetryTimeMillis(): Long
17+
fun setMaxOperationRetryTimeMillis(maxOperationRetryTimeMillis: Long)
18+
fun setMaxUploadRetryTimeMillis(maxUploadRetryTimeMillis: Long)
19+
fun useEmulator(host: String, port: Int)
20+
}
21+
22+
expect open class StorageException : FirebaseException
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/*
2+
* Copyright (c) 2020 GitLive Ltd. Use of this source code is governed by the Apache 2.0 license.
3+
*/
4+
5+
package dev.gitlive.firebase.storage
6+
7+
import cocoapods.FirebaseStorage.FIRStorage
8+
import dev.gitlive.firebase.Firebase
9+
import dev.gitlive.firebase.FirebaseApp
10+
import dev.gitlive.firebase.FirebaseException
11+
12+
13+
actual val Firebase.storage get() =
14+
FirebaseStorage(FIRStorage.storage())
15+
16+
actual fun Firebase.storage(app: FirebaseApp): FirebaseStorage = FirebaseStorage(
17+
FIRStorage.storageForApp(app.ios as objcnames.classes.FIRApp)
18+
)
19+
20+
actual class FirebaseStorage(val ios: FIRStorage) {
21+
22+
actual fun getMaxOperationRetryTimeMillis(): Long = ios.maxOperationRetryTime().toLong()
23+
24+
actual fun getMaxUploadRetryTimeMillis(): Long = ios.maxUploadRetryTime().toLong()
25+
26+
actual fun setMaxOperationRetryTimeMillis(maxOperationRetryTimeMillis: Long) {
27+
ios.setMaxOperationRetryTime(maxOperationRetryTimeMillis.toDouble())
28+
}
29+
30+
actual fun setMaxUploadRetryTimeMillis(maxUploadRetryTimeMillis: Long) {
31+
ios.setMaxUploadRetryTime(maxUploadRetryTimeMillis.toDouble())
32+
}
33+
34+
actual fun useEmulator(host: String, port: Int) {
35+
ios.useEmulatorWithHost(host, port.toLong())
36+
}
37+
38+
}
39+
40+
actual open class StorageException(message: String) : FirebaseException(message)
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
/*
2+
* Copyright (c) 2020 GitLive Ltd. Use of this source code is governed by the Apache 2.0 license.
3+
*/
4+
5+
package dev.gitlive.firebase.storage
6+
7+
import dev.gitlive.firebase.Firebase
8+
import dev.gitlive.firebase.FirebaseApp
9+
import dev.gitlive.firebase.FirebaseException
10+
import dev.gitlive.firebase.firebase
11+
12+
13+
actual val Firebase.storage get() =
14+
rethrow { dev.gitlive.firebase.firestore; FirebaseStorage(firebase.storage()) }
15+
16+
actual fun Firebase.storage(app: FirebaseApp) =
17+
rethrow { dev.gitlive.firebase.firestore; FirebaseStorage(firebase.app().storage()) }
18+
19+
actual class FirebaseStorage(val js: firebase.storage.Storage) {
20+
21+
actual fun getMaxOperationRetryTimeMillis(): Long = js.maxOperationRetryTime.toLong()
22+
23+
actual fun getMaxUploadRetryTimeMillis(): Long = js.maxUploadRetryTime.toLong()
24+
25+
actual fun setMaxOperationRetryTimeMillis(maxOperationRetryTimeMillis: Long) {
26+
js.setMaxOperationRetryTime(maxOperationRetryTimeMillis.toInt())
27+
}
28+
29+
actual fun setMaxUploadRetryTimeMillis(maxUploadRetryTimeMillis: Long) {
30+
js.setMaxUploadRetryTime(maxUploadRetryTimeMillis.toInt())
31+
}
32+
33+
actual fun useEmulator(host: String, port: Int) {
34+
js.useEmulator(host, port)
35+
}
36+
37+
}
38+
39+
inline fun <T, R> T.rethrow(function: T.() -> R): R = dev.gitlive.firebase.storage.rethrow { function() }
40+
41+
inline fun <R> rethrow(function: () -> R): R {
42+
try {
43+
return function()
44+
} catch (e: Exception) {
45+
throw e
46+
} catch(e: dynamic) {
47+
throw StorageException(e.code as String, e)
48+
}
49+
}
50+
51+
actual open class StorageException(code: String, cause: Throwable) :
52+
FirebaseException(code, cause)

gradle.properties

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ firebase-functions.skipIosTests=false
3434
firebase-installations.skipIosTests=false
3535
firebase-perf.skipIosTests=false
3636
firebase-crashlytics.skipIosTests=false
37+
firebase-storage.skipIosTests=false
3738

3839
# We can have the functionality to skip js tests, due to compatibility issues.
3940
firebase-app.skipJsTests=false
@@ -45,6 +46,7 @@ firebase-firestore.skipJsTests=false
4546
firebase-functions.skipJsTests=false
4647
firebase-installations.skipJsTests=false
4748
firebase-perf.skipJsTests=false
49+
firebase-storage.skipJsTests=false
4850

4951
# Versions:
5052
firebase-app.version=1.8.1
@@ -57,3 +59,4 @@ firebase-functions.version=1.8.1
5759
firebase-installations.version=1.8.1
5860
firebase-perf.version=1.8.1
5961
firebase-crashlytics.version=1.8.1
62+
firebase-storage.version=1.8.1

settings.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ include(
99
"firebase-installations",
1010
"firebase-perf",
1111
"firebase-crashlytics",
12+
"firebase-storage",
1213
"test-utils"
1314
)
1415

0 commit comments

Comments
 (0)