Skip to content

Commit 6378db9

Browse files
authored
Merge branch 'master' into feature/public-ValueWithSerializer
2 parents 6251476 + ba73861 commit 6378db9

File tree

14 files changed

+103
-92
lines changed

14 files changed

+103
-92
lines changed

README.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -329,4 +329,3 @@ More recently, with the official SDK for Android providing better support for Ko
329329
For contributors this means following these points when adding new code to the public API of this project:
330330
- **Match the [Android SDKs API](https://firebase.google.com/docs/reference/kotlin/packages).** When adding new API coverage use the Android SDK as the guide on what the public API should be in regard to naming, parameters etc. The goal here is *near binary compatibility*, meaning code consuming the Android SDK compiles *as is* with the Kotlin SDK after just changing the package imports from `com.google` to `dev.gitlive`.
331331
- **Follow our [Kotlin-first design](https://github.com/GitLiveApp/firebase-kotlin-sdk/?tab=readme-ov-file#kotlin-first-design) principles when needed.** If the API you are adding coverage for is new, and it's Kotlin-first in the Android SDK, then you can simply just match the Android SDKs API as described in the first point, but if it's an older Java-first API then ideally we would include an identical API for API compatibility *plus* a Kotlin-first overload. A good example for this is where the Builder pattern is employed in the Android SDK, here we can follow [this Kotlin-first design principle](https://github.com/GitLiveApp/firebase-kotlin-sdk/?tab=readme-ov-file#default-arguments) and provide both methods, one taking the options created with the builder and an overload with default arguments to avoid the builder boilerplate for developers not porting an existing android code base.
332-

firebase-auth/api/android/firebase-auth.api

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ public final class dev/gitlive/firebase/auth/AuthTokenResult {
8585
}
8686

8787
public final class dev/gitlive/firebase/auth/CredentialsKt {
88-
public static final fun getAndroid (Lcom/google/firebase/auth/OAuthProvider;)Lcom/google/firebase/auth/OAuthProvider;
88+
public static final fun getAndroid (Ldev/gitlive/firebase/auth/OAuthProvider;)Lcom/google/firebase/auth/OAuthProvider;
8989
}
9090

9191
public final class dev/gitlive/firebase/auth/EmailAuthProvider {

firebase-auth/src/androidMain/kotlin/dev/gitlive/firebase/auth/credentials.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ package dev.gitlive.firebase.auth
66

77
import android.app.Activity
88
import com.google.firebase.FirebaseException
9-
import com.google.firebase.auth.OAuthProvider
9+
import com.google.firebase.auth.OAuthProvider as AndroidOAuthProvider
1010
import com.google.firebase.auth.PhoneAuthOptions
1111
import com.google.firebase.auth.PhoneAuthProvider
1212
import kotlinx.coroutines.CompletableDeferred
@@ -52,17 +52,17 @@ public actual object GoogleAuthProvider {
5252
}
5353
}
5454

55-
public val OAuthProvider.android: OAuthProvider get() = android
55+
public val OAuthProvider.android: AndroidOAuthProvider get() = android
5656

57-
public actual class OAuthProvider(internal val android: OAuthProvider) {
57+
public actual class OAuthProvider(internal val android: AndroidOAuthProvider) {
5858

5959
public actual constructor(
6060
provider: String,
6161
scopes: List<String>,
6262
customParameters: Map<String, String>,
6363
auth: FirebaseAuth,
6464
) : this(
65-
OAuthProvider
65+
AndroidOAuthProvider
6666
.newBuilder(provider, auth.android)
6767
.setScopes(scopes)
6868
.addCustomParameters(customParameters)
@@ -71,7 +71,7 @@ public actual class OAuthProvider(internal val android: OAuthProvider) {
7171

7272
public actual companion object {
7373
public actual fun credential(providerId: String, accessToken: String?, idToken: String?, rawNonce: String?): OAuthCredential {
74-
val builder = OAuthProvider.newCredentialBuilder(providerId)
74+
val builder = AndroidOAuthProvider.newCredentialBuilder(providerId)
7575
accessToken?.let { builder.setAccessToken(it) }
7676
idToken?.let { builder.setIdToken(it) }
7777
rawNonce?.let { builder.setIdTokenWithRawNonce(idToken!!, it) }

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

Lines changed: 52 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ public actual fun Firebase.auth(app: FirebaseApp): FirebaseAuth = FirebaseAuth(
3131
public actual class FirebaseAuth internal constructor(internal val ios: FIRAuth) {
3232

3333
public actual val currentUser: FirebaseUser?
34-
get() = ios.currentUser?.let { FirebaseUser(it) }
34+
get() = ios.currentUser()?.let { FirebaseUser(it) }
3535

3636
public actual val authStateChanged: Flow<FirebaseUser?> get() = callbackFlow {
3737
val handle = ios.addAuthStateDidChangeListener { _, user -> trySend(user?.let { FirebaseUser(it) }) }
@@ -44,7 +44,7 @@ public actual class FirebaseAuth internal constructor(internal val ios: FIRAuth)
4444
}
4545

4646
public actual var languageCode: String
47-
get() = ios.languageCode ?: ""
47+
get() = ios.languageCode() ?: ""
4848
set(value) {
4949
ios.setLanguageCode(value)
5050
}
@@ -90,15 +90,15 @@ public actual class FirebaseAuth internal constructor(internal val ios: FIRAuth)
9090
public actual suspend fun <T : ActionCodeResult> checkActionCode(code: String): T {
9191
val result: FIRActionCodeInfo = ios.awaitResult { checkActionCode(code, it) }
9292
@Suppress("UNCHECKED_CAST")
93-
return when (result.operation) {
93+
return when (result.operation()) {
9494
FIRActionCodeOperationEmailLink -> SignInWithEmailLink
95-
FIRActionCodeOperationVerifyEmail -> VerifyEmail(result.email!!)
96-
FIRActionCodeOperationPasswordReset -> PasswordReset(result.email!!)
97-
FIRActionCodeOperationRecoverEmail -> RecoverEmail(result.email!!, result.previousEmail!!)
98-
FIRActionCodeOperationVerifyAndChangeEmail -> VerifyBeforeChangeEmail(result.email!!, result.previousEmail!!)
99-
FIRActionCodeOperationRevertSecondFactorAddition -> RevertSecondFactorAddition(result.email!!, null)
100-
FIRActionCodeOperationUnknown -> throw UnsupportedOperationException(result.operation.toString())
101-
else -> throw UnsupportedOperationException(result.operation.toString())
95+
FIRActionCodeOperationVerifyEmail -> VerifyEmail(result.email())
96+
FIRActionCodeOperationPasswordReset -> PasswordReset(result.email())
97+
FIRActionCodeOperationRecoverEmail -> RecoverEmail(result.email(), result.previousEmail()!!)
98+
FIRActionCodeOperationVerifyAndChangeEmail -> VerifyBeforeChangeEmail(result.email(), result.previousEmail()!!)
99+
FIRActionCodeOperationRevertSecondFactorAddition -> RevertSecondFactorAddition(result.email(), null)
100+
FIRActionCodeOperationUnknown -> throw UnsupportedOperationException(result.operation().toString())
101+
else -> throw UnsupportedOperationException(result.operation().toString())
102102
} as T
103103
}
104104

@@ -108,31 +108,31 @@ public val AuthResult.ios: FIRAuthDataResult get() = ios
108108

109109
public actual class AuthResult internal constructor(internal val ios: FIRAuthDataResult) {
110110
public actual val user: FirebaseUser?
111-
get() = FirebaseUser(ios.user)
111+
get() = FirebaseUser(ios.user())
112112
}
113113

114114
public val AuthTokenResult.ios: FIRAuthTokenResult get() = ios
115115
public actual class AuthTokenResult(internal val ios: FIRAuthTokenResult) {
116116
// actual val authTimestamp: Long
117117
// get() = ios.authDate
118118
public actual val claims: Map<String, Any>
119-
get() = ios.claims.map { it.key.toString() to it.value as Any }.toMap()
119+
get() = ios.claims().map { it.key.toString() to it.value as Any }.toMap()
120120

121121
// actual val expirationTimestamp: Long
122122
// get() = ios.expirationDate
123123
// actual val issuedAtTimestamp: Long
124124
// get() = ios.issuedAtDate
125125
public actual val signInProvider: String?
126-
get() = ios.signInProvider
126+
get() = ios.signInProvider()
127127
public actual val token: String?
128-
get() = ios.token
128+
get() = ios.token()
129129
}
130130

131131
internal fun ActionCodeSettings.toIos() = FIRActionCodeSettings().also {
132-
it.URL = NSURL.URLWithString(url)
132+
it.setURL(NSURL.URLWithString(url))
133133
androidPackageName?.run { it.setAndroidPackageName(packageName, installIfNotAvailable, minimumVersion) }
134-
it.dynamicLinkDomain = dynamicLinkDomain
135-
it.handleCodeInApp = canHandleCodeInApp
134+
it.setDynamicLinkDomain(dynamicLinkDomain)
135+
it.setHandleCodeInApp(canHandleCodeInApp)
136136
iOSBundleId?.run { it.setIOSBundleID(this) }
137137
}
138138

@@ -184,47 +184,55 @@ internal suspend inline fun <T> T.await(function: T.(callback: (NSError?) -> Uni
184184
}
185185

186186
private fun NSError.toException() = when (domain) {
187+
// codes from AuthErrors.swift: https://github.com/firebase/firebase-ios-sdk/blob/
188+
// 2f6ac4c2c61cd57c7ea727009e187b7e1163d613/FirebaseAuth/Sources/Swift/Utilities/
189+
// AuthErrors.swift#L51
187190
FIRAuthErrorDomain -> when (code) {
188-
FIRAuthErrorCodeInvalidActionCode,
189-
FIRAuthErrorCodeExpiredActionCode,
191+
17030L, // AuthErrorCode.invalidActionCode
192+
17029L, // AuthErrorCode.expiredActionCode
190193
-> FirebaseAuthActionCodeException(toString())
191194

192-
FIRAuthErrorCodeInvalidEmail -> FirebaseAuthEmailException(toString())
193-
194-
FIRAuthErrorCodeCaptchaCheckFailed,
195-
FIRAuthErrorCodeInvalidPhoneNumber,
196-
FIRAuthErrorCodeMissingPhoneNumber,
197-
FIRAuthErrorCodeInvalidVerificationID,
198-
FIRAuthErrorCodeInvalidVerificationCode,
199-
FIRAuthErrorCodeMissingVerificationID,
200-
FIRAuthErrorCodeMissingVerificationCode,
201-
FIRAuthErrorCodeUserTokenExpired,
202-
FIRAuthErrorCodeInvalidCredential,
195+
17008L, // AuthErrorCode.invalidEmail
196+
-> FirebaseAuthEmailException(toString())
197+
198+
17056L, // AuthErrorCode.captchaCheckFailed
199+
17042L, // AuthErrorCode.invalidPhoneNumber
200+
17041L, // AuthErrorCode.missingPhoneNumber
201+
17046L, // AuthErrorCode.invalidVerificationID
202+
17044L, // AuthErrorCode.invalidVerificationCode
203+
17045L, // AuthErrorCode.missingVerificationID
204+
17043L, // AuthErrorCode.missingVerificationCode
205+
17021L, // AuthErrorCode.userTokenExpired
206+
17004L, // AuthErrorCode.invalidCredential
203207
-> FirebaseAuthInvalidCredentialsException(toString())
204208

205-
FIRAuthErrorCodeWeakPassword -> FirebaseAuthWeakPasswordException(toString())
209+
17026L, // AuthErrorCode.weakPassword
210+
-> FirebaseAuthWeakPasswordException(toString())
206211

207-
FIRAuthErrorCodeInvalidUserToken -> FirebaseAuthInvalidUserException(toString())
212+
17017L, // AuthErrorCode.invalidUserToken
213+
-> FirebaseAuthInvalidUserException(toString())
208214

209-
FIRAuthErrorCodeRequiresRecentLogin -> FirebaseAuthRecentLoginRequiredException(toString())
215+
17014L, // AuthErrorCode.requiresRecentLogin
216+
-> FirebaseAuthRecentLoginRequiredException(toString())
210217

211-
FIRAuthErrorCodeSecondFactorAlreadyEnrolled,
212-
FIRAuthErrorCodeSecondFactorRequired,
213-
FIRAuthErrorCodeMaximumSecondFactorCountExceeded,
214-
FIRAuthErrorCodeMultiFactorInfoNotFound,
218+
17087L, // AuthErrorCode.secondFactorAlreadyEnrolled
219+
17078L, // AuthErrorCode.secondFactorRequired
220+
17088L, // AuthErrorCode.maximumSecondFactorCountExceeded
221+
17084L, // AuthErrorCode.multiFactorInfoNotFound
215222
-> FirebaseAuthMultiFactorException(toString())
216223

217-
FIRAuthErrorCodeEmailAlreadyInUse,
218-
FIRAuthErrorCodeAccountExistsWithDifferentCredential,
219-
FIRAuthErrorCodeCredentialAlreadyInUse,
224+
17007L, // AuthErrorCode.emailAlreadyInUse
225+
17012L, // AuthErrorCode.accountExistsWithDifferentCredential
226+
17025L, // AuthErrorCode.credentialAlreadyInUse
220227
-> FirebaseAuthUserCollisionException(toString())
221228

222-
FIRAuthErrorCodeWebContextAlreadyPresented,
223-
FIRAuthErrorCodeWebContextCancelled,
224-
FIRAuthErrorCodeWebInternalError,
229+
17057L, // AuthErrorCode.webContextAlreadyPresented
230+
17058L, // AuthErrorCode.webContextCancelled
231+
17062L, // AuthErrorCode.webInternalError
225232
-> FirebaseAuthWebException(toString())
226233

227-
FIRAuthErrorCodeNetworkError -> FirebaseNetworkException(toString())
234+
17020L, // AuthErrorCode.networkError
235+
-> FirebaseNetworkException(toString())
228236

229237
else -> FirebaseAuthException(toString())
230238
}

firebase-auth/src/iosMain/kotlin/dev/gitlive/firebase/auth/credentials.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import cocoapods.FirebaseAuth.*
88

99
public actual open class AuthCredential(public open val ios: FIRAuthCredential) {
1010
public actual val providerId: String
11-
get() = ios.provider
11+
get() = ios.provider()
1212
}
1313

1414
public actual class PhoneAuthCredential(override val ios: FIRPhoneAuthCredential) : AuthCredential(ios)

firebase-auth/src/iosMain/kotlin/dev/gitlive/firebase/auth/multifactor.kt

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ public val MultiFactor.ios: FIRMultiFactor get() = ios
1010

1111
public actual class MultiFactor(internal val ios: FIRMultiFactor) {
1212
public actual val enrolledFactors: List<MultiFactorInfo>
13-
get() = ios.enrolledFactors.mapNotNull { info -> (info as? FIRMultiFactorInfo)?.let { MultiFactorInfo(it) } }
13+
get() = ios.enrolledFactors().mapNotNull { info -> (info as? FIRMultiFactorInfo)?.let { MultiFactorInfo(it) } }
1414
public actual suspend fun enroll(multiFactorAssertion: MultiFactorAssertion, displayName: String?): Unit = ios.await { enrollWithAssertion(multiFactorAssertion.ios, displayName, it) }
1515
public actual suspend fun getSession(): MultiFactorSession = MultiFactorSession(ios.awaitResult { getSessionWithCompletion(completion = it) })
1616
public actual suspend fun unenroll(multiFactorInfo: MultiFactorInfo): Unit = ios.await { unenrollWithInfo(multiFactorInfo.ios, it) }
@@ -21,20 +21,20 @@ public val MultiFactorInfo.ios: FIRMultiFactorInfo get() = ios
2121

2222
public actual class MultiFactorInfo(internal val ios: FIRMultiFactorInfo) {
2323
public actual val displayName: String?
24-
get() = ios.displayName
24+
get() = ios.displayName()
2525
public actual val enrollmentTime: Double
26-
get() = ios.enrollmentDate.timeIntervalSinceReferenceDate
26+
get() = ios.enrollmentDate().timeIntervalSinceReferenceDate
2727
public actual val factorId: String
28-
get() = ios.factorID
28+
get() = ios.factorID()
2929
public actual val uid: String
30-
get() = ios.UID
30+
get() = ios.UID()
3131
}
3232

3333
public val MultiFactorAssertion.ios: FIRMultiFactorAssertion get() = ios
3434

3535
public actual class MultiFactorAssertion(internal val ios: FIRMultiFactorAssertion) {
3636
public actual val factorId: String
37-
get() = ios.factorID
37+
get() = ios.factorID()
3838
}
3939

4040
public val MultiFactorSession.ios: FIRMultiFactorSession get() = ios
@@ -44,9 +44,9 @@ public actual class MultiFactorSession(internal val ios: FIRMultiFactorSession)
4444
public val MultiFactorResolver.ios: FIRMultiFactorResolver get() = ios
4545

4646
public actual class MultiFactorResolver(internal val ios: FIRMultiFactorResolver) {
47-
public actual val auth: FirebaseAuth = FirebaseAuth(ios.auth)
48-
public actual val hints: List<MultiFactorInfo> = ios.hints.mapNotNull { hint -> (hint as? FIRMultiFactorInfo)?.let { MultiFactorInfo(it) } }
49-
public actual val session: MultiFactorSession = MultiFactorSession(ios.session)
47+
public actual val auth: FirebaseAuth = FirebaseAuth(ios.auth())
48+
public actual val hints: List<MultiFactorInfo> = ios.hints().mapNotNull { hint -> (hint as? FIRMultiFactorInfo)?.let { MultiFactorInfo(it) } }
49+
public actual val session: MultiFactorSession = MultiFactorSession(ios.session())
5050

5151
public actual suspend fun resolveSignIn(assertion: MultiFactorAssertion): AuthResult = AuthResult(ios.awaitResult { resolveSignInWithAssertion(assertion.ios, it) })
5252
}

firebase-auth/src/iosMain/kotlin/dev/gitlive/firebase/auth/user.kt

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -14,27 +14,27 @@ public val FirebaseUser.ios: FIRUser get() = ios
1414

1515
public actual class FirebaseUser internal constructor(internal val ios: FIRUser) {
1616
public actual val uid: String
17-
get() = ios.uid
17+
get() = ios.uid()
1818
public actual val displayName: String?
19-
get() = ios.displayName
19+
get() = ios.displayName()
2020
public actual val email: String?
21-
get() = ios.email
21+
get() = ios.email()
2222
public actual val phoneNumber: String?
23-
get() = ios.phoneNumber
23+
get() = ios.phoneNumber()
2424
public actual val photoURL: String?
25-
get() = ios.photoURL?.absoluteString
25+
get() = ios.photoURL()?.absoluteString
2626
public actual val isAnonymous: Boolean
27-
get() = ios.anonymous
27+
get() = ios.anonymous()
2828
public actual val isEmailVerified: Boolean
29-
get() = ios.emailVerified
29+
get() = ios.emailVerified()
3030
public actual val metaData: UserMetaData?
31-
get() = UserMetaData(ios.metadata)
31+
get() = UserMetaData(ios.metadata())
3232
public actual val multiFactor: MultiFactor
33-
get() = MultiFactor(ios.multiFactor)
33+
get() = MultiFactor(ios.multiFactor())
3434
public actual val providerData: List<UserInfo>
35-
get() = ios.providerData.mapNotNull { provider -> (provider as? FIRUserInfoProtocol)?.let { UserInfo(it) } }
35+
get() = ios.providerData().mapNotNull { provider -> (provider as? FIRUserInfoProtocol)?.let { UserInfo(it) } }
3636
public actual val providerId: String
37-
get() = ios.providerID
37+
get() = ios.providerID()
3838

3939
public actual suspend fun delete(): Unit = ios.await { deleteWithCompletion(it) }
4040

@@ -85,24 +85,24 @@ public val UserInfo.ios: FIRUserInfoProtocol get() = ios
8585

8686
public actual class UserInfo(internal val ios: FIRUserInfoProtocol) {
8787
public actual val displayName: String?
88-
get() = ios.displayName
88+
get() = ios.displayName()
8989
public actual val email: String?
90-
get() = ios.email
90+
get() = ios.email()
9191
public actual val phoneNumber: String?
92-
get() = ios.phoneNumber
92+
get() = ios.phoneNumber()
9393
public actual val photoURL: String?
94-
get() = ios.photoURL?.absoluteString
94+
get() = ios.photoURL()?.absoluteString
9595
public actual val providerId: String
96-
get() = ios.providerID
96+
get() = ios.providerID()
9797
public actual val uid: String
98-
get() = ios.uid
98+
get() = ios.uid()
9999
}
100100

101101
public val UserMetaData.ios: FIRUserMetadata get() = ios
102102

103103
public actual class UserMetaData(internal val ios: FIRUserMetadata) {
104104
public actual val creationTime: Double?
105-
get() = ios.creationDate?.timeIntervalSinceReferenceDate
105+
get() = ios.creationDate()?.timeIntervalSinceReferenceDate
106106
public actual val lastSignInTime: Double?
107-
get() = ios.lastSignInDate?.timeIntervalSinceReferenceDate
107+
get() = ios.lastSignInDate()?.timeIntervalSinceReferenceDate
108108
}
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
package dev.gitlive.firebase.firestore.internal
22

3-
import com.google.firebase.firestore.FirebaseFirestore
43
import java.util.concurrent.ConcurrentHashMap
54
import java.util.concurrent.Executor
65

76
// Since on iOS Callback threads are set as settings, we store the settings explicitly here as well
8-
internal val callbackExecutorMap = ConcurrentHashMap<FirebaseFirestore, Executor>()
7+
internal val callbackExecutorMap = ConcurrentHashMap<com.google.firebase.firestore.FirebaseFirestore, Executor>()

firebase-firestore/src/iosMain/kotlin/dev/gitlive/firebase/firestore/Timestamp.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package dev.gitlive.firebase.firestore
22

3-
import cocoapods.FirebaseFirestoreInternal.FIRTimestamp
3+
import cocoapods.FirebaseCore.FIRTimestamp
44
import kotlinx.serialization.Serializable
55

66
/** A class representing a platform specific Firebase Timestamp. */

firebase-perf/api/android/firebase-perf.api

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,14 @@ public final class dev/gitlive/firebase/perf/metrics/Trace {
2828
public final fun updateSession (Ldev/gitlive/firebase/perf/session/PerfSession;)V
2929
}
3030

31+
public final class dev/gitlive/firebase/perf/metrics/TraceKt {
32+
public static final fun getAndroid (Ldev/gitlive/firebase/perf/metrics/Trace;)Lcom/google/firebase/perf/metrics/Trace;
33+
}
34+
3135
public final class dev/gitlive/firebase/perf/session/PerfSession {
3236
}
3337

3438
public final class dev/gitlive/firebase/perf/session/PerfSessionKt {
35-
public static final fun getAndroid (Lcom/google/firebase/perf/session/PerfSession;)Lcom/google/firebase/perf/session/PerfSession;
39+
public static final fun getAndroid (Ldev/gitlive/firebase/perf/session/PerfSession;)Lcom/google/firebase/perf/session/PerfSession;
3640
}
3741

0 commit comments

Comments
 (0)