Skip to content

Commit dcbe856

Browse files
committed
Fixing remarks
1 parent 7de88af commit dcbe856

File tree

16 files changed

+250
-293
lines changed

16 files changed

+250
-293
lines changed

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

+34-29
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
* Copyright (c) 2020 GitLive Ltd. Use of this source code is governed by the Apache 2.0 license.
33
*/
44

5+
@file:JvmName("android")
56
package dev.gitlive.firebase.auth
67

78
import com.google.firebase.auth.ActionCodeEmailInfo
@@ -90,12 +91,21 @@ actual class ActionCodeResult(val android: com.google.firebase.auth.ActionCodeRe
9091
com.google.firebase.auth.ActionCodeResult.REVERT_SECOND_FACTOR_ADDITION -> Operation.RevertSecondFactorAddition
9192
else -> Operation.Error
9293
}
93-
actual fun <T, A: ActionCodeDataType<T>> getData(type: A): T? = when (type) {
94-
is ActionCodeDataType.Email -> android.info?.email
95-
is ActionCodeDataType.PreviousEmail -> (android.info as? ActionCodeEmailInfo)?.previousEmail
96-
is ActionCodeDataType.MultiFactor -> (android.info as? ActionCodeMultiFactorInfo)?.multiFactorInfo?.let { MultiFactorInfo(it) }
97-
else -> null
98-
} as? T
94+
}
95+
96+
actual sealed class ActionCodeDataType<out T> {
97+
98+
internal actual abstract fun dataForResult(result: ActionCodeResult): T?
99+
100+
actual object Email : ActionCodeDataType<String>() {
101+
override fun dataForResult(result: ActionCodeResult): String? = result.android.info?.email
102+
}
103+
actual object PreviousEmail : ActionCodeDataType<String>() {
104+
override fun dataForResult(result: ActionCodeResult): String? = (result.android.info as? ActionCodeEmailInfo)?.previousEmail
105+
}
106+
actual object MultiFactor : ActionCodeDataType<MultiFactorInfo>() {
107+
override fun dataForResult(result: ActionCodeResult): MultiFactorInfo? = (result.android.info as? ActionCodeMultiFactorInfo)?.multiFactorInfo?.let { MultiFactorInfo(it) }
108+
}
99109
}
100110

