Skip to content

Commit 93d88f4

Browse files
committed
Use API aligned with Android specifications
1 parent f063b30 commit 93d88f4

File tree

11 files changed

+393
-198
lines changed

11 files changed

+393
-198
lines changed

firebase-database/src/androidMain/kotlin/dev/gitlive/firebase/database/database.kt

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -71,16 +71,6 @@ actual class FirebaseDatabase internal constructor(val android: com.google.fireb
7171
) = instances.getOrPut(android) { dev.gitlive.firebase.database.FirebaseDatabase(android) }
7272
}
7373

74-
actual data class Settings(
75-
actual val persistenceEnabled: Boolean = false,
76-
actual val persistenceCacheSizeBytes: Long? = null,
77-
) {
78-
79-
actual companion object {
80-
actual fun createSettings(persistenceEnabled: Boolean, persistenceCacheSizeBytes: Long?) = Settings(persistenceEnabled, persistenceCacheSizeBytes)
81-
}
82-
}
83-
8474
private var persistenceEnabled = true
8575

8676
actual fun reference(path: String) =
@@ -89,10 +79,13 @@ actual class FirebaseDatabase internal constructor(val android: com.google.fireb
8979
actual fun reference() =
9080
DatabaseReference(NativeDatabaseReference(android.reference, persistenceEnabled))
9181

92-
actual fun setSettings(settings: Settings) {
93-
android.setPersistenceEnabled(settings.persistenceEnabled)
94-
persistenceEnabled = settings.persistenceEnabled
95-
settings.persistenceCacheSizeBytes?.let { android.setPersistenceCacheSizeBytes(it) }
82+
actual fun setPersistenceEnabled(enabled: Boolean) {
83+
android.setPersistenceEnabled(enabled)
84+
persistenceEnabled = enabled
85+
}
86+
87+
actual fun setPersistenceCacheSizeBytes(cacheSizeInBytes: Long) {
88+
android.setPersistenceCacheSizeBytes(cacheSizeInBytes)
9689
}
9790

9891
actual fun setLoggingEnabled(enabled: Boolean) =

firebase-database/src/commonMain/kotlin/dev/gitlive/firebase/database/database.kt

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -33,24 +33,14 @@ expect fun Firebase.database(app: FirebaseApp, url: String): FirebaseDatabase
3333

3434
expect class FirebaseDatabase {
3535

36-
class Settings {
37-
val persistenceEnabled: Boolean
38-
val persistenceCacheSizeBytes: Long?
39-
40-
companion object {
41-
fun createSettings(persistenceEnabled: Boolean = false, persistenceCacheSizeBytes: Long? = null): Settings
42-
}
43-
}
44-
4536
fun reference(path: String): DatabaseReference
4637
fun reference(): DatabaseReference
47-
fun setSettings(settings: Settings)
4838
fun setLoggingEnabled(enabled: Boolean)
39+
fun setPersistenceEnabled(enabled: Boolean)
40+
fun setPersistenceCacheSizeBytes(cacheSizeInBytes: Long)
4941
fun useEmulator(host: String, port: Int)
5042
}
5143

52-
fun FirebaseDatabase.setPersistenceEnabled(enabled: Boolean) = setSettings(FirebaseDatabase.Settings.createSettings(persistenceEnabled = enabled))
53-
5444
data class ChildEvent internal constructor(
5545
val snapshot: DataSnapshot,
5646
val type: Type,

firebase-database/src/iosMain/kotlin/dev/gitlive/firebase/database/database.kt

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -57,27 +57,22 @@ actual fun Firebase.database(app: FirebaseApp, url: String): FirebaseDatabase =
5757

5858
actual class FirebaseDatabase internal constructor(val ios: FIRDatabase) {
5959

60-
actual data class Settings(
61-
actual val persistenceEnabled: Boolean = false,
62-
actual val persistenceCacheSizeBytes: Long? = null,
63-
val callbackQueue: dispatch_queue_t = null
64-
) {
65-
66-
actual companion object {
67-
actual fun createSettings(persistenceEnabled: Boolean, persistenceCacheSizeBytes: Long?) = Settings(persistenceEnabled, persistenceCacheSizeBytes)
68-
}
69-
}
70-
7160
actual fun reference(path: String) =
7261
DatabaseReference(NativeDatabaseReference(ios.referenceWithPath(path), ios.persistenceEnabled))
7362

7463
actual fun reference() =
7564
DatabaseReference(NativeDatabaseReference(ios.reference(), ios.persistenceEnabled))
7665

77-
actual fun setSettings(settings: Settings) {
78-
ios.persistenceEnabled = settings.persistenceEnabled
79-
settings.persistenceCacheSizeBytes?.let { ios.setPersistenceCacheSizeBytes(it.toULong()) }
80-
settings.callbackQueue?.let { ios.callbackQueue = it }
66+
actual fun setPersistenceEnabled(enabled: Boolean) {
67+
ios.persistenceEnabled = enabled
68+
}
69+
70+
actual fun setPersistenceCacheSizeBytes(cacheSizeInBytes: Long) {
71+
ios.setPersistenceCacheSizeBytes(cacheSizeInBytes.toULong())
72+
}
73+
74+
fun setCallbackQueue(callbackQueue: dispatch_queue_t) {
75+
ios.callbackQueue = callbackQueue
8176
}
8277

8378
actual fun setLoggingEnabled(enabled: Boolean) =

firebase-database/src/jsMain/kotlin/dev/gitlive/firebase/database/database.kt

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -68,19 +68,10 @@ actual fun Firebase.database(app: FirebaseApp, url: String) =
6868

6969
actual class FirebaseDatabase internal constructor(val js: Database) {
7070

71-
actual data class Settings(
72-
actual val persistenceEnabled: Boolean = false,
73-
actual val persistenceCacheSizeBytes: Long? = null,
74-
) {
75-
76-
actual companion object {
77-
actual fun createSettings(persistenceEnabled: Boolean, persistenceCacheSizeBytes: Long?) = Settings(persistenceEnabled, persistenceCacheSizeBytes)
78-
}
79-
}
80-
8171
actual fun reference(path: String) = rethrow { DatabaseReference(NativeDatabaseReference(ref(js, path), js)) }
8272
actual fun reference() = rethrow { DatabaseReference(NativeDatabaseReference(ref(js), js)) }
83-
actual fun setSettings(settings: Settings) {}
73+
actual fun setPersistenceEnabled(enabled: Boolean) {}
74+
actual fun setPersistenceCacheSizeBytes(cacheSizeInBytes: Long) {}
8475
actual fun setLoggingEnabled(enabled: Boolean) = rethrow { enableLogging(enabled) }
8576
actual fun useEmulator(host: String, port: Int) = rethrow { connectDatabaseEmulator(js, host, port) }
8677
}

firebase-firestore/src/androidMain/kotlin/dev/gitlive/firebase/firestore/firestore.kt

Lines changed: 81 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
package dev.gitlive.firebase.firestore
77

88
import com.google.android.gms.tasks.TaskExecutors
9+
import com.google.firebase.firestore.FirebaseFirestoreSettings
910
import com.google.firebase.firestore.MetadataChanges
1011
import com.google.firebase.firestore.firestoreSettings
1112
import com.google.firebase.firestore.memoryCacheSettings
@@ -21,6 +22,7 @@ import kotlinx.coroutines.flow.callbackFlow
2122
import kotlinx.coroutines.runBlocking
2223
import kotlinx.coroutines.tasks.await
2324
import kotlinx.serialization.Serializable
25+
import java.lang.IllegalArgumentException
2426
import java.util.concurrent.ConcurrentHashMap
2527
import java.util.concurrent.Executor
2628
import com.google.firebase.firestore.FieldPath as AndroidFieldPath
@@ -35,16 +37,14 @@ actual fun Firebase.firestore(app: FirebaseApp) =
3537

3638
val LocalCacheSettings.android: com.google.firebase.firestore.LocalCacheSettings get() = when (this) {
3739
is LocalCacheSettings.Persistent -> persistentCacheSettings {
38-
sizeBytes?.let { setSizeBytes(it) }
40+
setSizeBytes(sizeBytes)
3941
}
4042
is LocalCacheSettings.Memory -> memoryCacheSettings {
4143
setGcSettings(
4244
when (garbaseCollectorSettings) {
43-
is LocalCacheSettings.Memory.GarbageCollectorSettings.Eager -> memoryEagerGcSettings { }
44-
is LocalCacheSettings.Memory.GarbageCollectorSettings.LRUGC -> memoryLruGcSettings {
45-
garbaseCollectorSettings.sizeBytes?.let {
46-
setSizeBytes(it)
47-
}
45+
is GarbageCollectorSettings.Eager -> memoryEagerGcSettings { }
46+
is GarbageCollectorSettings.LRUGC -> memoryLruGcSettings {
47+
setSizeBytes(garbaseCollectorSettings.sizeBytes)
4848
}
4949
}
5050
)
@@ -56,16 +56,42 @@ private val callbackExecutorMap = ConcurrentHashMap<com.google.firebase.firestor
5656

5757
actual class FirebaseFirestore(val android: com.google.firebase.firestore.FirebaseFirestore) {
5858

59-
actual data class Settings(
60-
actual val sslEnabled: Boolean? = null,
61-
actual val host: String? = null,
62-
actual val cacheSettings: LocalCacheSettings? = null,
63-
val callbackExecutor: Executor = TaskExecutors.MAIN_THREAD,
64-
) {
65-
actual companion object {
66-
actual fun create(sslEnabled: Boolean?, host: String?, cacheSettings: LocalCacheSettings?) = Settings(sslEnabled, host, cacheSettings)
59+
actual var settings: FirestoreSettings
60+
get() = with(android.firestoreSettings) {
61+
FirestoreSettings(
62+
isSslEnabled,
63+
host,
64+
cacheSettings?.let { localCacheSettings ->
65+
when (localCacheSettings) {
66+
is com.google.firebase.firestore.MemoryCacheSettings -> {
67+
val garbageCollectionSettings = when (val settings = localCacheSettings.garbageCollectorSettings) {
68+
is com.google.firebase.firestore.MemoryEagerGcSettings -> GarbageCollectorSettings.Eager
69+
is com.google.firebase.firestore.MemoryLruGcSettings -> GarbageCollectorSettings.LRUGC(settings.sizeBytes)
70+
else -> throw IllegalArgumentException("Existing settings does not have valid GarbageCollectionSettings")
71+
}
72+
LocalCacheSettings.Memory(garbageCollectionSettings)
73+
}
74+
is com.google.firebase.firestore.PersistentCacheSettings -> LocalCacheSettings.Persistent(localCacheSettings.sizeBytes)
75+
else -> throw IllegalArgumentException("Existing settings is not of a valid type")
76+
}
77+
} ?: kotlin.run {
78+
when {
79+
isPersistenceEnabled -> LocalCacheSettings.Persistent(cacheSizeBytes)
80+
cacheSizeBytes == FirestoreSettings.CACHE_SIZE_UNLIMITED -> LocalCacheSettings.Memory(GarbageCollectorSettings.Eager)
81+
else -> LocalCacheSettings.Memory(GarbageCollectorSettings.LRUGC(cacheSizeBytes))
82+
}
83+
},
84+
callbackExecutorMap[android] ?: TaskExecutors.MAIN_THREAD
85+
)
86+
}
87+
set(value) {
88+
android.firestoreSettings = firestoreSettings {
89+
isSslEnabled = value.sslEnabled
90+
host = value.host
91+
setLocalCacheSettings(value.cacheSettings.android)
92+
}
93+
callbackExecutorMap[android] = value.callbackExecutor
6794
}
68-
}
6995

7096
actual fun collection(collectionPath: String) = CollectionReference(NativeCollectionReference(android.collection(collectionPath)))
7197

@@ -89,31 +115,6 @@ actual class FirebaseFirestore(val android: com.google.firebase.firestore.Fireba
89115
android.firestoreSettings = firestoreSettings { }
90116
}
91117

92-
actual fun setSettings(settings: Settings) {
93-
android.firestoreSettings = firestoreSettings {
94-
settings.sslEnabled?.let { isSslEnabled = it }
95-
settings.host?.let { host = it }
96-
settings.cacheSettings?.let { setLocalCacheSettings(it.android) }
97-
}
98-
callbackExecutorMap[android] = settings.callbackExecutor
99-
}
100-
101-
@Suppress("DEPRECATION")
102-
actual fun updateSettings(settings: Settings) {
103-
android.firestoreSettings = firestoreSettings {
104-
isSslEnabled = settings.sslEnabled ?: android.firestoreSettings.isSslEnabled
105-
host = settings.host ?: android.firestoreSettings.host
106-
val cacheSettings = settings.cacheSettings?.android ?: android.firestoreSettings.cacheSettings
107-
cacheSettings?.let {
108-
setLocalCacheSettings(it)
109-
} ?: kotlin.run {
110-
isPersistenceEnabled = android.firestoreSettings.isPersistenceEnabled
111-
cacheSizeBytes = android.firestoreSettings.cacheSizeBytes
112-
}
113-
}
114-
callbackExecutorMap[android] = settings.callbackExecutor
115-
}
116-
117118
actual suspend fun disableNetwork() =
118119
android.disableNetwork().await().run { }
119120

@@ -122,6 +123,46 @@ actual class FirebaseFirestore(val android: com.google.firebase.firestore.Fireba
122123

123124
}
124125

126+
actual data class FirestoreSettings(
127+
actual val sslEnabled: Boolean,
128+
actual val host: String,
129+
actual val cacheSettings: LocalCacheSettings,
130+
val callbackExecutor: Executor,
131+
) {
132+
133+
actual companion object {}
134+
135+
actual interface Builder {
136+
actual var sslEnabled: Boolean
137+
actual var host: String
138+
actual var cacheSettings: LocalCacheSettings
139+
var callbackExecutor: Executor
140+
141+
actual fun build(): FirestoreSettings
142+
}
143+
144+
internal class BuilderImpl : Builder {
145+
override var sslEnabled: Boolean = true
146+
override var host: String = FirestoreSettings.DEFAULT_HOST
147+
override var cacheSettings: LocalCacheSettings = LocalCacheSettings.Persistent(CACHE_SIZE_UNLIMITED)
148+
override var callbackExecutor: Executor = TaskExecutors.MAIN_THREAD
149+
150+
override fun build() = FirestoreSettings(sslEnabled, host, cacheSettings, callbackExecutor)
151+
}
152+
}
153+
154+
actual fun firestoreSettings(
155+
settings: FirestoreSettings?,
156+
builder: FirestoreSettings.Builder.() -> Unit
157+
): FirestoreSettings = FirestoreSettings.BuilderImpl().apply {
158+
settings?.let {
159+
sslEnabled = it.sslEnabled
160+
host = it.host
161+
cacheSettings = it.cacheSettings
162+
callbackExecutor = it.callbackExecutor
163+
}
164+
}.apply(builder).build()
165+
125166
internal val SetOptions.android: com.google.firebase.firestore.SetOptions? get() = when (this) {
126167
is SetOptions.Merge -> com.google.firebase.firestore.SetOptions.merge()
127168
is SetOptions.Overwrite -> null
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package dev.gitlive.firebase.firestore
2+
3+
sealed class LocalCacheSettings {
4+
5+
internal companion object {
6+
// Firestore cache defaults to 100MB
7+
const val DEFAULT_CACHE_SIZE = 100L*1024L*1024L
8+
}
9+
10+
data class Persistent(val sizeBytes: Long) : LocalCacheSettings() {
11+
12+
companion object {
13+
fun newBuilder(): Builder = BuilderImpl()
14+
}
15+
16+
interface Builder {
17+
var sizeBytes: Long
18+
fun build(): Persistent
19+
}
20+
21+
private class BuilderImpl(
22+
override var sizeBytes: Long = DEFAULT_CACHE_SIZE
23+
) : Builder {
24+
override fun build(): Persistent = Persistent(sizeBytes)
25+
}
26+
}
27+
data class Memory(val garbaseCollectorSettings: GarbageCollectorSettings) : LocalCacheSettings() {
28+
29+
companion object {
30+
fun newBuilder(): Builder = BuilderImpl()
31+
}
32+
33+
interface Builder {
34+
35+
var gcSettings: GarbageCollectorSettings
36+
37+
fun build(): Memory
38+
}
39+
40+
private class BuilderImpl(
41+
override var gcSettings: GarbageCollectorSettings = GarbageCollectorSettings.Eager
42+
) : Builder {
43+
override fun build(): Memory = Memory(gcSettings)
44+
}
45+
}
46+
}
47+
48+
sealed class GarbageCollectorSettings {
49+
data object Eager : GarbageCollectorSettings() {
50+
51+
fun newBuilder(): Builder = BuilderImpl()
52+
53+
interface Builder {
54+
fun build(): Eager
55+
}
56+
57+
private class BuilderImpl : Builder {
58+
override fun build(): Eager = Eager
59+
}
60+
}
61+
data class LRUGC(val sizeBytes: Long) : GarbageCollectorSettings() {
62+
63+
companion object {
64+
fun newBuilder(): Builder = BuilderImpl()
65+
}
66+
67+
interface Builder {
68+
var sizeBytes: Long
69+
fun build(): LRUGC
70+
}
71+
72+
private class BuilderImpl(
73+
override var sizeBytes: Long = LocalCacheSettings.DEFAULT_CACHE_SIZE
74+
) : Builder {
75+
override fun build(): LRUGC = LRUGC(sizeBytes)
76+
}
77+
}
78+
}
79+
80+
fun memoryCacheSettings(builder: LocalCacheSettings.Memory.Builder.() -> Unit): LocalCacheSettings.Memory =
81+
LocalCacheSettings.Memory.newBuilder().apply(builder).build()
82+
83+
fun memoryEagerGcSettings(builder: GarbageCollectorSettings.Eager.Builder.() -> Unit) =
84+
GarbageCollectorSettings.Eager.newBuilder().apply(builder).build()
85+
86+
fun memoryLruGcSettings(builder: GarbageCollectorSettings.LRUGC.Builder.() -> Unit) =
87+
GarbageCollectorSettings.LRUGC.newBuilder().apply(builder).build()
88+
89+
fun persistentCacheSettings(builder: LocalCacheSettings.Persistent.Builder.() -> Unit) =
90+
LocalCacheSettings.Persistent.newBuilder().apply(builder).build()

0 commit comments

Comments
 (0)