Skip to content

Commit ecfa47d

Browse files
authored
Merge branch 'master' into auth-result
2 parents 3eb1a0c + ba73861 commit ecfa47d

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
@@ -96,7 +96,7 @@ public final class dev/gitlive/firebase/auth/AuthTokenResult {
9696
}
9797

9898
public final class dev/gitlive/firebase/auth/CredentialsKt {
99-
public static final fun getAndroid (Lcom/google/firebase/auth/OAuthProvider;)Lcom/google/firebase/auth/OAuthProvider;
99+
public static final fun getAndroid (Ldev/gitlive/firebase/auth/OAuthProvider;)Lcom/google/firebase/auth/OAuthProvider;
100100
}
101101

102102
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
@@ -32,7 +32,7 @@ public actual fun Firebase.auth(app: FirebaseApp): FirebaseAuth = FirebaseAuth(
3232
public actual class FirebaseAuth internal constructor(internal val ios: FIRAuth) {
3333

3434
public actual val currentUser: FirebaseUser?
35-
get() = ios.currentUser?.let { FirebaseUser(it) }
35+
get() = ios.currentUser()?.let { FirebaseUser(it) }
3636

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

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

@@ -110,7 +110,7 @@ public val AuthResult.ios: FIRAuthDataResult get() = ios
110110

111111
public actual class AuthResult(internal val ios: FIRAuthDataResult) {
112112
public actual val user: FirebaseUser?
113-
get() = FirebaseUser(ios.user)
113+
get() = FirebaseUser(ios.user())
114114
public actual val credential: AuthCredential?
115115
get() = ios.credential?.let { AuthCredential(it) }
116116
public actual val additionalUserInfo: AdditionalUserInfo?
@@ -145,23 +145,23 @@ public actual class AuthTokenResult(internal val ios: FIRAuthTokenResult) {
145145
// actual val authTimestamp: Long
146146
// get() = ios.authDate
147147
public actual val claims: Map<String, Any>
148-
get() = ios.claims.map { it.key.toString() to it.value as Any }.toMap()
148+
get() = ios.claims().map { it.key.toString() to it.value as Any }.toMap()
149149

150150
// actual val expirationTimestamp: Long
151151
// get() = ios.expirationDate
152152
// actual val issuedAtTimestamp: Long
153153
// get() = ios.issuedAtDate
154154
public actual val signInProvider: String?
155-
get() = ios.signInProvider
155+
get() = ios.signInProvider()
156156
public actual val token: String?
157-
get() = ios.token
157+
get() = ios.token()
158158
}
159159

160160
internal fun ActionCodeSettings.toIos() = FIRActionCodeSettings().also {
161-
it.URL = NSURL.URLWithString(url)
161+
it.setURL(NSURL.URLWithString(url))
162162
androidPackageName?.run { it.setAndroidPackageName(packageName, installIfNotAvailable, minimumVersion) }
163-
it.dynamicLinkDomain = dynamicLinkDomain
164-
it.handleCodeInApp = canHandleCodeInApp
163+
it.setDynamicLinkDomain(dynamicLinkDomain)
164+
it.setHandleCodeInApp(canHandleCodeInApp)
165165
iOSBundleId?.run { it.setIOSBundleID(this) }
166166
}
167167

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

215215
private fun NSError.toException() = when (domain) {
216+
// codes from AuthErrors.swift: https://github.com/firebase/firebase-ios-sdk/blob/
217+
// 2f6ac4c2c61cd57c7ea727009e187b7e1163d613/FirebaseAuth/Sources/Swift/Utilities/
218+
// AuthErrors.swift#L51
216219
FIRAuthErrorDomain -> when (code) {
217-
FIRAuthErrorCodeInvalidActionCode,
218-
FIRAuthErrorCodeExpiredActionCode,
220+
17030L, // AuthErrorCode.invalidActionCode
221+
17029L, // AuthErrorCode.expiredActionCode
219222
-> FirebaseAuthActionCodeException(toString())
220223

221-
FIRAuthErrorCodeInvalidEmail -> FirebaseAuthEmailException(toString())
222-
223-
FIRAuthErrorCodeCaptchaCheckFailed,
224-
FIRAuthErrorCodeInvalidPhoneNumber,
225-
FIRAuthErrorCodeMissingPhoneNumber,
226-
FIRAuthErrorCodeInvalidVerificationID,
227-
FIRAuthErrorCodeInvalidVerificationCode,
228-
FIRAuthErrorCodeMissingVerificationID,
229-
FIRAuthErrorCodeMissingVerificationCode,
230-
FIRAuthErrorCodeUserTokenExpired,
231-
FIRAuthErrorCodeInvalidCredential,
224+
17008L, // AuthErrorCode.invalidEmail
225+
-> FirebaseAuthEmailException(toString())
226+
227+
17056L, // AuthErrorCode.captchaCheckFailed
228+
17042L, // AuthErrorCode.invalidPhoneNumber
229+
17041L, // AuthErrorCode.missingPhoneNumber
230+
17046L, // AuthErrorCode.invalidVerificationID
231+
17044L, // AuthErrorCode.invalidVerificationCode
232+
17045L, // AuthErrorCode.missingVerificationID
233+
17043L, // AuthErrorCode.missingVerificationCode
234+
17021L, // AuthErrorCode.userTokenExpired
235+
17004L, // AuthErrorCode.invalidCredential
232236
-> FirebaseAuthInvalidCredentialsException(toString())
233237

234-
FIRAuthErrorCodeWeakPassword -> FirebaseAuthWeakPasswordException(toString())
238+
17026L, // AuthErrorCode.weakPassword
239+
-> FirebaseAuthWeakPasswordException(toString())
235240

236-
FIRAuthErrorCodeInvalidUserToken -> FirebaseAuthInvalidUserException(toString())
241+
17017L, // AuthErrorCode.invalidUserToken
242+
-> FirebaseAuthInvalidUserException(toString())
237243

238-
FIRAuthErrorCodeRequiresRecentLogin -> FirebaseAuthRecentLoginRequiredException(toString())
244+
17014L, // AuthErrorCode.requiresRecentLogin
245+
-> FirebaseAuthRecentLoginRequiredException(toString())
239246

240-
FIRAuthErrorCodeSecondFactorAlreadyEnrolled,
241-
FIRAuthErrorCodeSecondFactorRequired,
242-
FIRAuthErrorCodeMaximumSecondFactorCountExceeded,
243-
FIRAuthErrorCodeMultiFactorInfoNotFound,
247+
17087L, // AuthErrorCode.secondFactorAlreadyEnrolled
248+
17078L, // AuthErrorCode.secondFactorRequired
249+
17088L, // AuthErrorCode.maximumSecondFactorCountExceeded
250+
17084L, // AuthErrorCode.multiFactorInfoNotFound
244251
-> FirebaseAuthMultiFactorException(toString())
245252

246-
FIRAuthErrorCodeEmailAlreadyInUse,
247-
FIRAuthErrorCodeAccountExistsWithDifferentCredential,
248-
FIRAuthErrorCodeCredentialAlreadyInUse,
253+
17007L, // AuthErrorCode.emailAlreadyInUse
254+
17012L, // AuthErrorCode.accountExistsWithDifferentCredential
255+
17025L, // AuthErrorCode.credentialAlreadyInUse
249256
-> FirebaseAuthUserCollisionException(toString())
250257

251-
FIRAuthErrorCodeWebContextAlreadyPresented,
252-
FIRAuthErrorCodeWebContextCancelled,
253-
FIRAuthErrorCodeWebInternalError,
258+
17057L, // AuthErrorCode.webContextAlreadyPresented
259+
17058L, // AuthErrorCode.webContextCancelled
260+
17062L, // AuthErrorCode.webInternalError
254261
-> FirebaseAuthWebException(toString())
255262

256-
FIRAuthErrorCodeNetworkError -> FirebaseNetworkException(toString())
263+
17020L, // AuthErrorCode.networkError
264+
-> FirebaseNetworkException(toString())
257265

258266
else -> FirebaseAuthException(toString())
259267
}

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)