@@ -24,11 +24,14 @@ class Authentication(private val plugin: FirebasePlugin) {
2424 private lateinit var activity: android.app.Activity
2525 private val auth: FirebaseAuth = Firebase .auth
2626 private lateinit var googleSignInClient: GoogleSignInClient
27+ private var isLinkingAnonymous = false
2728
2829 fun authSignals (): MutableSet <SignalInfo > {
2930 val signals: MutableSet <SignalInfo > = mutableSetOf ()
3031 signals.add(SignalInfo (" auth_success" , Dictionary ::class .java))
3132 signals.add(SignalInfo (" auth_failure" , String ::class .java))
33+ signals.add(SignalInfo (" link_with_google_success" , Dictionary ::class .java))
34+ signals.add(SignalInfo (" link_with_google_failure" , String ::class .java))
3235 signals.add(SignalInfo (" sign_out_success" , Boolean ::class .javaObjectType))
3336 signals.add(SignalInfo (" password_reset_sent" , Boolean ::class .javaObjectType))
3437 signals.add(SignalInfo (" email_verification_sent" , Boolean ::class .javaObjectType))
@@ -61,15 +64,32 @@ class Authentication(private val plugin: FirebasePlugin) {
6164 try {
6265 val account = task.getResult(ApiException ::class .java)!!
6366 Log .d(TAG , " authWithGoogle:" + account.id)
64- authWithGoogle(account.idToken!! )
67+ if (isLinkingAnonymous) {
68+ isLinkingAnonymous = false
69+ linkWithGoogle(account.idToken!! )
70+ } else {
71+ authWithGoogle(account.idToken!! )
72+ }
6573 } catch (e: ApiException ) {
74+ val wasLinking = isLinkingAnonymous
75+ isLinkingAnonymous = false
6676 Log .w(TAG , " Google sign in failed" , e)
67- plugin.emitGodotSignal(" auth_failure" , e.message ? : " Unknown error" )
77+ if (wasLinking) {
78+ plugin.emitGodotSignal(" link_with_google_failure" , e.message ? : " Unknown error" )
79+ } else {
80+ plugin.emitGodotSignal(" auth_failure" , e.message ? : " Unknown error" )
81+ }
6882 }
6983 }
7084 }
7185
7286 fun signInAnonymously () {
87+ val currentUser = auth.currentUser
88+ if (currentUser != null ) {
89+ Log .d(TAG , " User already signed in (uid=${currentUser.uid} , isAnonymous=${currentUser.isAnonymous} ). Skipping anonymous sign-in." )
90+ plugin.emitGodotSignal(" auth_failure" , " User is already signed in." )
91+ return
92+ }
7393 auth.signInAnonymously()
7494 .addOnSuccessListener {
7595 val uid = it.user?.uid
@@ -146,6 +166,23 @@ class Authentication(private val plugin: FirebasePlugin) {
146166 }
147167 }
148168
169+ fun linkAnonymousWithGoogle () {
170+ val currentUser = auth.currentUser
171+ if (currentUser == null ) {
172+ Log .e(TAG , " No user signed in." )
173+ plugin.emitGodotSignal(" link_with_google_failure" , " No user signed in." )
174+ return
175+ }
176+ if (! currentUser.isAnonymous) {
177+ Log .d(TAG , " Current user is not anonymous (uid=${currentUser.uid} ). Cannot link." )
178+ plugin.emitGodotSignal(" link_with_google_failure" , " Current user is not anonymous." )
179+ return
180+ }
181+ Log .d(TAG , " Linking anonymous user (uid=${currentUser.uid} ) with Google." )
182+ isLinkingAnonymous = true
183+ signInWithGoogle()
184+ }
185+
149186 private fun authWithGoogle (idToken : String ) {
150187 val credential = GoogleAuthProvider .getCredential(idToken, null )
151188 auth.signInWithCredential(credential)
@@ -160,6 +197,26 @@ class Authentication(private val plugin: FirebasePlugin) {
160197 }
161198 }
162199
200+ private fun linkWithGoogle (idToken : String ) {
201+ val currentUser = auth.currentUser
202+ if (currentUser == null ) {
203+ Log .e(TAG , " No user signed in during linkWithGoogle." )
204+ plugin.emitGodotSignal(" link_with_google_failure" , " No user signed in." )
205+ return
206+ }
207+ val credential = GoogleAuthProvider .getCredential(idToken, null )
208+ currentUser.linkWithCredential(credential)
209+ .addOnSuccessListener { authResult ->
210+ val uid = authResult.user?.uid
211+ Log .d(TAG , " linkWithCredential:success -> $uid " )
212+ plugin.emitGodotSignal(" link_with_google_success" , getCurrentUser())
213+ }
214+ .addOnFailureListener { e ->
215+ Log .w(TAG , " linkWithCredential:failure" , e)
216+ plugin.emitGodotSignal(" link_with_google_failure" , e.message ? : " Unknown error" )
217+ }
218+ }
219+
163220 fun getCurrentUser (): Dictionary {
164221 val user = auth.currentUser
165222 val userData = Dictionary ()
@@ -168,6 +225,7 @@ class Authentication(private val plugin: FirebasePlugin) {
168225 userData[" email" ] = user.email
169226 userData[" photoUrl" ] = user.photoUrl?.toString()
170227 userData[" emailVerified" ] = user.isEmailVerified
228+ userData[" isAnonymous" ] = user.isAnonymous
171229 userData[" uid" ] = user.uid
172230 } else {
173231 userData[" error" ] = " No user signed in"
0 commit comments