101111
actual class SignInMethodQueryResult(val android: com.google.firebase.auth.SignInMethodQueryResult) {
@@ -104,33 +114,28 @@ actual class SignInMethodQueryResult(val android: com.google.firebase.auth.SignI
104114
}
105115

106116
actual class ActionCodeSettings private constructor(val android: com.google.firebase.auth.ActionCodeSettings) {
107-
actual class Builder(val android: com.google.firebase.auth.ActionCodeSettings.Builder = com.google.firebase.auth.ActionCodeSettings.newBuilder()) {
108-
actual fun setAndroidPackageName(androidPackageName: String, installIfNotAvailable: Boolean, minimumVersion: String?): Builder = apply {
109-
android.setAndroidPackageName(androidPackageName, installIfNotAvailable, minimumVersion)
110-
}
111-
actual fun setDynamicLinkDomain(dynamicLinkDomain: String): Builder = apply {
112-
android.setDynamicLinkDomain(dynamicLinkDomain)
113-
}
114-
actual fun setHandleCodeInApp(canHandleCodeInApp: Boolean): Builder = apply {
115-
android.setHandleCodeInApp(canHandleCodeInApp)
116-
}
117-
actual fun setIOSBundleId(iOSBundleId: String): Builder = apply {
118-
android.setIOSBundleId(iOSBundleId)
119-
}
120-
actual fun setUrl(url: String): Builder = apply {
121-
android.setUrl(url)
117+
118+
actual constructor(url: String,
119+
androidPackageName: AndroidPackageName?,
120+
dynamicLinkDomain: String?,
121+
canHandleCodeInApp: Boolean,
122+
iOSBundleId: String?
123+
) : this(com.google.firebase.auth.ActionCodeSettings.newBuilder().apply {
124+
this.url = url
125+
androidPackageName?.let {
126+
this.setAndroidPackageName(it.androidPackageName, it.installIfNotAvailable, it.minimumVersion)
122127
}
123-
actual fun build(): ActionCodeSettings = ActionCodeSettings(android.build())
124-
}
128+
this.dynamicLinkDomain = dynamicLinkDomain
129+
this.handleCodeInApp = canHandleCodeInApp
130+
this.iosBundleId = iosBundleId
131+
}.build())
125132

126133
actual val canHandleCodeInApp: Boolean
127134
get() = android.canHandleCodeInApp()
128-
actual val androidInstallApp: Boolean
129-
get() = android.androidInstallApp
130-
actual val androidMinimumVersion: String?
131-
get() = android.androidMinimumVersion
132-
actual val androidPackageName: String?
133-
get() = android.androidPackageName
135+
actual val androidPackageName: AndroidPackageName?
136+
get() = android.androidPackageName?.let {
137+
AndroidPackageName(it, android.androidInstallApp, android.androidMinimumVersion)
138+
}
134139
actual val iOSBundle: String?
135140
get() = android.iosBundle
136141
actual val url: String

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

+23-25
Original file line numberDiff line numberDiff line change
@@ -23,46 +23,44 @@ actual class PhoneAuthCredential(override val android: com.google.firebase.auth.
2323
actual class OAuthCredential(override val android: com.google.firebase.auth.OAuthCredential) : AuthCredential(android)
2424

2525
actual object EmailAuthProvider {
26-
actual fun credentialWithEmail(
26+
actual fun credential(
2727
email: String,
2828
password: String
2929
): AuthCredential = AuthCredential(com.google.firebase.auth.EmailAuthProvider.getCredential(email, password))
3030
}
3131

3232
actual object FacebookAuthProvider {
33-
actual fun credentialWithAccessToken(accessToken: String): AuthCredential = AuthCredential(com.google.firebase.auth.FacebookAuthProvider.getCredential(accessToken))
33+
actual fun credential(accessToken: String): AuthCredential = AuthCredential(com.google.firebase.auth.FacebookAuthProvider.getCredential(accessToken))
3434
}
3535

3636
actual object GithubAuthProvider {
37-
actual fun credentialWithToken(token: String): AuthCredential = AuthCredential(com.google.firebase.auth.GithubAuthProvider.getCredential(token))
37+
actual fun credential(token: String): AuthCredential = AuthCredential(com.google.firebase.auth.GithubAuthProvider.getCredential(token))
3838
}
3939

4040
actual object GoogleAuthProvider {
41-
actual fun credentialWithIDAndAccessToken(idToken: String, accessToken: String): AuthCredential = AuthCredential(com.google.firebase.auth.GoogleAuthProvider.getCredential(idToken, accessToken))
41+
actual fun credential(idToken: String, accessToken: String): AuthCredential = AuthCredential(com.google.firebase.auth.GoogleAuthProvider.getCredential(idToken, accessToken))
4242
}
4343

4444
actual class OAuthProvider(val android: com.google.firebase.auth.OAuthProvider.Builder, private val auth: FirebaseAuth) {
4545
actual constructor(provider: String, auth: FirebaseAuth) : this(com.google.firebase.auth.OAuthProvider.newBuilder(provider, auth.android), auth)
4646

4747
actual companion object {
48-
actual fun credentialsWithAccessToken(providerId: String, accessToken: String): AuthCredential = createCredentials(providerId) {
49-
this.accessToken = accessToken
50-
}
51-
actual fun credentialsWithIDAndAccessToken(providerId: String, idToken: String, accessToken: String): AuthCredential = createCredentials(providerId) {
52-
setIdToken(idToken)
53-
this.accessToken = accessToken
54-
}
55-
actual fun credentialsWithIDRawNonceAndAccessToken(providerId: String, idToken: String, rawNonce: String, accessToken: String): AuthCredential = createCredentials(providerId) {
56-
setIdTokenWithRawNonce(idToken, rawNonce)
57-
this.accessToken = accessToken
58-
}
59-
actual fun credentialsWithIDAndRawNonce(providerId: String, idToken: String, rawNonce: String): AuthCredential = createCredentials(providerId) {
60-
setIdTokenWithRawNonce(idToken, rawNonce)
61-
}
62-
63-
private fun createCredentials(providerId: String, block: com.google.firebase.auth.OAuthProvider.CredentialBuilder.() -> Unit): AuthCredential {
64-
val credential = com.google.firebase.auth.OAuthProvider.newCredentialBuilder(providerId).apply {
65-
block()
48+
actual fun credentials(type: OAuthCredentialsType): AuthCredential {
49+
val credential = com.google.firebase.auth.OAuthProvider.newCredentialBuilder(type.providerId).apply {
50+
when (type) {
51+
is OAuthCredentialsType.AccessToken -> accessToken = type.accessToken
52+
is OAuthCredentialsType.IdAndAccessToken -> {
53+
accessToken = type.accessToken
54+
setIdToken(type.idToken)
55+
}
56+
is OAuthCredentialsType.IdAndAccessTokenAndRawNonce -> {
57+
accessToken = type.accessToken
58+
setIdTokenWithRawNonce(type.idToken, type.rawNonce)
59+
}
60+
is OAuthCredentialsType.IdTokenAndRawNonce -> {
61+
setIdTokenWithRawNonce(type.idToken, type.rawNonce)
62+
}
63+
}
6664
}.build()
6765
return (credential as? com.google.firebase.auth.OAuthCredential)?.let { OAuthCredential(it) } ?: AuthCredential(credential)
6866
}
@@ -87,7 +85,7 @@ actual class PhoneAuthProvider(val android: com.google.firebase.auth.PhoneAuthPr
8785

8886
actual constructor(auth: FirebaseAuth) : this(com.google.firebase.auth.PhoneAuthProvider.getInstance(auth.android))
8987

90-
actual fun credentialWithVerificationIdAndSmsCode(verificationId: String, smsCode: String): PhoneAuthCredential = PhoneAuthCredential(com.google.firebase.auth.PhoneAuthProvider.getCredential(verificationId, smsCode))
88+
actual fun credential(verificationId: String, smsCode: String): PhoneAuthCredential = PhoneAuthCredential(com.google.firebase.auth.PhoneAuthProvider.getCredential(verificationId, smsCode))
9189
actual suspend fun verifyPhoneNumber(phoneNumber: String, verificationProvider: PhoneVerificationProvider): AuthCredential = coroutineScope {
9290
val response = CompletableDeferred<Result<AuthCredential>>()
9391
val callback = object :
@@ -102,7 +100,7 @@ actual class PhoneAuthProvider(val android: com.google.firebase.auth.PhoneAuthPr
102100
val code = verificationProvider.getVerificationCode()
103101
try {
104102
val credentials =
105-
credentialWithVerificationIdAndSmsCode(verificationId, code)
103+
credential(verificationId, code)
106104
response.complete(Result.success(credentials))
107105
} catch (e: Exception) {
108106
response.complete(Result.failure(e))
@@ -134,5 +132,5 @@ actual interface PhoneVerificationProvider {
134132
}
135133

136134
actual object TwitterAuthProvider {
137-
actual fun credentialWithTokenAndSecret(token: String, secret: String): AuthCredential = AuthCredential(com.google.firebase.auth.TwitterAuthProvider.getCredential(token, secret))
135+
actual fun credential(token: String, secret: String): AuthCredential = AuthCredential(com.google.firebase.auth.TwitterAuthProvider.getCredential(token, secret))
138136
}

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ actual class MultiFactor(val android: com.google.firebase.auth.MultiFactor) {
1818
actual class MultiFactorInfo(val android: com.google.firebase.auth.MultiFactorInfo) {
1919
actual val displayName: String?
2020
get() = android.displayName
21-
actual val enrollmentTime: Long
22-
get() = android.enrollmentTimestamp
21+
actual val enrollmentTime: Double
22+
get() = android.enrollmentTimestamp.toDouble()
2323
actual val factorId: String
2424
get() = android.factorId
2525
actual val uid: String

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

+14-26
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
package dev.gitlive.firebase.auth
66

77
import android.net.Uri
8+
import com.google.firebase.auth.UserProfileChangeRequest
89
import kotlinx.coroutines.tasks.await
910

1011
actual class FirebaseUser internal constructor(val android: com.google.firebase.auth.FirebaseUser) {
@@ -22,8 +23,8 @@ actual class FirebaseUser internal constructor(val android: com.google.firebase.
2223
get() = android.isAnonymous
2324
actual val isEmailVerified: Boolean
2425
get() = android.isEmailVerified
25-
actual val metaData: MetaData?
26-
get() = android.metadata?.let{ MetaData(it) }
26+
actual val metaData: UserMetaData?
27+
get() = android.metadata?.let{ UserMetaData(it) }
2728
actual val multiFactor: MultiFactor
2829
get() = MultiFactor(android.multiFactor)
2930
actual val providerData: List<UserInfo>
@@ -44,9 +45,12 @@ actual class FirebaseUser internal constructor(val android: com.google.firebase.
4445
actual suspend fun updateEmail(email: String) = android.updateEmail(email).await().run { Unit }
4546
actual suspend fun updatePassword(password: String) = android.updatePassword(password).await().run { Unit }
4647
actual suspend fun updatePhoneNumber(credential: PhoneAuthCredential) = android.updatePhoneNumber(credential.android).await().run { Unit }
47-
actual suspend fun updateProfile(buildRequest: UserProfileChangeRequest.Builder.() -> Unit) {
48-
val request = UserProfileChangeRequest.Builder().apply(buildRequest).build()
49-
android.updateProfile(request.android).await()
48+
actual suspend fun updateProfile(displayName: String?, photoUrl: String?) {
49+
val request = UserProfileChangeRequest.Builder().apply {
50+
this.displayName = displayName
51+
photoUri = photoURL?.let { Uri.parse(it) }
52+
}.build()
53+
android.updateProfile(request).await()
5054
}
5155
actual suspend fun verifyBeforeUpdateEmail(newEmail: String, actionCodeSettings: ActionCodeSettings?) = android.verifyBeforeUpdateEmail(newEmail, actionCodeSettings?.android).await().run { Unit }
5256
}
@@ -66,25 +70,9 @@ actual class UserInfo(val android: com.google.firebase.auth.UserInfo) {
6670
get() = android.uid
6771
}
6872

69-
actual class MetaData(val android: com.google.firebase.auth.FirebaseUserMetadata) {
70-
actual val creationTime: Long?
71-
get() = android.creationTimestamp
72-
actual val lastSignInTime: Long?
73-
get() = android.lastSignInTimestamp
74-
}
75-
76-
actual class UserProfileChangeRequest(val android: com.google.firebase.auth.UserProfileChangeRequest) {
77-
actual class Builder(val android: com.google.firebase.auth.UserProfileChangeRequest.Builder = com.google.firebase.auth.UserProfileChangeRequest.Builder()) {
78-
actual fun setDisplayName(displayName: String?): Builder = apply {
79-
android.setDisplayName(displayName)
80-
}
81-
actual fun setPhotoURL(photoURL: String?): Builder = apply {
82-
android.setPhotoUri(photoURL?.let { Uri.parse(it) })
83-
}
84-
actual fun build(): UserProfileChangeRequest = UserProfileChangeRequest(android.build())
85-
}
86-
actual val displayName: String?
87-
get() = android.displayName
88-
actual val photoURL: String?
89-
get() = android.photoUri?.toString()
73+
actual class UserMetaData(val android: com.google.firebase.auth.FirebaseUserMetadata) {
74+
actual val creationTime: Double?
75+
get() = android.creationTimestamp.toDouble()
76+
actual val lastSignInTime: Double?
77+
get() = android.lastSignInTimestamp.toDouble()
9078
}

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

+21-16
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,10 @@ expect class AuthResult {
4242

4343
expect class ActionCodeResult {
4444
val operation: Operation
45-
fun <T, A: ActionCodeDataType<T>> getData(type: A): T?
45+
}
46+
47+
fun <T, A: ActionCodeDataType<T>> ActionCodeResult.getData(type: A): T? {
48+
return type.dataForResult(this)
4649
}
4750

4851
expect class SignInMethodQueryResult {
@@ -59,30 +62,32 @@ enum class Operation {
5962
RevertSecondFactorAddition
6063
}
6164

62-
sealed class ActionCodeDataType<T> {
63-
object Email : ActionCodeDataType<String>()
64-
object PreviousEmail : ActionCodeDataType<String>()
65-
object MultiFactor : ActionCodeDataType<MultiFactorInfo>()
65+
expect sealed class ActionCodeDataType<out T> {
66+
67+
internal abstract fun dataForResult(result: ActionCodeResult): T?
68+
69+
object Email : ActionCodeDataType<String>
70+
object PreviousEmail : ActionCodeDataType<String>
71+
object MultiFactor : ActionCodeDataType<MultiFactorInfo>
6672
}
6773

6874
expect class ActionCodeSettings {
69-
class Builder {
70-
fun setAndroidPackageName(androidPackageName: String, installIfNotAvailable: Boolean, minimumVersion: String?): Builder
71-
fun setDynamicLinkDomain(dynamicLinkDomain: String): Builder
72-
fun setHandleCodeInApp(canHandleCodeInApp: Boolean): Builder
73-
fun setIOSBundleId(iOSBundleId: String): Builder
74-
fun setUrl(url: String): Builder
75-
fun build(): ActionCodeSettings
76-
}
75+
constructor(
76+
url: String,
77+
androidPackageName: AndroidPackageName? = null,
78+
dynamicLinkDomain: String? = null,
79+
canHandleCodeInApp: Boolean = false,
80+
iOSBundleId: String? = null
81+
)
7782

7883
val canHandleCodeInApp: Boolean
79-
val androidInstallApp: Boolean
80-
val androidMinimumVersion: String?
81-
val androidPackageName: String?
84+
val androidPackageName: AndroidPackageName?
8285
val iOSBundle: String?
8386
val url: String
8487
}
8588

89+
data class AndroidPackageName(val androidPackageName: String, val installIfNotAvailable: Boolean, val minimumVersion: String?)
90+
8691
expect open class FirebaseAuthException : FirebaseException
8792
expect class FirebaseAuthActionCodeException : FirebaseAuthException
8893
expect class FirebaseAuthEmailException : FirebaseAuthException

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

+18-10
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
package dev.gitlive.firebase.auth
66

77
import dev.gitlive.firebase.Firebase
8+
import kotlin.jvm.JvmName
9+
import kotlin.js.JsName
810

911
expect open class AuthCredential {
1012
val providerId: String
@@ -14,27 +16,33 @@ expect class PhoneAuthCredential : AuthCredential
1416
expect class OAuthCredential : AuthCredential
1517

1618
expect object EmailAuthProvider {
17-
fun credentialWithEmail(email: String, password: String): AuthCredential
19+
fun credential(email: String, password: String): AuthCredential
1820
}
1921

2022
expect object FacebookAuthProvider {
21-
fun credentialWithAccessToken(accessToken: String): AuthCredential
23+
fun credential(accessToken: String): AuthCredential
2224
}
2325

2426
expect object GithubAuthProvider {
25-
fun credentialWithToken(token: String): AuthCredential
27+
fun credential(token: String): AuthCredential
2628
}
2729

2830
expect object GoogleAuthProvider {
29-
fun credentialWithIDAndAccessToken(idToken: String, accessToken: String): AuthCredential
31+
fun credential(idToken: String, accessToken: String): AuthCredential
32+
}
33+
34+
sealed class OAuthCredentialsType {
35+
abstract val providerId: String
36+
data class AccessToken(val accessToken: String, override val providerId: String) : OAuthCredentialsType()
37+
data class IdAndAccessToken(val idToken: String, val accessToken: String, override val providerId: String) : OAuthCredentialsType()
38+
data class IdAndAccessTokenAndRawNonce(val idToken: String, val accessToken: String, val rawNonce: String, override val providerId: String) : OAuthCredentialsType()
39+
data class IdTokenAndRawNonce(val idToken: String, val rawNonce: String, override val providerId: String) : OAuthCredentialsType()
40+
3041
}
3142

3243
expect class OAuthProvider constructor(provider: String, auth: FirebaseAuth = Firebase.auth) {
3344
companion object {
34-
fun credentialsWithAccessToken(providerId: String, accessToken: String): AuthCredential
35-
fun credentialsWithIDAndAccessToken(providerId: String, idToken: String, accessToken: String): AuthCredential
36-
fun credentialsWithIDRawNonceAndAccessToken(providerId: String, idToken: String, rawNonce: String, accessToken: String): AuthCredential
37-
fun credentialsWithIDAndRawNonce(providerId: String, idToken: String, rawNonce: String): AuthCredential
45+
fun credentials(type: OAuthCredentialsType): AuthCredential
3846
}
3947

4048
fun addScope(vararg scope: String)
@@ -46,13 +54,13 @@ expect class OAuthProvider constructor(provider: String, auth: FirebaseAuth = Fi
4654
expect class SignInProvider
4755

4856
expect class PhoneAuthProvider constructor(auth: FirebaseAuth = Firebase.auth) {
49-
fun credentialWithVerificationIdAndSmsCode(verificationId: String, smsCode: String): PhoneAuthCredential
57+
fun credential(verificationId: String, smsCode: String): PhoneAuthCredential
5058
suspend fun verifyPhoneNumber(phoneNumber: String, verificationProvider: PhoneVerificationProvider): AuthCredential
5159

5260
}
5361

5462
expect interface PhoneVerificationProvider
5563

5664
expect object TwitterAuthProvider {
57-
fun credentialWithTokenAndSecret(token: String, secret: String): AuthCredential
65+
fun credential(token: String, secret: String): AuthCredential
5866
}

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ expect class MultiFactor {
1414

1515
expect class MultiFactorInfo {
1616
val displayName: String?
17-
val enrollmentTime: Long
17+
val enrollmentTime: Double
1818
val factorId: String
1919
val uid: String
2020
}

0 commit comments

Comments
 (0)