From fa065765e55a861f5483d068223312421d75f92f Mon Sep 17 00:00:00 2001 From: mrchnk Date: Mon, 19 Apr 2021 18:48:59 +0300 Subject: [PATCH 1/6] [GoogleSignIn] customize client using options object --- .../firebase/auth/PlayGamesAuthCredential.as | 23 ++ .../src/com/tuarua/google/GoogleSignIn.as | 33 ++- .../tuarua/google/GoogleSignInANEContext.as | 32 ++- .../google/signin/GoogleSignInAccount.as | 203 ++++++++++++++++++ .../google/signin/GoogleSignInOptions.as | 175 +++++++++++++++ .../google/signin/events/GoogleSignInEvent.as | 25 ++- .../google/googlesignin/KotlinController.kt | 34 +-- .../google/googlesignin/ResultListener.kt | 27 ++- .../extensions/FreGoogleSignInOptions.kt | 48 +++++ .../SwiftController+GIDSignInDelegate.swift | 30 ++- .../GoogleSignInANE/SwiftController.swift | 8 + 11 files changed, 579 insertions(+), 59 deletions(-) create mode 100644 native_extension/GoogleSignInANE/src/com/tuarua/firebase/auth/PlayGamesAuthCredential.as create mode 100644 native_extension/GoogleSignInANE/src/com/tuarua/google/signin/GoogleSignInAccount.as create mode 100644 native_extension/GoogleSignInANE/src/com/tuarua/google/signin/GoogleSignInOptions.as create mode 100644 native_library/android/FirebaseANE/GoogleSignIn/src/main/java/com/tuarua/google/googlesignin/extensions/FreGoogleSignInOptions.kt diff --git a/native_extension/GoogleSignInANE/src/com/tuarua/firebase/auth/PlayGamesAuthCredential.as b/native_extension/GoogleSignInANE/src/com/tuarua/firebase/auth/PlayGamesAuthCredential.as new file mode 100644 index 00000000..1ac7cba8 --- /dev/null +++ b/native_extension/GoogleSignInANE/src/com/tuarua/firebase/auth/PlayGamesAuthCredential.as @@ -0,0 +1,23 @@ +/* + * Copyright 2021 Tua Rua Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.tuarua.firebase.auth { +public class PlayGamesAuthCredential extends AuthCredential { + public function PlayGamesAuthCredential(serverAuthCode:String) { + super('playgames.google.com', serverAuthCode); + } +} +} diff --git a/native_extension/GoogleSignInANE/src/com/tuarua/google/GoogleSignIn.as b/native_extension/GoogleSignInANE/src/com/tuarua/google/GoogleSignIn.as index a01ceab2..e71d3465 100644 --- a/native_extension/GoogleSignInANE/src/com/tuarua/google/GoogleSignIn.as +++ b/native_extension/GoogleSignInANE/src/com/tuarua/google/GoogleSignIn.as @@ -16,22 +16,46 @@ package com.tuarua.google { import com.tuarua.fre.ANEError; +import com.tuarua.google.signin.GoogleSignInOptions; import flash.events.EventDispatcher; +/** + * It is possible to configure GoogleSignIn before use with options property. + * + * + * // To sign into Play Games insted of regular Google account + * // Note: officially supported on Android only + * GoogleSignIn.options = GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN; + * GoogleSignIn.shared().signIn(); + * + * + * @see #GoogleSignInOptions + */ public final class GoogleSignIn extends EventDispatcher { private static var _shared:GoogleSignIn; - private static var _apiKey:String; + private static var _options:GoogleSignInOptions; /** @private */ public function GoogleSignIn() { if (GoogleSignInANEContext.context) { - var ret:* = GoogleSignInANEContext.context.call("init", _apiKey); + var ret:* = GoogleSignInANEContext.context.call("init", _options); if (ret is ANEError) throw ret as ANEError; } _shared = this; } + /** + * Configuration for GoogleSignIn client. Set it before access GoogleSignIn api if needed. + */ + public static function get options():GoogleSignInOptions { + return _options; + } + + public static function set options(value:GoogleSignInOptions):void { + _options = value; + } + /** The ANE instance. */ public static function shared():GoogleSignIn { if (!_shared) { @@ -85,10 +109,5 @@ public final class GoogleSignIn extends EventDispatcher { GoogleSignInANEContext.dispose(); } } - - /** set the API key if not using Firebase resources */ - public static function set apiKey(value:String):void { - _apiKey = value; - } } } diff --git a/native_extension/GoogleSignInANE/src/com/tuarua/google/GoogleSignInANEContext.as b/native_extension/GoogleSignInANE/src/com/tuarua/google/GoogleSignInANEContext.as index aefe6521..7db4aa7d 100644 --- a/native_extension/GoogleSignInANE/src/com/tuarua/google/GoogleSignInANEContext.as +++ b/native_extension/GoogleSignInANE/src/com/tuarua/google/GoogleSignInANEContext.as @@ -14,7 +14,7 @@ * limitations under the License. */ package com.tuarua.google { -import com.tuarua.firebase.auth.GoogleAuthCredential; +import com.tuarua.google.signin.GoogleSignInAccount; import com.tuarua.google.signin.events.GoogleSignInEvent; import flash.events.StatusEvent; @@ -62,27 +62,39 @@ public class GoogleSignInANEContext { trace("[" + NAME + "]", event.code); break; case GoogleSignInEvent.ERROR: + var error:Error; try { argsAsJSON = JSON.parse(event.code); - var error:Error = new Error(argsAsJSON.data.text, argsAsJSON.data.id); - GoogleSignIn.shared().dispatchEvent(new GoogleSignInEvent(event.level, null, error)); + error = new Error(argsAsJSON.data.text, argsAsJSON.data.id); } catch (e:Error) { trace("parsing error", event.code, e.message); + return; } + GoogleSignIn.shared().dispatchEvent(new GoogleSignInEvent(event.level, null, error)); break; case GoogleSignInEvent.SIGN_IN: + var account:GoogleSignInAccount; try { argsAsJSON = JSON.parse(event.code); - var idToken:String = argsAsJSON.data.idToken; - var accessToken:String; - if (argsAsJSON.data.hasOwnProperty("accessToken")) { - accessToken = argsAsJSON.data.accessToken; - } - var credential:GoogleAuthCredential = new GoogleAuthCredential(idToken, accessToken); - GoogleSignIn.shared().dispatchEvent(new GoogleSignInEvent(event.level, credential)); + var data:Object = argsAsJSON["data"] || {}; + account = new GoogleSignInAccount(); + account.id = data["id"] || null; + account.idToken = data["idToken"] || null; + account.serverAuthCode = data["serverAuthCode"] || null; + account.email = data["email"] || null; + account.photoUrl = data["photoUrl"] || null; + account.displayName = data["displayName"] || null; + account.familyName = data["familyName"] || null; + account.givenName = data["givenName"] || null; + account.grantedScopes = data["grantedScopes"] is Array + ? Vector.(data["grantedScopes"]) + : new []; + account.accessToken = data["accessToken"] || null; } catch (e:Error) { trace("parsing error", event.code, e.message); + return; } + GoogleSignIn.shared().dispatchEvent(new GoogleSignInEvent(event.level, account)); break; } } diff --git a/native_extension/GoogleSignInANE/src/com/tuarua/google/signin/GoogleSignInAccount.as b/native_extension/GoogleSignInANE/src/com/tuarua/google/signin/GoogleSignInAccount.as new file mode 100644 index 00000000..ebf667ea --- /dev/null +++ b/native_extension/GoogleSignInANE/src/com/tuarua/google/signin/GoogleSignInAccount.as @@ -0,0 +1,203 @@ +/* + * Copyright 2021 Tua Rua Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.tuarua.google.signin { + +/** + * GoogleSignIn account information + */ +public class GoogleSignInAccount { + + private var _id:String = null; + private var _idToken:String = null; + private var _serverAuthCode:String = null; + private var _displayName:String = null; + private var _email:String = null; + private var _photoUrl:String = null; + private var _grantedScopes:Vector. = new []; + private var _familyName:String = null; + private var _givenName:String = null; + private var _accessToken:String = null; + + public function GoogleSignInAccount() { + } + + /** + * Unique ID for the Google account. + * Will be present if `openid` scope was granted. + * Also on iOS platform. + * + * @see GoogleSignInOptions#DEFAULT_SIGN_IN + * @see GoogleSignInOptions#requestId + * @see https://developers.google.com/android/reference/com/google/android/gms/auth/api/signin/GoogleSignInAccount#public-string-getid + * @see https://developers.google.com/identity/sign-in/ios/reference/Classes/GIDGoogleUser#userid + */ + public function get id():String { + return _id; + } + + public function set id(value:String):void { + _id = value; + } + + /** + * Returns an ID token that you can send to your server. + * Will be present if client options requestIdToken is true. + * Also on iOS platform. + * + * @see GoogleSignInOptions#requestIdToken + * @see https://developers.google.com/android/reference/com/google/android/gms/auth/api/signin/GoogleSignInAccount#public-string-getidtoken + * @see https://developers.google.com/identity/sign-in/ios/reference/Classes/GIDAuthentication#idtoken + */ + public function get idToken():String { + return _idToken; + } + + public function set idToken(value:String):void { + _idToken = value; + } + + /** + * Returns a one-time server auth code to send to your web server which can be exchanged for access token. + * Will be present if client options requestServerAuthCode is true. + * + * @see GoogleSignInOptions#requestServerAuthCode + * @see https://developers.google.com/android/reference/com/google/android/gms/auth/api/signin/GoogleSignInAccount#public-string-getserverauthcode + * @see https://developers.google.com/identity/sign-in/ios/reference/Classes/GIDGoogleUser#serverauthcode + */ + public function get serverAuthCode():String { + return _serverAuthCode; + } + + public function set serverAuthCode(value:String):void { + _serverAuthCode = value; + } + + /** + * Returns the email address of the signed in user. + * Will be present if `email` scope was granted. + * + * @see GoogleSignInOptions#requestEmail + * @see https://developers.google.com/android/reference/com/google/android/gms/auth/api/signin/GoogleSignInAccount#public-string-getemail + * @see https://developers.google.com/identity/sign-in/ios/reference/Classes/GIDProfileData#email + */ + public function get email():String { + return _email; + } + + public function set email(value:String):void { + _email = value; + } + + /** + * Returns the photo url of the signed in user. + * Will be present if user has a profile picture and `profile` scope was granted. + * + * @see GoogleSignInOptions#requestProfile + * @see https://developers.google.com/android/reference/com/google/android/gms/auth/api/signin/GoogleSignInAccount#public-uri-getphotourl + * @see https://developers.google.com/identity/sign-in/ios/reference/Classes/GIDProfileData#-imageurlwithdimension: + */ + public function get photoUrl():String { + return _photoUrl; + } + + public function set photoUrl(value:String):void { + _photoUrl = value; + } + + /** + * Returns the display name of the signed in user. + * Will be present if `profile` scope was granted. + * + * @see GoogleSignInOptions#requestProfile + * @see https://developers.google.com/android/reference/com/google/android/gms/auth/api/signin/GoogleSignInAccount#public-string-getdisplayname + * @see https://developers.google.com/identity/sign-in/ios/reference/Classes/GIDProfileData#name + */ + public function get displayName():String { + return _displayName; + } + + public function set displayName(value:String):void { + _displayName = value; + } + + /** + * Returns the family name of the signed in user. + * Will be present if `profile` scope was granted. + * + * @see GoogleSignInOptions#requestProfile + * @see https://developers.google.com/android/reference/com/google/android/gms/auth/api/signin/GoogleSignInAccount#public-string-getfamilyname + * @see https://developers.google.com/identity/sign-in/ios/reference/Classes/GIDProfileData#familyname + */ + public function get familyName():String { + return _familyName; + } + + public function set familyName(value:String):void { + _familyName = value; + } + + /** + * Returns the given name of the signed in user. + * Will be present if `profile` scope was granted. + * + * @see GoogleSignInOptions#requestProfile + * @see https://developers.google.com/android/reference/com/google/android/gms/auth/api/signin/GoogleSignInAccount#public-string-getgivenname + * @see https://developers.google.com/identity/sign-in/ios/reference/Classes/GIDProfileData#givenname + */ + public function get givenName():String { + return _givenName; + } + + public function set givenName(value:String):void { + _givenName = value; + } + + /** + * Returns all scopes that have been authorized to your application. + * + * @see GoogleSignInOptions#scopes + * @see https://developers.google.com/android/reference/com/google/android/gms/auth/api/signin/GoogleSignInAccount#public-setscope-getgrantedscopes + * @see https://developers.google.com/identity/sign-in/ios/reference/Classes/GIDGoogleUser#grantedscopes + */ + public function get grantedScopes():Vector. { + return _grantedScopes; + } + + public function set grantedScopes(value:Vector.):void { + _grantedScopes = value; + } + + /** + * The OAuth2 access token to access Google services. + * Will be present on iOS platform. + * + * @see https://developers.google.com/identity/sign-in/ios/reference/Classes/GIDAuthentication#accesstoken + */ + public function get accessToken():String { + return _accessToken; + } + + public function set accessToken(value:String):void { + _accessToken = value; + } + + public function hasScope(scope:String):Boolean { + return _grantedScopes.indexOf(scope) !== -1; + } + +} +} diff --git a/native_extension/GoogleSignInANE/src/com/tuarua/google/signin/GoogleSignInOptions.as b/native_extension/GoogleSignInANE/src/com/tuarua/google/signin/GoogleSignInOptions.as new file mode 100644 index 00000000..7fbce350 --- /dev/null +++ b/native_extension/GoogleSignInANE/src/com/tuarua/google/signin/GoogleSignInOptions.as @@ -0,0 +1,175 @@ +/* + * Copyright 2021 Tua Rua Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.tuarua.google.signin { + +/** + * Options for GoogleSignIn client. + */ +public class GoogleSignInOptions { + + /** + * Default configuration for Google Sign In. + */ + public static function get DEFAULT_SIGN_IN():GoogleSignInOptions { + var options:GoogleSignInOptions = new GoogleSignInOptions(new ['openid', 'profile']); + options.requestServerAuthCode = true; + return options; + } + + /** + * Default and recommended configuration for Play Games Sign In. + */ + public static function get DEFAULT_GAMES_SIGN_IN():GoogleSignInOptions { + var options:GoogleSignInOptions = new GoogleSignInOptions(new ['https://www.googleapis.com/auth/games_lite']); + options.requestIdToken = true; + return options; + } + + private var _scopes:Vector.; + private var _requestIdToken:Boolean = false; + private var _requestServerAuthCode:Boolean = false; + private var _serverClientId:String = null; + + public function GoogleSignInOptions(scopes:Vector. = null) { + _scopes = scopes ? scopes : new []; + } + + /** + * Specifies OAuth 2.0 scopes your application requests. + * You can modify requested scopes using addScope() + * + * @see #addScope + * @see https://developers.google.com/android/reference/com/google/android/gms/auth/api/signin/GoogleSignInOptions.Builder#public-googlesigninoptions.builder-requestscopes-scope-scope,-scope...-scopes + * @see https://developers.google.com/android/reference/com/google/android/gms/common/Scopes + */ + public function get scopes():Vector. { + return _scopes; + } + + /** + * Specifies that user ID is requested by your application. + * Will add `openid` scope if set to true. + * + * @see GoogleSignInAccount#id + */ + public function get requestId():Boolean { + return hasScope('openid'); + } + + public function set requestId(value:Boolean):void { + setScope('openid', value); + } + + /** + * Specifies that email info is requested by your application. + * Will add `email` scope if set to true. + * + * @see GoogleSignInAccount#email + */ + public function get requestEmail():Boolean { + return hasScope('email'); + } + + public function set requestEmail(value:Boolean):void { + setScope('email', value); + } + + /** + * Specifies that user's profile info is requested by your application. + * Will add `profile` scope if set to true. + */ + public function get requestProfile():Boolean { + return hasScope('profile'); + } + + public function set requestProfile(value:Boolean):void { + setScope('profile', value); + } + + /** + * Specifies that an ID token for authenticated users is requested. + * Requesting an ID token requires that the server client ID be specified. + * + * @see https://developers.google.com/android/reference/com/google/android/gms/auth/api/signin/GoogleSignInOptions.Builder#public-googlesigninoptions.builder-requestidtoken-string-serverclientid + * @see https://developers.google.com/identity/sign-in/ios/reference/Classes/GIDSignIn#serverclientid + * @see #serverClientId + */ + public function get requestIdToken():Boolean { + return _requestIdToken; + } + + public function set requestIdToken(value:Boolean):void { + _requestIdToken = value; + } + + /** + * Specifies that offline access is requested. + * Requesting offline access requires that the server client ID be specified. + * + * @see https://developers.google.com/android/reference/com/google/android/gms/auth/api/signin/GoogleSignInOptions.Builder#public-googlesigninoptions.builder-requestserverauthcode-string-serverclientid + * @see https://developers.google.com/identity/sign-in/ios/reference/Classes/GIDSignIn#serverclientid + * @see #serverClientId + */ + public function get requestServerAuthCode():Boolean { + return _requestServerAuthCode; + } + + public function set requestServerAuthCode(value:Boolean):void { + _requestServerAuthCode = value; + } + + /** + * The client ID of the server that will need to get `serverAuthCode` or verify `idToken` + * On Android you can left that unspecified, then string value of resource `default_web_client_id` will be used. + * + * https://developers.google.com/identity/sign-in/ios/reference/Classes/GIDSignIn#serverclientid + */ + public function get serverClientId():String { + return _serverClientId; + } + + public function set serverClientId(value:String):void { + _serverClientId = value; + } + + /** + * Add OAuth scope to requested + * + * @param scope + */ + public function addScope(scope:String):void { + if (!scope) { + throw new ArgumentError('empty scope'); + } + setScope(scope, true); + } + + public function hasScope(scope:String):Boolean { + return _scopes.indexOf(scope) !== -1; + } + + private function setScope(scope:String, value:Boolean):void { + var index:int = _scopes.indexOf(scope); + if (value && index === -1) { + _scopes.push(scope); + } else if (!value && index !== -1) { + _scopes.splice(index, 1); + } + } + +} +} diff --git a/native_extension/GoogleSignInANE/src/com/tuarua/google/signin/events/GoogleSignInEvent.as b/native_extension/GoogleSignInANE/src/com/tuarua/google/signin/events/GoogleSignInEvent.as index 274f557b..3cac6ced 100644 --- a/native_extension/GoogleSignInANE/src/com/tuarua/google/signin/events/GoogleSignInEvent.as +++ b/native_extension/GoogleSignInANE/src/com/tuarua/google/signin/events/GoogleSignInEvent.as @@ -14,29 +14,44 @@ * limitations under the License. */ package com.tuarua.google.signin.events { +import com.tuarua.firebase.auth.AuthCredential; import com.tuarua.firebase.auth.GoogleAuthCredential; +import com.tuarua.firebase.auth.PlayGamesAuthCredential; +import com.tuarua.google.signin.GoogleSignInAccount; import flash.events.Event; public class GoogleSignInEvent extends Event { public static const SIGN_IN:String = "GoogleSignInEvent.SignIn"; public static const ERROR:String = "GoogleSignInEvent.Error"; - public var credential:GoogleAuthCredential; + public var account:GoogleSignInAccount; public var error:Error; - public function GoogleSignInEvent(type:String, credential:GoogleAuthCredential = null, error:Error = null, + public function GoogleSignInEvent(type:String, account:GoogleSignInAccount = null, error:Error = null, bubbles:Boolean = false, cancelable:Boolean = false) { super(type, bubbles, cancelable); - this.credential = credential; + this.account = account; this.error = error; } + public function get credential():AuthCredential { + if (!account) { + return null; + } else if (account.idToken) { + return new GoogleAuthCredential(account.idToken, account.accessToken); + } else if (account.serverAuthCode && account.hasScope('https://www.googleapis.com/auth/games_lite')) { + return new PlayGamesAuthCredential(account.serverAuthCode); + } else { + return null; + } + } + public override function clone():Event { - return new GoogleSignInEvent(type, this.credential, this.error, bubbles, cancelable); + return new GoogleSignInEvent(type, this.account, this.error, bubbles, cancelable); } public override function toString():String { - return formatToString("GoogleSignInEvent", "credential", "error", "type", "bubbles", "cancelable"); + return formatToString("GoogleSignInEvent", "account", "error", "type", "bubbles", "cancelable"); } } } diff --git a/native_library/android/FirebaseANE/GoogleSignIn/src/main/java/com/tuarua/google/googlesignin/KotlinController.kt b/native_library/android/FirebaseANE/GoogleSignIn/src/main/java/com/tuarua/google/googlesignin/KotlinController.kt index 9df98ec0..c41fecc8 100644 --- a/native_library/android/FirebaseANE/GoogleSignIn/src/main/java/com/tuarua/google/googlesignin/KotlinController.kt +++ b/native_library/android/FirebaseANE/GoogleSignIn/src/main/java/com/tuarua/google/googlesignin/KotlinController.kt @@ -18,37 +18,35 @@ package com.tuarua.google.googlesignin import android.content.res.Resources import com.adobe.fre.FREContext import com.adobe.fre.FREObject +import com.adobe.fre.FREArray import com.google.android.gms.auth.api.signin.GoogleSignIn +import com.google.android.gms.auth.api.signin.GoogleSignInClient +import com.google.android.gms.auth.api.signin.GoogleSignInOptions +import com.google.android.gms.common.api.Scope import com.tuarua.frekotlin.* +import com.tuarua.google.googlesignin.extensions.GoogleSignInOptions import java.util.* -import com.google.android.gms.auth.api.signin.GoogleSignInOptions -import com.google.android.gms.auth.api.signin.GoogleSignInClient @Suppress("unused", "UNUSED_PARAMETER", "UNCHECKED_CAST", "PrivatePropertyName") class KotlinController : FreKotlinMainController { + private var googleSignInClient: GoogleSignInClient? = null + fun createGUID(ctx: FREContext, argv: FREArgv): FREObject? { return UUID.randomUUID().toString().toFREObject() } fun init(ctx: FREContext, argv: FREArgv): FREObject? { val context = context ?: return FreException("no context").getError() - val resources = context.activity?.resources - ?: return FreException("no resources").getError() - val act = context.activity ?: return FreException("no application context").getError() + val resources = context.activity?.resources ?: return FreException("no resources").getError() + val activity = context.activity ?: return FreException("no application context").getError() try { - val apiKey = String(argv[0]) ?: resources.getString(context.getResourceId("string.default_web_client_id")) - val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) - .requestIdToken(apiKey) - .requestEmail() - .build() - - googleSignInClient = GoogleSignIn.getClient(act, gso) - - } catch (e: Resources.NotFoundException) { - return FreException( - "Cannot find required default_web_client_id. Ensure Firebase resources file added to FirebaseANE" - ).getError() + val id = resources.getIdentifier("default_web_client_id", "string", null) + val defaultClientId = if (id != 0) resources.getString(id) else null + val gso = GoogleSignInOptions(argv[0], defaultClientId) + googleSignInClient = GoogleSignIn.getClient(activity, gso) + } catch (e: Exception) { + return FreException(e, "Failed create GoogleSignInClient").getError() } return true.toFREObject() } @@ -80,7 +78,9 @@ class KotlinController : FreKotlinMainController { override val TAG: String? get() = this::class.java.canonicalName + private var _context: FREContext? = null + override var context: FREContext? get() = _context set(value) { diff --git a/native_library/android/FirebaseANE/GoogleSignIn/src/main/java/com/tuarua/google/googlesignin/ResultListener.kt b/native_library/android/FirebaseANE/GoogleSignIn/src/main/java/com/tuarua/google/googlesignin/ResultListener.kt index e2890a45..9cb4bb9b 100644 --- a/native_library/android/FirebaseANE/GoogleSignIn/src/main/java/com/tuarua/google/googlesignin/ResultListener.kt +++ b/native_library/android/FirebaseANE/GoogleSignIn/src/main/java/com/tuarua/google/googlesignin/ResultListener.kt @@ -25,24 +25,29 @@ import com.tuarua.frekotlin.FreKotlinController import com.tuarua.google.googlesignin.events.GoogleSignInEvent class ResultListener(override var context: FREContext?) : FreKotlinController, FreKotlinActivityResultCallback { + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { if (requestCode == RC_SIGN_IN) { val task = GoogleSignIn.getSignedInAccountFromIntent(data) val completedTask = task ?: return try { val account = completedTask.getResult(ApiException::class.java) ?: return - dispatchEvent(GoogleSignInEvent.SIGN_IN, - Gson().toJson(GoogleSignInEvent( - mapOf("idToken" to account.idToken)) - ) - ) + dispatchEvent(GoogleSignInEvent.SIGN_IN, Gson().toJson(GoogleSignInEvent(mapOf( + "id" to account.id, + "idToken" to account.idToken, + "serverAuthCode" to account.serverAuthCode, + "email" to account.email, + "photoUrl" to account.photoUrl, + "displayName" to account.displayName, + "familyName" to account.familyName, + "givenName" to account.givenName, + "grantedScopes" to account.grantedScopes.toList().map { scope -> scope.scopeUri } + )))) } catch (e: ApiException) { - dispatchEvent(GoogleSignInEvent.ERROR, - Gson().toJson(GoogleSignInEvent( - mapOf("text" to e.localizedMessage, - "id" to e.statusCode)) - ) - ) + dispatchEvent(GoogleSignInEvent.ERROR, Gson().toJson(GoogleSignInEvent(mapOf( + "id" to e.statusCode, + "text" to e.localizedMessage + )))) } } } diff --git a/native_library/android/FirebaseANE/GoogleSignIn/src/main/java/com/tuarua/google/googlesignin/extensions/FreGoogleSignInOptions.kt b/native_library/android/FirebaseANE/GoogleSignIn/src/main/java/com/tuarua/google/googlesignin/extensions/FreGoogleSignInOptions.kt new file mode 100644 index 00000000..3d0b421f --- /dev/null +++ b/native_library/android/FirebaseANE/GoogleSignIn/src/main/java/com/tuarua/google/googlesignin/extensions/FreGoogleSignInOptions.kt @@ -0,0 +1,48 @@ +/* + * Copyright 2021 Tua Rua Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.tuarua.google.googlesignin.extensions + +import com.adobe.fre.FREArray +import com.adobe.fre.FREObject +import com.google.android.gms.auth.api.signin.GoogleSignInOptions +import com.google.android.gms.common.api.Scope +import com.tuarua.frekotlin.Boolean +import com.tuarua.frekotlin.String +import com.tuarua.frekotlin.get +import com.tuarua.frekotlin.iterator + +fun GoogleSignInOptions(freObject: FREObject?, defaultClientId: String?): GoogleSignInOptions { + if (freObject == null) { + return GoogleSignInOptions + .Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) + .requestServerAuthCode(defaultClientId!!) + .requestEmail() + .build() + } + val builder = GoogleSignInOptions.Builder() + val scopes = freObject["scopes"] as FREArray + for (scope in scopes) { + builder.requestScopes(Scope(String(scope))) + } + val serverClientId = String(freObject["serverClientId"]) + if (Boolean(freObject["requestIdToken"]) == true) { + builder.requestIdToken(serverClientId ?: defaultClientId!!) + } + if (Boolean(freObject["requestServerAuthCode"]) == true) { + builder.requestServerAuthCode(serverClientId ?: defaultClientId!!) + } + return builder.build() +} \ No newline at end of file diff --git a/native_library/apple/FirebaseANE/GoogleSignInANE/SwiftController+GIDSignInDelegate.swift b/native_library/apple/FirebaseANE/GoogleSignInANE/SwiftController+GIDSignInDelegate.swift index 81c577f5..993f929b 100644 --- a/native_library/apple/FirebaseANE/GoogleSignInANE/SwiftController+GIDSignInDelegate.swift +++ b/native_library/apple/FirebaseANE/GoogleSignInANE/SwiftController+GIDSignInDelegate.swift @@ -22,17 +22,29 @@ extension SwiftController: GIDSignInDelegate { public func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!) { if let err = error as NSError? { - self.dispatchEvent(name: GoogleSignInEvent.ERROR, - value: GoogleSignInEvent(data: ["text": err.localizedDescription, - "id": err.code]).toJSONString()) + dispatchEvent(name: GoogleSignInEvent.ERROR, value: GoogleSignInEvent(data: [ + "text": err.localizedDescription, + "id": err.code + ]).toJSONString()) } else { - guard let authentication = user.authentication else { return } - self.dispatchEvent(name: GoogleSignInEvent.SIGN_IN, - value: GoogleSignInEvent(data: ["idToken": authentication.idToken ?? "", - "accessToken": authentication.accessToken - ?? ""]).toJSONString()) + let authentication = user.authentication + let profile = user.profile + let photoUrl = profile?.hasImage ?? false + ? profile!.imageURL(withDimension: 512).absoluteString + : nil + dispatchEvent(name: GoogleSignInEvent.SIGN_IN, value: GoogleSignInEvent(data: [ + "id": user.userID as Any, + "grantedScopes": user.grantedScopes as Any, + "serverAuthCode": user.serverAuthCode as Any, + "idToken": authentication?.idToken as Any, + "accessToken": authentication?.accessToken as Any, + "email": profile?.email as Any, + "displayName": profile?.name as Any, + "familyName": profile?.familyName as Any, + "givenName": profile?.givenName as Any, + "photoUrl": photoUrl as Any + ]).toJSONString()) } - } public func sign(_ signIn: GIDSignIn!, didDisconnectWith user: GIDGoogleUser!, withError error: Error!) { diff --git a/native_library/apple/FirebaseANE/GoogleSignInANE/SwiftController.swift b/native_library/apple/FirebaseANE/GoogleSignInANE/SwiftController.swift index 9726dcb8..036d2930 100644 --- a/native_library/apple/FirebaseANE/GoogleSignInANE/SwiftController.swift +++ b/native_library/apple/FirebaseANE/GoogleSignInANE/SwiftController.swift @@ -30,6 +30,14 @@ public class SwiftController: NSObject { } func initController(ctx: FREContext, argc: FREArgc, argv: FREArgv) -> FREObject? { + if hasFirebaseApp, let options = argv[0] { + if let serverClientId = String(options["serverClientId"]) { + GIDSignIn.sharedInstance().serverClientID = serverClientId + } + if let scopes = [String](options["scopes"]) { + GIDSignIn.sharedInstance().scopes = scopes + } + } return hasFirebaseApp.toFREObject() } From ea4fa29e3770c869be895438e176a259067a48b6 Mon Sep 17 00:00:00 2001 From: mrchnk Date: Tue, 27 Apr 2021 12:37:25 +0300 Subject: [PATCH 2/6] [Auth] Add support of Google Play Games sign in on Android --- .../firebase/auth/PlayGamesAuthCredential.as | 23 +++++++++++++++++++ .../src/com/tuarua/firebase/auth/Provider.as | 1 + .../auth/extensions/FreAuthCredential.kt | 1 + 3 files changed, 25 insertions(+) create mode 100644 native_extension/AuthANE/src/com/tuarua/firebase/auth/PlayGamesAuthCredential.as diff --git a/native_extension/AuthANE/src/com/tuarua/firebase/auth/PlayGamesAuthCredential.as b/native_extension/AuthANE/src/com/tuarua/firebase/auth/PlayGamesAuthCredential.as new file mode 100644 index 00000000..6c2bb214 --- /dev/null +++ b/native_extension/AuthANE/src/com/tuarua/firebase/auth/PlayGamesAuthCredential.as @@ -0,0 +1,23 @@ +/* + * Copyright 2021 Tua Rua Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.tuarua.firebase.auth { +public class PlayGamesAuthCredential extends AuthCredential { + public function PlayGamesAuthCredential(serverAuthCode:String) { + super(Provider.PLAY_GAMES, serverAuthCode); + } +} +} diff --git a/native_extension/AuthANE/src/com/tuarua/firebase/auth/Provider.as b/native_extension/AuthANE/src/com/tuarua/firebase/auth/Provider.as index f67c84c2..3c95696c 100644 --- a/native_extension/AuthANE/src/com/tuarua/firebase/auth/Provider.as +++ b/native_extension/AuthANE/src/com/tuarua/firebase/auth/Provider.as @@ -6,5 +6,6 @@ public final class Provider { public static const GITHUB:String = "github.com"; public static const EMAIL:String = "password"; public static const PHONE:String = "phone"; + public static const PLAY_GAMES:String = "playgames.google.com"; } } diff --git a/native_library/android/FirebaseANE/Auth/src/main/java/com/tuarua/firebase/auth/extensions/FreAuthCredential.kt b/native_library/android/FirebaseANE/Auth/src/main/java/com/tuarua/firebase/auth/extensions/FreAuthCredential.kt index 82951610..08d9aa99 100644 --- a/native_library/android/FirebaseANE/Auth/src/main/java/com/tuarua/firebase/auth/extensions/FreAuthCredential.kt +++ b/native_library/android/FirebaseANE/Auth/src/main/java/com/tuarua/firebase/auth/extensions/FreAuthCredential.kt @@ -47,6 +47,7 @@ fun AuthCredential(freObject: FREObject?): AuthCredential? { return PhoneAuthProvider.getCredential(param0, param1) } } + PlayGamesAuthProvider.PROVIDER_ID -> return PlayGamesAuthProvider.getCredential(param0) else -> { val builder = OAuthProvider.newCredentialBuilder(param0) return builder.build() From 9d17e51dfb5f6e6e9bb7c474351acc76c4335c0f Mon Sep 17 00:00:00 2001 From: mrchnk Date: Wed, 5 May 2021 02:13:55 +0300 Subject: [PATCH 3/6] [GoogleSignIn] fix mismatched requests (idToken, serverAuthToken) on different methods --- .../src/com/tuarua/google/signin/GoogleSignInOptions.as | 4 ++-- .../google/googlesignin/extensions/FreGoogleSignInOptions.kt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/native_extension/GoogleSignInANE/src/com/tuarua/google/signin/GoogleSignInOptions.as b/native_extension/GoogleSignInANE/src/com/tuarua/google/signin/GoogleSignInOptions.as index 7fbce350..647171aa 100644 --- a/native_extension/GoogleSignInANE/src/com/tuarua/google/signin/GoogleSignInOptions.as +++ b/native_extension/GoogleSignInANE/src/com/tuarua/google/signin/GoogleSignInOptions.as @@ -26,7 +26,7 @@ public class GoogleSignInOptions { */ public static function get DEFAULT_SIGN_IN():GoogleSignInOptions { var options:GoogleSignInOptions = new GoogleSignInOptions(new ['openid', 'profile']); - options.requestServerAuthCode = true; + options.requestIdToken = true; return options; } @@ -35,7 +35,7 @@ public class GoogleSignInOptions { */ public static function get DEFAULT_GAMES_SIGN_IN():GoogleSignInOptions { var options:GoogleSignInOptions = new GoogleSignInOptions(new ['https://www.googleapis.com/auth/games_lite']); - options.requestIdToken = true; + options.requestServerAuthCode = true; return options; } diff --git a/native_library/android/FirebaseANE/GoogleSignIn/src/main/java/com/tuarua/google/googlesignin/extensions/FreGoogleSignInOptions.kt b/native_library/android/FirebaseANE/GoogleSignIn/src/main/java/com/tuarua/google/googlesignin/extensions/FreGoogleSignInOptions.kt index 3d0b421f..c437a549 100644 --- a/native_library/android/FirebaseANE/GoogleSignIn/src/main/java/com/tuarua/google/googlesignin/extensions/FreGoogleSignInOptions.kt +++ b/native_library/android/FirebaseANE/GoogleSignIn/src/main/java/com/tuarua/google/googlesignin/extensions/FreGoogleSignInOptions.kt @@ -28,7 +28,7 @@ fun GoogleSignInOptions(freObject: FREObject?, defaultClientId: String?): Google if (freObject == null) { return GoogleSignInOptions .Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) - .requestServerAuthCode(defaultClientId!!) + .requestIdToken(defaultClientId!!) .requestEmail() .build() } From fb7b34108d9530c55e8a9be104a4a377538a3b14 Mon Sep 17 00:00:00 2001 From: mrchnk Date: Wed, 5 May 2021 03:02:36 +0300 Subject: [PATCH 4/6] [GoogleSignIn] pass proper packageName to retrieve default_web_client_id value --- .../java/com/tuarua/google/googlesignin/KotlinController.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/native_library/android/FirebaseANE/GoogleSignIn/src/main/java/com/tuarua/google/googlesignin/KotlinController.kt b/native_library/android/FirebaseANE/GoogleSignIn/src/main/java/com/tuarua/google/googlesignin/KotlinController.kt index c41fecc8..667e6db3 100644 --- a/native_library/android/FirebaseANE/GoogleSignIn/src/main/java/com/tuarua/google/googlesignin/KotlinController.kt +++ b/native_library/android/FirebaseANE/GoogleSignIn/src/main/java/com/tuarua/google/googlesignin/KotlinController.kt @@ -41,7 +41,7 @@ class KotlinController : FreKotlinMainController { val resources = context.activity?.resources ?: return FreException("no resources").getError() val activity = context.activity ?: return FreException("no application context").getError() try { - val id = resources.getIdentifier("default_web_client_id", "string", null) + val id = resources.getIdentifier("default_web_client_id", "string", activity.packageName) val defaultClientId = if (id != 0) resources.getString(id) else null val gso = GoogleSignInOptions(argv[0], defaultClientId) googleSignInClient = GoogleSignIn.getClient(activity, gso) From 2dd635c5186e423aa09b313eb91e8e331426b0b6 Mon Sep 17 00:00:00 2001 From: Eoin Landy Date: Sun, 9 May 2021 18:08:00 +0100 Subject: [PATCH 5/6] 0.19.0 --- CHANGELOG.md | 3 + example/air_package.json | 26 +-- example/src/Main-app.xml | 2 +- example/src/views/examples/AuthExample.as | 4 + example_vision/air_package.json | 18 +- example_vision/src/Main-app.xml | 2 +- .../AnalyticsANE/ane/air_package.json | 2 +- .../AnalyticsANE/ane/extension_multi.xml | 2 +- .../AnalyticsANE/bin/AnalyticsANE.swc | Bin 7205 -> 7205 bytes native_extension/AuthANE/ane/air_package.json | 2 +- .../AuthANE/ane/extension_multi.xml | 2 +- native_extension/AuthANE/bin/AuthANE.swc | Bin 16166 -> 16682 bytes .../AuthANE/src/com/tuarua/firebase/Auth.as | 16 ++ .../src/com/tuarua/firebase/AuthANEContext.as | 16 ++ .../tuarua/firebase/auth/AuthCredential.as | 16 ++ .../src/com/tuarua/firebase/auth/AuthError.as | 16 ++ .../com/tuarua/firebase/auth/AuthErrorCode.as | 16 ++ .../firebase/auth/EmailAuthCredential.as | 16 ++ .../firebase/auth/FacebookAuthCredential.as | 16 ++ .../com/tuarua/firebase/auth/FirebaseUser.as | 16 ++ .../firebase/auth/GithubAuthCredential.as | 16 ++ .../firebase/auth/GoogleAuthCredential.as | 16 ++ .../firebase/auth/PhoneAuthCredential.as | 16 ++ .../src/com/tuarua/firebase/auth/Provider.as | 16 ++ .../firebase/auth/TwitterAuthCredential.as | 16 ++ .../CrashlyticsANE/ane/air_package.json | 2 +- .../CrashlyticsANE/ane/extension_multi.xml | 2 +- .../CrashlyticsANE/bin/CrashlyticsANE.swc | Bin 3899 -> 3899 bytes .../DynamicLinksANE/ane/air_package.json | 2 +- .../DynamicLinksANE/ane/extension_multi.xml | 2 +- .../DynamicLinksANE/bin/DynamicLinksANE.swc | Bin 10273 -> 10273 bytes .../FirestoreANE/ane/air_package.json | 2 +- .../FirestoreANE/ane/extension_multi.xml | 2 +- .../FirestoreANE/bin/FirestoreANE.swc | Bin 19832 -> 19832 bytes .../GoogleSignInANE/ane/air_package.json | 2 +- .../GoogleSignInANE/ane/extension_multi.xml | 2 +- .../GoogleSignInANE/bin/GoogleSignInANE.swc | Bin 12214 -> 15134 bytes .../tuarua/firebase/auth/AuthCredential.as | 16 ++ .../firebase/auth/GoogleAuthCredential.as | 16 ++ .../firebase/auth/PlayGamesAuthCredential.as | 2 +- .../tuarua/google/GoogleSignInANEContext.as | 27 +-- .../google/signin/GoogleSignInAccount.as | 159 ++---------------- .../google/signin/GoogleSignInOptions.as | 103 ++++-------- .../google/signin/events/GoogleSignInEvent.as | 20 +-- .../MessagingANE/ane/air_package.json | 2 +- .../MessagingANE/ane/extension_multi.xml | 2 +- .../MessagingANE/bin/MessagingANE.swc | Bin 6660 -> 6660 bytes .../ModelInterpreterANE/ane/air_package.json | 2 +- .../ane/extension_multi.xml | 2 +- .../bin/ModelInterpreterANE.swc | Bin 11680 -> 11680 bytes .../OneSignalANE/ane/air_package.json | 2 +- .../OneSignalANE/ane/extension_multi.xml | 2 +- .../OneSignalANE/bin/OneSignalANE.swc | Bin 17842 -> 17842 bytes .../PerformanceANE/ane/air_package.json | 2 +- .../PerformanceANE/ane/extension_multi.xml | 2 +- .../PerformanceANE/bin/PerformanceANE.swc | Bin 4343 -> 4343 bytes .../RemoteConfigANE/ane/air_package.json | 2 +- .../RemoteConfigANE/ane/extension_multi.xml | 2 +- .../RemoteConfigANE/bin/RemoteConfigANE.swc | Bin 7974 -> 7974 bytes .../StorageANE/ane/air_package.json | 2 +- .../StorageANE/ane/extension_multi.xml | 2 +- .../StorageANE/bin/StorageANE.swc | Bin 17498 -> 17498 bytes .../VisionANE/ane/air_package.json | 4 +- .../VisionANE/ane/extension_multi.xml | 2 +- native_extension/VisionANE/bin/VisionANE.swc | Bin 26529 -> 26529 bytes .../ane/extension_multi.xml | 2 +- .../bin/VisionCloudDocumentANE.swc | Bin 11843 -> 11843 bytes .../ane/extension_multi.xml | 2 +- .../bin/VisionCloudLabelANE.swc | Bin 5512 -> 5512 bytes .../ane/extension_multi.xml | 2 +- .../bin/VisionCloudTextANE.swc | Bin 8543 -> 8543 bytes .../VisionLandmarkANE/ane/extension_multi.xml | 2 +- .../bin/VisionLandmarkANE.swc | Bin 5180 -> 5180 bytes native_extension/ane/air_package.json | 2 +- native_extension/ane/extension_multi.xml | 2 +- native_extension/bin/ANEUtils.swc | Bin 6407 -> 6407 bytes native_extension/bin/FirebaseANE.swc | Bin 89279 -> 89805 bytes .../Analytics/FirebaseANE.Analytics.iml | 2 +- .../.idea/modules/Auth/FirebaseANE.Auth.iml | 2 +- .../Crashlytics/FirebaseANE.Crashlytics.iml | 2 +- .../DynamicLinks/FirebaseANE.DynamicLinks.iml | 2 +- .../modules/Firebase/FirebaseANE.Firebase.iml | 2 +- .../Firestore/FirebaseANE.Firestore.iml | 2 +- .../GoogleSignIn/FirebaseANE.GoogleSignIn.iml | 2 +- .../Messaging/FirebaseANE.Messaging.iml | 2 +- .../FirebaseANE.Modelinterpreter.iml | 2 +- .../OneSignal/FirebaseANE.OneSignal.iml | 30 ++-- .../Performance/FirebaseANE.Performance.iml | 2 +- .../RemoteConfig/FirebaseANE.RemoteConfig.iml | 2 +- .../modules/Storage/FirebaseANE.Storage.iml | 2 +- .../modules/Vision/FirebaseANE.Vision.iml | 2 +- .../FirebaseANE.VisionCloudDocument.iml | 2 +- .../FirebaseANE.VisionCloudLabel.iml | 2 +- .../FirebaseANE.VisionCloudText.iml | 2 +- .../FirebaseANE.VisionLandmark.iml | 2 +- .../tuarua/firebase/auth/AuthController.kt | 2 +- .../auth/extensions/FreAdditionalUserInfo.kt | 2 +- .../firebase/auth/extensions/FreAuthResult.kt | 3 +- .../extensions/FreFirebaseAuthException.kt | 4 +- .../auth/extensions/FreFirebaseUser.kt | 2 +- .../firebase/firestore/FirestoreController.kt | 2 +- .../firestore/extensions/FreDocumentChange.kt | 10 +- .../FreFirebaseFirestoreException.kt | 6 +- .../extensions/FreQueryDocumentSnapshot.kt | 12 +- .../google/googlesignin/KotlinController.kt | 8 +- .../google/googlesignin/ResultListener.kt | 15 +- .../extensions/FreGoogleSignInAccount.kt | 33 ++++ .../extensions/FreGoogleSignInOptions.kt | 8 +- .../firebase/storage/StorageController.kt | 2 +- .../storage/extensions/FreStorageException.kt | 4 +- .../storage/extensions/FreStorageMetadata.kt | 30 ++-- .../FirebaseANE.xcodeproj/project.pbxproj | 6 +- .../xcschemes/OneSignalANE_LIB.xcscheme | 2 +- .../FirestoreANE/SwiftController.swift | 4 +- .../Extensions/FreGIDGoogleUser.swift | 37 ++++ .../SwiftController+GIDSignInDelegate.swift | 19 +-- 116 files changed, 528 insertions(+), 419 deletions(-) create mode 100644 native_library/android/FirebaseANE/GoogleSignIn/src/main/java/com/tuarua/google/googlesignin/extensions/FreGoogleSignInAccount.kt create mode 100644 native_library/apple/FirebaseANE/GoogleSignInANE/Extensions/FreGIDGoogleUser.swift diff --git a/CHANGELOG.md b/CHANGELOG.md index 03ce2ce5..3e6e6315 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +### 0.19.0 +- [Auth] Add support of Google Play Games on Android + ### 0.18.0 - [Auth] Fix verificationId was not returned on verifyPhoneNumber diff --git a/example/air_package.json b/example/air_package.json index 31d4f1c2..897000a9 100644 --- a/example/air_package.json +++ b/example/air_package.json @@ -1,6 +1,6 @@ { "name": "firebase-sample", - "version": "0.18.0", + "version": "0.19.0", "appDescriptor": "src/Main-app.xml", "variables": { "firebase_associated_domain": "xxxx.app.goo.gl", @@ -15,17 +15,17 @@ "url": "https://tuarua.github.io/air/air_packages.json" }, "dependencies": { - "com.tuarua.firebase.FirebaseANE": "0.18.0", - "com.tuarua.firebase.AnalyticsANE": "0.18.0", - "com.tuarua.firebase.AuthANE": "0.18.0", - "com.tuarua.firebase.DynamicLinksANE": "0.18.0", - "com.tuarua.firebase.FirestoreANE": "0.18.0", - "com.tuarua.firebase.MessagingANE": "0.18.0", - "com.tuarua.firebase.PerformanceANE": "0.18.0", - "com.tuarua.firebase.RemoteConfigANE": "0.18.0", - "com.tuarua.firebase.StorageANE": "0.18.0", - "com.tuarua.firebase.CrashlyticsANE": "0.18.0", - "com.tuarua.google.GoogleSignInANE": "0.18.0", - "com.tuarua.OneSignalANE": "0.18.0" + "com.tuarua.firebase.FirebaseANE": "0.19.0", + "com.tuarua.firebase.AnalyticsANE": "0.19.0", + "com.tuarua.firebase.AuthANE": "0.19.0", + "com.tuarua.firebase.DynamicLinksANE": "0.19.0", + "com.tuarua.firebase.FirestoreANE": "0.19.0", + "com.tuarua.firebase.MessagingANE": "0.19.0", + "com.tuarua.firebase.PerformanceANE": "0.19.0", + "com.tuarua.firebase.RemoteConfigANE": "0.19.0", + "com.tuarua.firebase.StorageANE": "0.19.0", + "com.tuarua.firebase.CrashlyticsANE": "0.19.0", + "com.tuarua.google.GoogleSignInANE": "0.19.0", + "com.tuarua.OneSignalANE": "0.19.0" } } diff --git a/example/src/Main-app.xml b/example/src/Main-app.xml index 28aca068..b65bc415 100755 --- a/example/src/Main-app.xml +++ b/example/src/Main-app.xml @@ -3,7 +3,7 @@ com.tuarua.firebaseane.example FireBaseExample FIR-Example - 0.18.0 + 0.19.0 [This value will be overwritten by Flash Builder in the output app.xml] diff --git a/example/src/views/examples/AuthExample.as b/example/src/views/examples/AuthExample.as index 6daaae5f..1eafaf8e 100644 --- a/example/src/views/examples/AuthExample.as +++ b/example/src/views/examples/AuthExample.as @@ -7,6 +7,7 @@ import com.tuarua.firebase.auth.EmailAuthCredential; import com.tuarua.firebase.auth.FirebaseUser; import com.tuarua.firebase.auth.GoogleAuthCredential; import com.tuarua.google.GoogleSignIn; +import com.tuarua.google.signin.GoogleSignInAccount; import com.tuarua.google.signin.events.GoogleSignInEvent; import starling.display.Sprite; @@ -128,6 +129,9 @@ public class AuthExample extends Sprite implements IExample { statusLabel.text = "Google Sign In error: " + event.error.errorID + " : " + event.error.message; return; } + var account:GoogleSignInAccount = event.account; + trace("Google Account accessToken:", account.accessToken); + trace("Google Account displayName:", account.displayName); auth.signInWithCredential(event.credential, onSignedIn); } diff --git a/example_vision/air_package.json b/example_vision/air_package.json index 2167c6b6..2461b2f6 100644 --- a/example_vision/air_package.json +++ b/example_vision/air_package.json @@ -1,6 +1,6 @@ { "name": "firebase-sample", - "version": "0.18.0", + "version": "0.19.0", "appDescriptor": "src/Main-app.xml", "variables": {}, "airDotPrefix": true, @@ -9,13 +9,13 @@ "url": "https://tuarua.github.io/air/air_packages.json" }, "dependencies": { - "com.tuarua.firebase.FirebaseANE": "0.18.0", - "com.tuarua.firebase.AnalyticsANE": "0.18.0", - "com.tuarua.firebase.VisionANE": "0.18.0", - "com.tuarua.firebase.VisionCloudTextANE": "0.18.0", - "com.tuarua.firebase.VisionCloudDocumentANE": "0.18.0", - "com.tuarua.firebase.VisionCloudLabelANE": "0.18.0", - "com.tuarua.firebase.VisionLandmarkANE": "0.18.0", - "com.tuarua.firebase.ModelInterpreterANE": "0.18.0" + "com.tuarua.firebase.FirebaseANE": "0.19.0", + "com.tuarua.firebase.AnalyticsANE": "0.19.0", + "com.tuarua.firebase.VisionANE": "0.19.0", + "com.tuarua.firebase.VisionCloudTextANE": "0.19.0", + "com.tuarua.firebase.VisionCloudDocumentANE": "0.19.0", + "com.tuarua.firebase.VisionCloudLabelANE": "0.19.0", + "com.tuarua.firebase.VisionLandmarkANE": "0.19.0", + "com.tuarua.firebase.ModelInterpreterANE": "0.19.0" } } diff --git a/example_vision/src/Main-app.xml b/example_vision/src/Main-app.xml index 4fc7f7e5..6982aa21 100644 --- a/example_vision/src/Main-app.xml +++ b/example_vision/src/Main-app.xml @@ -3,7 +3,7 @@ com.tuarua.firebaseane.example FireBaseExample FIR-Example - 0.18.0 + 0.19.0 [This value will be overwritten by Flash Builder in the output app.xml] diff --git a/native_extension/AnalyticsANE/ane/air_package.json b/native_extension/AnalyticsANE/ane/air_package.json index 8e6cd113..49c3085c 100644 --- a/native_extension/AnalyticsANE/ane/air_package.json +++ b/native_extension/AnalyticsANE/ane/air_package.json @@ -1,6 +1,6 @@ { "name": "com.tuarua.firebase.AnalyticsANE", - "version": "0.18.0", + "version": "0.19.0", "repository": { "url": "https://tuarua.github.io/air/air_packages.json" }, diff --git a/native_extension/AnalyticsANE/ane/extension_multi.xml b/native_extension/AnalyticsANE/ane/extension_multi.xml index 901ddc31..111f74b2 100644 --- a/native_extension/AnalyticsANE/ane/extension_multi.xml +++ b/native_extension/AnalyticsANE/ane/extension_multi.xml @@ -3,7 +3,7 @@ com.tuarua.firebase.AnalyticsANE Firebase Analytics ANE This work is licensed under Apache License, Copyright (c) 2018 Tua Rua Ltd. - 0.18.0 + 0.19.0 diff --git a/native_extension/AnalyticsANE/bin/AnalyticsANE.swc b/native_extension/AnalyticsANE/bin/AnalyticsANE.swc index e0f38c185490af7a37efe8f895888b7b0d0529c4..6057a66e3f35ce8f96791ca40a11057ae714ff3f 100644 GIT binary patch delta 47 wcmZ2#vDAV$z?+#xgn@&DgTb(8com.tuarua.firebase.AuthANE Firebase Auth ANE This work is licensed under Apache License, Copyright (c) 2018 Tua Rua Ltd. - 0.18.0 + 0.19.0 diff --git a/native_extension/AuthANE/bin/AuthANE.swc b/native_extension/AuthANE/bin/AuthANE.swc index 77e7988eaac2671343dd191ab81f30612f012479..a8785a52992554703dcda79837e1788d633f0e63 100644 GIT binary patch delta 9205 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

y2 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.tuarua.firebase.CrashlyticsANE Firebase Crashlytics ANE This work is licensed under Apache License, Copyright (c) 2018 Tua Rua Ltd. - 0.18.0 + 0.19.0 diff --git a/native_extension/CrashlyticsANE/bin/CrashlyticsANE.swc b/native_extension/CrashlyticsANE/bin/CrashlyticsANE.swc index 3494724fb6e3b5197350e41a39b42c355ec8cdc3..70d5a5e4e689881b712bc161be7031210361bf73 100644 GIT binary patch delta 47 wcmdljw_A=kz?+#xgn@&DgTbI@|qA03-$t{r~^~ delta 47 wcmdljw_A=kz?+#xgn@&DgF$i8#ErZX9Lzv^vj)d>HV|X-AwDxO{hQAL03SdNx&QzG diff --git a/native_extension/DynamicLinksANE/ane/air_package.json b/native_extension/DynamicLinksANE/ane/air_package.json index 168b7e34..2ee8d0ea 100644 --- a/native_extension/DynamicLinksANE/ane/air_package.json +++ b/native_extension/DynamicLinksANE/ane/air_package.json @@ -1,6 +1,6 @@ { "name": "com.tuarua.firebase.DynamicLinksANE", - "version": "0.18.0", + "version": "0.19.0", "repository": { "url": "https://tuarua.github.io/air/air_packages.json" }, diff --git a/native_extension/DynamicLinksANE/ane/extension_multi.xml b/native_extension/DynamicLinksANE/ane/extension_multi.xml index 9f0e91d7..79262b9b 100644 --- a/native_extension/DynamicLinksANE/ane/extension_multi.xml +++ b/native_extension/DynamicLinksANE/ane/extension_multi.xml @@ -3,7 +3,7 @@ com.tuarua.firebase.DynamicLinksANE Firebase Dynamic Links ANE This work is licensed under Apache License, Copyright (c) 2017 Tua Rua Ltd. - 0.18.0 + 0.19.0 diff --git a/native_extension/DynamicLinksANE/bin/DynamicLinksANE.swc b/native_extension/DynamicLinksANE/bin/DynamicLinksANE.swc index 47abda341bcb3eaf80dfab1c719fba7f28becde9..94bfcefb2ea23670b0d388c8e9e7b5c76089e98e 100644 GIT binary patch delta 47 wcmZ1&urPo(z?+#xgn@&DgF(M%F@>g}ND-eyHvM04viD5C8xG diff --git a/native_extension/FirestoreANE/ane/air_package.json b/native_extension/FirestoreANE/ane/air_package.json index 33174a72..061d3f52 100644 --- a/native_extension/FirestoreANE/ane/air_package.json +++ b/native_extension/FirestoreANE/ane/air_package.json @@ -1,6 +1,6 @@ { "name": "com.tuarua.firebase.FirestoreANE", - "version": "0.18.0", + "version": "0.19.0", "repository": { "url": "https://tuarua.github.io/air/air_packages.json" }, diff --git a/native_extension/FirestoreANE/ane/extension_multi.xml b/native_extension/FirestoreANE/ane/extension_multi.xml index 3d1c66b5..be09321b 100644 --- a/native_extension/FirestoreANE/ane/extension_multi.xml +++ b/native_extension/FirestoreANE/ane/extension_multi.xml @@ -3,7 +3,7 @@ com.tuarua.firebase.FirestoreANE Firebase Firestore ANE This work is licensed under Apache License, Copyright (c) 2017 Tua Rua Ltd. - 0.18.0 + 0.19.0 diff --git a/native_extension/FirestoreANE/bin/FirestoreANE.swc b/native_extension/FirestoreANE/bin/FirestoreANE.swc index 6b28431731ecc62649f6d8c69d935604231fbf56..0bbb5977fb71edde369c7cf2757f4bb8b66dc1de 100644 GIT binary patch delta 49 ycmew{i}A-SM&1B#W)=|!4h{|m{hpN@dEHc)f%N7um1P2JrF7Y delta 49 ycmew{i}A-SM&1B#W)=|!4h{|mg+&uL^17)o1L@6SD$6uLjLH9f%)qpTuLA&icMs+O diff --git a/native_extension/GoogleSignInANE/ane/air_package.json b/native_extension/GoogleSignInANE/ane/air_package.json index f5ec7d86..d66f8422 100644 --- a/native_extension/GoogleSignInANE/ane/air_package.json +++ b/native_extension/GoogleSignInANE/ane/air_package.json @@ -1,6 +1,6 @@ { "name": "com.tuarua.google.GoogleSignInANE", - "version": "0.18.0", + "version": "0.19.0", "repository": { "url": "https://tuarua.github.io/air/air_packages.json" }, diff --git a/native_extension/GoogleSignInANE/ane/extension_multi.xml b/native_extension/GoogleSignInANE/ane/extension_multi.xml index 3b6be09e..756f79da 100644 --- a/native_extension/GoogleSignInANE/ane/extension_multi.xml +++ b/native_extension/GoogleSignInANE/ane/extension_multi.xml @@ -3,7 +3,7 @@ com.tuarua.google.GoogleSignInANE Google Sign In ANE This work is licensed under Apache License, Copyright (c) 2018 Tua Rua Ltd. - 0.18.0 + 0.19.0 diff --git a/native_extension/GoogleSignInANE/bin/GoogleSignInANE.swc b/native_extension/GoogleSignInANE/bin/GoogleSignInANE.swc index 99fa0da539357ae358accd0d435088f608a5e1bf..139c3fdee009aeda398b5596fe993848da225926 100644 GIT binary patch delta 9143 zcmZ9SWmFu|vbJ#v?(Xg`gAW#hTOc@tySojpgAN1@?iwJt1-FDifWcjZhTwj4?B4Tz z-D|Ji-EXaDzg1m7tJN&u2TM~05s45E4Gj&B8&Z{uMFlpYE#8pR*P#}YfrImd?+ILT zrC7=_`?Rc1+O+%8N@Jr#pE$uvYuhX>2%lDqLn%Yz^X$%w~55CwQ9!l7iZ)v4UtkABqA zbSWH3e5g?#^z$##rXlY>M%zigZ8C>lw)}KKdvqfiphbj-FUUaARmgZ)}58&+!Lj#Kh9K&3J<1h&{K(ZP?FdolNz>0QETNYU|!+Y4gH@ zi5YC+)Zr0W=CL(p?%}|Xr-G%JtCQSBB*Euf%l2cSc%5i}*!O(hKPdcjQ^1Z^K=5;$ z-U4wX^2Ter3x*l$YXURcB3YPPbEECt4aBa|Msb!SA)&>vh50TLJ^jt36jaisds*oC z@>pEaxebGh`GlCj&b@hF_T7TR2*;NEvj(_2(W7cx^342Mp=#01Wu8Lu8J zu}*iX-01qql*^Uf2&+5h4~hzgiILIDe4V0qjXAMO2EI{Q9aVET$En`2hlLp5uXSOH zr&C(gflPEY=Z`h6&qF^f%~|u4?)=?fM4@0deStKJb`7My_p*Z{bAD8fjiv+ zV@B2H>SY5CXB9TR?z-Y0KxZFbnvX}cqfb*>dw0kg&f3jn$Q$P+#4{L%f~a6HUKXWcKeNLsg{i9JNz>#^ia^e~Xj-zB ztXjpI#oDq}m0HC*+l9r@cvIykT}(|rr7~Qit}4>qp4sUH{5P8aR}7H@zZWNZN%JaL?94 zJc9MGUuDCUM6rAvp=PVs%umK*fPZdDMU{2WgMR$Ild=PJt-xISqBPfuA7`+ov`QY! zSlh4klRRG4a4?na*uiSK^J?fK9deE<*g>7$I6~hH^JBDDpckp5NHv1V@3s;pt~Oev zcIip{NzI5|1vl3h#R>K@6pec^I)9hnuU#7J&WPvyAi|IUt5X{3r0Q^8iwkmEOXM`5 zQK0^yV@IESK1Nzf3j!lHSeB=pLaci%8-GOh_EO;}_hPRP!Hd&ux@|2Zh-wJRpm6_= zx`oHK_wgBNp09qW)LWCp!Xm}pmK69fAimoYDq~|~3?8%4kT43cIhh#G*3H}dLpg%E z_v?cM+oW%{Tpf^-m zlLL6_xq-v-J+mXUftZtC#ZR-6Xg3z)oWF@{qjd!+Cb)^2D>9CRD^maLZDbVUjBy$% zz5?zmuE7opoJ4-Z2$S2={@3VmvMu|o%LqYB%Q=27`_?E`a%6?aZ(DwP#!hBjmpI?^ z9$lP}UeA*dwQAYaUBn|Q@khhY@2&MbB>fm!0zjP?BCh9&93;T4M(Z`lBc3I?!XDP& zY#WM&9Tcmy778d@@F#1!-WZECuDmOdG=>=}IDnUGokV=TD7M5!B$#ifERvg!D{5uB zTYiz@H%htpFd2}bQfjwWVI^^#x3wrani80P^X?}vI~>dhS-Z@0-eF0Q9h0+~Bk+fZ zjhgA#0oE?XI+vd;LFg=oAAUSquB)_X2j{}Rt?|2c`uWaA-`1y8PHVnB^swvByg}&_ zOQ!%Y%iAf>$!93%s8ix`Q_>O(vWv00Yj2lpho;do_2~A>?@3idt~+AO-^NliWyVr7 z1cYn8O%r2b%PzN4EMN+V*Su$DYP(vI?~{|L49xV?ykw9ar(`P7Y*HPUJBrnAk{z#p zVVhZq%a{LUNdl#pUld_)}Lva17|Y0*qmJ*Gxh+IMr@99H zCG&ivE|odQ;HL8*sMo2g~HBU}w(r zDL}3Jpl7HG;|^08gm!l|mp!mo>k4eGYjNj!mba3_`oM5O%jma=deQgpWc*-NK|0qj zI)w-FmF`GEUp$tGVtf)kdEu4ie0^^>loKrmwmZ61C}eW-r5y1UPK89`vkgDpfMTIh z^KiX|Z{Y-z*LuNh9bw?qW01z8UohZxy7!~6p~xwGmxubX-i)Q6$H|$`Ofne0(}VkX z>K@Un1!vlNZ5WO~s_(U7z2|a`Ubb~K$I_^IL;PdR5SJ;rrQc?NI-BW)@kr>)9tkXH z6Pd>Ft$HJIeC8kc4UNUG2pvg9&+8H`#HV3Z00-;%;Or21OG}*F1pUPb8l39ui~B*H zm6!@c6(_$i>{l~$zrG<;Rv4IN`1c2y=21d!(}!)lP(M3tKFuA(6Zz9U`ld_ZM)D$V zM29-&h4^uir0i*8%TIFJGkv3-S&y9S!>0@T)1BE`jitNrPcMBzw`bD<5Ja8?+BdO2 ziiD!wx!YmaC6F;CAi$`}KC_aZXe@dynjt^%AP4pUycd4vA9K0ridIiLQN zmeDtgC*cRIq^%gybtJW46Rk5mkBY9@84||)ET1{g|0EIsU7z;^yN{BU_Sr$M78-uO zGq!g@Omo|1;DSt_<+5CcB|K9G0cC0k?wm@=dTt|}-QxqrF*q3=+htd4pPVcN72(bj z|4t70`328kfMs`21Xl2SyCpWOgIiJfZf~;t=Po*|AWc@?ozURKNoc~+(bzKi^+^2$62z`B0YUJ$RtI=;v;au>*XoBaDd=LI;QRfY#zD=fu zlM0co!l{M2L-3`y`6ogtu3qC0oL-N}hQy1lyT+2Qzh1j1v9})1-Kj>d9gR`lpBLJb zb{-nsysc4T=x47v8#ot_(g(MLPcItx&$NB7__qv|2_7^L%I%Ubea{=Dz1J!}FGA?) zGw$+axP;($q&2|Qkn+QV)_BSkMS06QQyz4}oJ%)K4L zko9`Kwn>{Wrpxu|>@$x~_Eb138D3ImYc+y~g#mzr~q;Btu83J#k^>V8~Yh?>c@_Rb}t&Td`azRljA=obBPd z08t*~tOXy0Z5|0*r0z7&^1Yq$(_>$eWVDF052he)dlRD(cXv`cJ9Yq?ZHh@%8nF?g z1+K^CWkH6;rn2pC(Jza7I0C{EDv%~hBXg&u~sn1c}ujjs=QlilVE7R_-K!(CABhbGgn zbnLUz@WveTSo;>cq#4mNmm)Sl!e^xjGNPtoj7RLs9myQYAITm8J0rcARMX+>uM^Zg zl55WK`*5?(DZ(%DY49qxoV}fTkf-F76p`@hPvI)riU2p%e$+bE={enmboq zL|VK3xh*&9Md0n}{`f;Z6z4_2yQQw$ImcOixW;Easv=96qDP+vS<*7vHgG2(brNo|JfmP5{|sDp%F^OskDumVfQyu_tTa zlfQ4!xkt$;F)qQk!eXR%J#bIop<5%uW{{k8QR)%an<`@Z*`Admy#II+hg^>l=t)Zk9*r$|-ifGVG+C4!HVG zRm|t2dZ=?pA716GH=m&1HqILd3qYFq*}_iE9NpB>eSVai?CXjQvrI2w%m@787EA;e zwR3h*tAeewvdp>SOkJ$@dETb1E^z{75oR;!a!KkeTPLisygV)7oWJbcI$hp1&%6Rt zgj$Dv6FwOH%qc@7f^VT*zSbEF>p_jl4!v5V_~xA3HcC~HJN1!cD09*=BjE*ZFX4|< z2EW~wIqUA(j008>;!A8&LkZZFra>gSm!(OYnf8x2g*5fbam7$4p9`r5?!`5 z7t_wWxv=rL)$WFoyUgIUGk#-A=IsJ2>FA+s{to!_&2YromwKh9Z>DKj2xLEPnt7uj zjZUfogz@bg*NHHYwt@lj!ageA;(2f@_-oNK^}WbEb^ek3UDWXF>$dl&4faL#9|=%4 zC#n9#a7R5vt`oyWoFki(kRU*Lnr=}^2i6V_mfNXOJ#3>bTF&dZ*t?U9&voDR`J zAL*n>R}Hn_`hlg+?Sm0d%O2qCd#>Mv0mgp95)+U9dR1rw7Y640GE$FOhMb~KFUae` zq-yN4*iE>}hn)AJ2Xz!P)d`7tkVP(b+bW;zJ#i6VLRJ**)|=DFM#2Sz5x5v^_!5>i zNQ6^oQ~ttd{PBhaLs;&$q#GL~b+*JqdKIk)&$g6-pOh>f)Aosdf@vT9zK0prg8Tt@ zc7ChcUqy_xD+260MD7=y0`;6oyLy-=7u=PzDHi(@odEAB8d|n^BKoDC7%^seGXndf zO3bCQx2ASLsc}{~mr`-W-2Q=nQ(>)M&hg9QePP1y_=b%SmeD9LNX&r{v|P?wmXFSj zyd<_DFkL%dseRxvW9%?W45S-&vJiVF<3Z=2 zfG7UR9PtC28>oh&pNIFQiH` zE8AyLxmLv#x&%?*1%t#kq>|l=XD;^ygrVQZh&3y;q8F0Uk(SGjygcNATlT{WZEEl* zgkY*Cvs%j80f2ZskwZNBW31`dK1192K)i@9O|ai5G0k)Fte;m_Pd#I1IdP*QH-j|g z7%;esqx48LeoK^01cKHe^QIz&T&_2uTGP;oPmW9G=fyD*4sI$<=jLx!kuIZhky#RX zGt!R-B0uXOhNzGtSdQpCa{*5m^mw-=HeF11Y0kZ&OyiBUi}LR={er2UY?rg2Ti-56 zmw=O6vS3mTlN`Td5^TMvVY};HiB(nU3m;pA^JQ-*MhpW&Qr+{HzW$u}IYJ!s!3c+B zVPW>x;N|LMw~Bd7xdm^3#zM39$OdF#LEo(}GWfl$wF}m!{5u_pKvMt7{L>BLir4WD zTdRCy>%8tNGH9;# z_?OrvbE|IKM|#o%Rds*3$3n^}k*@HNPfGSH^C+YIZ{vlxm&=m~-vI!U8J#jK>DrCA zmnK;YHWrCA;d&>-&WKi{2^i#LqRn^&6+XgN4a2{z^|yXIoy-R-7Jb#X?ud+Si#Gu4 zY({_2^^}&HpR^%uz-rh`Nv~1t=ZwtOpRdg@Q;QS`Ozg=avw76R>60;5ZATN>iNwl} ztJ;#d$Oo-hxlulPyz&iT8a!|LWL{SJ3ge8$)Hxa2Gz=ui4_r7BbZ1^@-V|iV=GmfX z`*;wZO=f@;d97@8?V8bq)CBqf-M(M}acrC#OJZV?KvY?wLE|F3C^%EX!rv5ZqMX#* z^ohS@ohQeOw{DJtCRcQEUEIkenhm!`iCVXuP(u_5FY7LoA;>GD-s-H|TkRawQ`TlbTHq2(?hu|iNw9sJ$-ML}?%NUrhs5XzUl8&%F1;65 z9(-$gtgP(I2P@8F6RddH-IxwCo-#~`#{BMh(G|mTBWZY~Al1nh9t@Hf`MDcFQ#~rh ze0HZ>iNT5j< z;ixu6er2RnVi)4S!L*ELF}>fh4HL5IK%RGner!Q^<{u1ulxqQIU{6K=dpqS@hJ-_j zmG_kIR2CkC`c{Gl|6EW^FAVCLEopT-m-#UTVyQQsv=kWO&|oIio@?X;LmRsT=58xa zgLh72i+_54u|;zE?qx;hOVA#O>mS=C9dLWrOZwPNe)J&l2TU^tX8d53ojvO!B621m zO&fb%^5~=xLU~X480vh7zR?mJyP`&#R9gY+Er7vTH{_$a$s|DgS6Y$Nd(Wcnxka&$ zz*t@evf0;meTTW$qMF*Kg7@oQAGT1jx2mLE4lB`C5g8b6wL6^b$YstJ`d=^T>>Mt) zeM&b5IC?!Zz>j?ln&i3u*K%mfK3E6cOLEJtK`tz(q)E;$we4__fTaFP3Sd4ZBtF&| zo*bFw4wo_mSgiV~ZHsk5iImx!ijuog=eJ{+w#Xb)d8A-OeQ`xe<6XJ3Sw}CzW{(eL z8q=4QmB+6v>5Frvw)WP+3_bjP?HLB@8)liexctL1;N^7B5Hd3jLC>A>Duc~Yo4ohF zo`T<9d6O&$xiN{MxM-*g)=nRX6qw~F}sA{uEw)eL? zaqvXr8w0bguMcS7{fj)*w-%(X8@zFAB)8Rfj~pJ?!Lf;S+2(Bf9XAS` zKm_94iZmIpvEUN;{QbqLtl`%mr;8V(^{8Rhhl@WWdXw`88d7`W0%}I)wy0R&FV9WvYfhn?J3D|U@^kLR18sU5tzs0ve8@^y9udz~IIcio z+K$UE{{-s&*8BW{ee7cVgL2C#vaO>;70q@0kBV}Zi~c!X1S$QOas_JbR0tDp2xYQH zE6VRmJ+1+>N$F2%P$;yS{HoSl`2AsaTs8xSaDuJ6y?0RZ@Wk@wYmD)Cu7pukMCNTU zRA;ZHM->zyxrfU zs(!iTvhzO6HHc$CZi~kAg4c$qU$CtE7gEfe+|=~EX^(H|F?+(!DXgENzZ-Y1THFaW zB0gC>s})X40X+}XMOpn~oLU)o+dT@L2G5SIm5m%AQ%8rcTwW<9cTG6&Iv}6a2d5+i z7oV{u48yHju8O+Z35N}y1uU*v`}q1xtBcKZJVNDlP;Xd<)!$Pr7a)~q#`Mv1lPteM zNa(k2>>!LA-fi+*#V%DZ4whD=s9VhNNO4pJ|@@#@%0qJy!;&$w}<{f!{}IC7x;B1$jd z^ELyD&M+I8UaAs2FS2T#YLX`I>>h_isz_md&Z&jdWYQr{VoaIbDH zbEO=a@PSGg9z-^5n9C-k@ZXce*u00badgKC8N6>!rkNQmcG;|| zFTgv>)PL0DJ%{H7*gx#=0L|Z^AIE)gKSzMD<{*s7-|(z>s&j~hK`r21oInX`O!GDw@`OIw-b zH;ufUbn|MOAh4MXrE$}zbT2IgJ^#2gsSz#^u7%V%0eGF+MS_Pg31AqZMEB1Qp8RM3 zg0>@Ek|KVAZYYQm2ZO3ZA*&&XOlnAxghk&}*z5B=x8q&62(k3twBC=thyEr*slVF> z{{47P?nP3s9w)lmzRiJFfvVpoZ)|FOp@4)d&3Vy3Cg-*xcDM>G>rGn9Iz#fhTp3+Q zt!|Hrdo^A_Cy&7y9RM+)x#U7$}&Ey7@Ol@V`_( z0YMQyAyL3z0t>W|`2gC>h4FVsfpW2|I?vp+GKX=vO8bXd+9*zl;hA z^N9fdVU+c6JVCP_t2jJ{hqV|`UE#f#y^|-jh>`ihcI=fm)()0bJ5`TRI_yvXjk=s9<{hy=%KFv79%wp(8Jc-+4`?JY!;4x^HiWIR9MhaMp38= zCkC{N5wBU3!wddDl@}2d78U$o;xp$ml!J~K`i_hGZ`wl8PBu1Z3LEx+{j^dxh5xPU ze{%T0s$xPJxP4>gM;h&yEIkc5eVV_ccMo7{~8sl y#KR%?cgRNjzr!)${`<=P+s&3BFOZX~Ew`VulcowX%0Fa;zqiNV{iE1F-u?&c^+%Tg delta 7355 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 Y{r^eFNBf^6Mh|_EVtfG*{NKm_1(K9BW&i*H diff --git a/native_extension/GoogleSignInANE/src/com/tuarua/firebase/auth/AuthCredential.as b/native_extension/GoogleSignInANE/src/com/tuarua/firebase/auth/AuthCredential.as index e894329d..7e16626f 100755 --- a/native_extension/GoogleSignInANE/src/com/tuarua/firebase/auth/AuthCredential.as +++ b/native_extension/GoogleSignInANE/src/com/tuarua/firebase/auth/AuthCredential.as @@ -1,3 +1,19 @@ +/* + * Copyright 2021 Tua Rua Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.tuarua.firebase.auth { public class AuthCredential { private var _provider:String; diff --git a/native_extension/GoogleSignInANE/src/com/tuarua/firebase/auth/GoogleAuthCredential.as b/native_extension/GoogleSignInANE/src/com/tuarua/firebase/auth/GoogleAuthCredential.as index 53589776..47e69df6 100644 --- a/native_extension/GoogleSignInANE/src/com/tuarua/firebase/auth/GoogleAuthCredential.as +++ b/native_extension/GoogleSignInANE/src/com/tuarua/firebase/auth/GoogleAuthCredential.as @@ -1,3 +1,19 @@ +/* + * Copyright 2021 Tua Rua Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package com.tuarua.firebase.auth { public class GoogleAuthCredential extends AuthCredential { public function GoogleAuthCredential(idToken:String, accessToken:String) { diff --git a/native_extension/GoogleSignInANE/src/com/tuarua/firebase/auth/PlayGamesAuthCredential.as b/native_extension/GoogleSignInANE/src/com/tuarua/firebase/auth/PlayGamesAuthCredential.as index 1ac7cba8..c60dd217 100644 --- a/native_extension/GoogleSignInANE/src/com/tuarua/firebase/auth/PlayGamesAuthCredential.as +++ b/native_extension/GoogleSignInANE/src/com/tuarua/firebase/auth/PlayGamesAuthCredential.as @@ -17,7 +17,7 @@ package com.tuarua.firebase.auth { public class PlayGamesAuthCredential extends AuthCredential { public function PlayGamesAuthCredential(serverAuthCode:String) { - super('playgames.google.com', serverAuthCode); + super("playgames.google.com", serverAuthCode); } } } diff --git a/native_extension/GoogleSignInANE/src/com/tuarua/google/GoogleSignInANEContext.as b/native_extension/GoogleSignInANE/src/com/tuarua/google/GoogleSignInANEContext.as index 7db4aa7d..792b5f09 100644 --- a/native_extension/GoogleSignInANE/src/com/tuarua/google/GoogleSignInANEContext.as +++ b/native_extension/GoogleSignInANE/src/com/tuarua/google/GoogleSignInANEContext.as @@ -14,6 +14,7 @@ * limitations under the License. */ package com.tuarua.google { +import com.tuarua.fre.ANEUtils; import com.tuarua.google.signin.GoogleSignInAccount; import com.tuarua.google.signin.events.GoogleSignInEvent; @@ -62,39 +63,23 @@ public class GoogleSignInANEContext { trace("[" + NAME + "]", event.code); break; case GoogleSignInEvent.ERROR: - var error:Error; try { argsAsJSON = JSON.parse(event.code); - error = new Error(argsAsJSON.data.text, argsAsJSON.data.id); + var error:Error = new Error(argsAsJSON.data.text, argsAsJSON.data.id); + GoogleSignIn.shared().dispatchEvent(new GoogleSignInEvent(event.level, null, error)); } catch (e:Error) { trace("parsing error", event.code, e.message); - return; } - GoogleSignIn.shared().dispatchEvent(new GoogleSignInEvent(event.level, null, error)); break; case GoogleSignInEvent.SIGN_IN: - var account:GoogleSignInAccount; try { argsAsJSON = JSON.parse(event.code); - var data:Object = argsAsJSON["data"] || {}; - account = new GoogleSignInAccount(); - account.id = data["id"] || null; - account.idToken = data["idToken"] || null; - account.serverAuthCode = data["serverAuthCode"] || null; - account.email = data["email"] || null; - account.photoUrl = data["photoUrl"] || null; - account.displayName = data["displayName"] || null; - account.familyName = data["familyName"] || null; - account.givenName = data["givenName"] || null; - account.grantedScopes = data["grantedScopes"] is Array - ? Vector.(data["grantedScopes"]) - : new []; - account.accessToken = data["accessToken"] || null; + GoogleSignIn.shared().dispatchEvent(new GoogleSignInEvent(event.level, + ANEUtils.map(argsAsJSON.data, + GoogleSignInAccount) as GoogleSignInAccount)); } catch (e:Error) { trace("parsing error", event.code, e.message); - return; } - GoogleSignIn.shared().dispatchEvent(new GoogleSignInEvent(event.level, account)); break; } } diff --git a/native_extension/GoogleSignInANE/src/com/tuarua/google/signin/GoogleSignInAccount.as b/native_extension/GoogleSignInANE/src/com/tuarua/google/signin/GoogleSignInAccount.as index ebf667ea..08a31036 100644 --- a/native_extension/GoogleSignInANE/src/com/tuarua/google/signin/GoogleSignInAccount.as +++ b/native_extension/GoogleSignInANE/src/com/tuarua/google/signin/GoogleSignInAccount.as @@ -20,184 +20,61 @@ package com.tuarua.google.signin { * GoogleSignIn account information */ public class GoogleSignInAccount { - - private var _id:String = null; - private var _idToken:String = null; - private var _serverAuthCode:String = null; - private var _displayName:String = null; - private var _email:String = null; - private var _photoUrl:String = null; - private var _grantedScopes:Vector. = new []; - private var _familyName:String = null; - private var _givenName:String = null; - private var _accessToken:String = null; - - public function GoogleSignInAccount() { - } - /** * Unique ID for the Google account. * Will be present if `openid` scope was granted. - * Also on iOS platform. - * - * @see GoogleSignInOptions#DEFAULT_SIGN_IN - * @see GoogleSignInOptions#requestId - * @see https://developers.google.com/android/reference/com/google/android/gms/auth/api/signin/GoogleSignInAccount#public-string-getid - * @see https://developers.google.com/identity/sign-in/ios/reference/Classes/GIDGoogleUser#userid */ - public function get id():String { - return _id; - } - - public function set id(value:String):void { - _id = value; - } - + public var id:String; /** * Returns an ID token that you can send to your server. * Will be present if client options requestIdToken is true. - * Also on iOS platform. - * - * @see GoogleSignInOptions#requestIdToken - * @see https://developers.google.com/android/reference/com/google/android/gms/auth/api/signin/GoogleSignInAccount#public-string-getidtoken - * @see https://developers.google.com/identity/sign-in/ios/reference/Classes/GIDAuthentication#idtoken */ - public function get idToken():String { - return _idToken; - } - - public function set idToken(value:String):void { - _idToken = value; - } - + public var idToken:String; /** * Returns a one-time server auth code to send to your web server which can be exchanged for access token. * Will be present if client options requestServerAuthCode is true. - * - * @see GoogleSignInOptions#requestServerAuthCode - * @see https://developers.google.com/android/reference/com/google/android/gms/auth/api/signin/GoogleSignInAccount#public-string-getserverauthcode - * @see https://developers.google.com/identity/sign-in/ios/reference/Classes/GIDGoogleUser#serverauthcode */ - public function get serverAuthCode():String { - return _serverAuthCode; - } - - public function set serverAuthCode(value:String):void { - _serverAuthCode = value; - } - + public var serverAuthCode:String; + /** + * Returns the display name of the signed in user. + * Will be present if `profile` scope was granted. + */ + public var displayName:String; /** * Returns the email address of the signed in user. * Will be present if `email` scope was granted. - * - * @see GoogleSignInOptions#requestEmail - * @see https://developers.google.com/android/reference/com/google/android/gms/auth/api/signin/GoogleSignInAccount#public-string-getemail - * @see https://developers.google.com/identity/sign-in/ios/reference/Classes/GIDProfileData#email */ - public function get email():String { - return _email; - } - - public function set email(value:String):void { - _email = value; - } - + public var email:String; /** * Returns the photo url of the signed in user. * Will be present if user has a profile picture and `profile` scope was granted. - * - * @see GoogleSignInOptions#requestProfile - * @see https://developers.google.com/android/reference/com/google/android/gms/auth/api/signin/GoogleSignInAccount#public-uri-getphotourl - * @see https://developers.google.com/identity/sign-in/ios/reference/Classes/GIDProfileData#-imageurlwithdimension: */ - public function get photoUrl():String { - return _photoUrl; - } - - public function set photoUrl(value:String):void { - _photoUrl = value; - } - + public var photoUrl:String; /** - * Returns the display name of the signed in user. - * Will be present if `profile` scope was granted. - * - * @see GoogleSignInOptions#requestProfile - * @see https://developers.google.com/android/reference/com/google/android/gms/auth/api/signin/GoogleSignInAccount#public-string-getdisplayname - * @see https://developers.google.com/identity/sign-in/ios/reference/Classes/GIDProfileData#name + * Returns all scopes that have been authorized to your application. */ - public function get displayName():String { - return _displayName; - } - - public function set displayName(value:String):void { - _displayName = value; - } - + public var grantedScopes:Array = []; /** * Returns the family name of the signed in user. * Will be present if `profile` scope was granted. - * - * @see GoogleSignInOptions#requestProfile - * @see https://developers.google.com/android/reference/com/google/android/gms/auth/api/signin/GoogleSignInAccount#public-string-getfamilyname - * @see https://developers.google.com/identity/sign-in/ios/reference/Classes/GIDProfileData#familyname */ - public function get familyName():String { - return _familyName; - } - - public function set familyName(value:String):void { - _familyName = value; - } - + public var familyName:String; /** * Returns the given name of the signed in user. * Will be present if `profile` scope was granted. - * - * @see GoogleSignInOptions#requestProfile - * @see https://developers.google.com/android/reference/com/google/android/gms/auth/api/signin/GoogleSignInAccount#public-string-getgivenname - * @see https://developers.google.com/identity/sign-in/ios/reference/Classes/GIDProfileData#givenname */ - public function get givenName():String { - return _givenName; - } - - public function set givenName(value:String):void { - _givenName = value; - } - - /** - * Returns all scopes that have been authorized to your application. - * - * @see GoogleSignInOptions#scopes - * @see https://developers.google.com/android/reference/com/google/android/gms/auth/api/signin/GoogleSignInAccount#public-setscope-getgrantedscopes - * @see https://developers.google.com/identity/sign-in/ios/reference/Classes/GIDGoogleUser#grantedscopes - */ - public function get grantedScopes():Vector. { - return _grantedScopes; - } - - public function set grantedScopes(value:Vector.):void { - _grantedScopes = value; - } - + public var givenName:String; /** * The OAuth2 access token to access Google services. - * Will be present on iOS platform. - * - * @see https://developers.google.com/identity/sign-in/ios/reference/Classes/GIDAuthentication#accesstoken + * iOS only. */ - public function get accessToken():String { - return _accessToken; - } + public var accessToken:String; - public function set accessToken(value:String):void { - _accessToken = value; + public function GoogleSignInAccount() { } public function hasScope(scope:String):Boolean { - return _grantedScopes.indexOf(scope) !== -1; + return grantedScopes.indexOf(scope) > -1; } - } } diff --git a/native_extension/GoogleSignInANE/src/com/tuarua/google/signin/GoogleSignInOptions.as b/native_extension/GoogleSignInANE/src/com/tuarua/google/signin/GoogleSignInOptions.as index 647171aa..364e4fee 100644 --- a/native_extension/GoogleSignInANE/src/com/tuarua/google/signin/GoogleSignInOptions.as +++ b/native_extension/GoogleSignInANE/src/com/tuarua/google/signin/GoogleSignInOptions.as @@ -20,12 +20,32 @@ package com.tuarua.google.signin { * Options for GoogleSignIn client. */ public class GoogleSignInOptions { + private var _scopes:Vector.; + /** + * Specifies that an ID token for authenticated users is requested. + * Requesting an ID token requires that the server client ID be specified. + */ + public var requestIdToken:Boolean = false; + /** + * Specifies that offline access is requested. + * Requesting offline access requires that the server client ID be specified. + */ + public var requestServerAuthCode:Boolean = false; + /** + * The client ID of the server that will need to get `serverAuthCode` or verify `idToken` + * On Android you can leave that unspecified, then string value of resource `default_web_client_id` will be used. + */ + public var serverClientId:String; + + public function GoogleSignInOptions(scopes:Vector. = null) { + _scopes = scopes ? scopes : new []; + } /** * Default configuration for Google Sign In. */ public static function get DEFAULT_SIGN_IN():GoogleSignInOptions { - var options:GoogleSignInOptions = new GoogleSignInOptions(new ['openid', 'profile']); + var options:GoogleSignInOptions = new GoogleSignInOptions(new ["openid", "profile"]); options.requestIdToken = true; return options; } @@ -34,27 +54,15 @@ public class GoogleSignInOptions { * Default and recommended configuration for Play Games Sign In. */ public static function get DEFAULT_GAMES_SIGN_IN():GoogleSignInOptions { - var options:GoogleSignInOptions = new GoogleSignInOptions(new ['https://www.googleapis.com/auth/games_lite']); + var options:GoogleSignInOptions = new GoogleSignInOptions( + new ["https://www.googleapis.com/auth/games_lite"]); options.requestServerAuthCode = true; return options; } - private var _scopes:Vector.; - private var _requestIdToken:Boolean = false; - private var _requestServerAuthCode:Boolean = false; - private var _serverClientId:String = null; - - public function GoogleSignInOptions(scopes:Vector. = null) { - _scopes = scopes ? scopes : new []; - } - /** * Specifies OAuth 2.0 scopes your application requests. * You can modify requested scopes using addScope() - * - * @see #addScope - * @see https://developers.google.com/android/reference/com/google/android/gms/auth/api/signin/GoogleSignInOptions.Builder#public-googlesigninoptions.builder-requestscopes-scope-scope,-scope...-scopes - * @see https://developers.google.com/android/reference/com/google/android/gms/common/Scopes */ public function get scopes():Vector. { return _scopes; @@ -67,11 +75,11 @@ public class GoogleSignInOptions { * @see GoogleSignInAccount#id */ public function get requestId():Boolean { - return hasScope('openid'); + return hasScope("openid"); } public function set requestId(value:Boolean):void { - setScope('openid', value); + setScope("openid", value); } /** @@ -81,11 +89,11 @@ public class GoogleSignInOptions { * @see GoogleSignInAccount#email */ public function get requestEmail():Boolean { - return hasScope('email'); + return hasScope("email"); } public function set requestEmail(value:Boolean):void { - setScope('email', value); + setScope("email", value); } /** @@ -93,57 +101,11 @@ public class GoogleSignInOptions { * Will add `profile` scope if set to true. */ public function get requestProfile():Boolean { - return hasScope('profile'); + return hasScope("profile"); } public function set requestProfile(value:Boolean):void { - setScope('profile', value); - } - - /** - * Specifies that an ID token for authenticated users is requested. - * Requesting an ID token requires that the server client ID be specified. - * - * @see https://developers.google.com/android/reference/com/google/android/gms/auth/api/signin/GoogleSignInOptions.Builder#public-googlesigninoptions.builder-requestidtoken-string-serverclientid - * @see https://developers.google.com/identity/sign-in/ios/reference/Classes/GIDSignIn#serverclientid - * @see #serverClientId - */ - public function get requestIdToken():Boolean { - return _requestIdToken; - } - - public function set requestIdToken(value:Boolean):void { - _requestIdToken = value; - } - - /** - * Specifies that offline access is requested. - * Requesting offline access requires that the server client ID be specified. - * - * @see https://developers.google.com/android/reference/com/google/android/gms/auth/api/signin/GoogleSignInOptions.Builder#public-googlesigninoptions.builder-requestserverauthcode-string-serverclientid - * @see https://developers.google.com/identity/sign-in/ios/reference/Classes/GIDSignIn#serverclientid - * @see #serverClientId - */ - public function get requestServerAuthCode():Boolean { - return _requestServerAuthCode; - } - - public function set requestServerAuthCode(value:Boolean):void { - _requestServerAuthCode = value; - } - - /** - * The client ID of the server that will need to get `serverAuthCode` or verify `idToken` - * On Android you can left that unspecified, then string value of resource `default_web_client_id` will be used. - * - * https://developers.google.com/identity/sign-in/ios/reference/Classes/GIDSignIn#serverclientid - */ - public function get serverClientId():String { - return _serverClientId; - } - - public function set serverClientId(value:String):void { - _serverClientId = value; + setScope("profile", value); } /** @@ -153,23 +115,22 @@ public class GoogleSignInOptions { */ public function addScope(scope:String):void { if (!scope) { - throw new ArgumentError('empty scope'); + throw new ArgumentError("empty scope"); } setScope(scope, true); } public function hasScope(scope:String):Boolean { - return _scopes.indexOf(scope) !== -1; + return _scopes.indexOf(scope) > -1; } private function setScope(scope:String, value:Boolean):void { var index:int = _scopes.indexOf(scope); if (value && index === -1) { _scopes.push(scope); - } else if (!value && index !== -1) { + } else if (!value && index > -1) { _scopes.splice(index, 1); } } - } } diff --git a/native_extension/GoogleSignInANE/src/com/tuarua/google/signin/events/GoogleSignInEvent.as b/native_extension/GoogleSignInANE/src/com/tuarua/google/signin/events/GoogleSignInEvent.as index 3cac6ced..9bcf7319 100644 --- a/native_extension/GoogleSignInANE/src/com/tuarua/google/signin/events/GoogleSignInEvent.as +++ b/native_extension/GoogleSignInANE/src/com/tuarua/google/signin/events/GoogleSignInEvent.as @@ -25,25 +25,21 @@ public class GoogleSignInEvent extends Event { public static const SIGN_IN:String = "GoogleSignInEvent.SignIn"; public static const ERROR:String = "GoogleSignInEvent.Error"; public var account:GoogleSignInAccount; + public var credential:AuthCredential; public var error:Error; public function GoogleSignInEvent(type:String, account:GoogleSignInAccount = null, error:Error = null, bubbles:Boolean = false, cancelable:Boolean = false) { super(type, bubbles, cancelable); this.account = account; - this.error = error; - } - - public function get credential():AuthCredential { - if (!account) { - return null; - } else if (account.idToken) { - return new GoogleAuthCredential(account.idToken, account.accessToken); - } else if (account.serverAuthCode && account.hasScope('https://www.googleapis.com/auth/games_lite')) { - return new PlayGamesAuthCredential(account.serverAuthCode); - } else { - return null; + if (account) { + if (account.idToken) { + credential = new GoogleAuthCredential(account.idToken, account.accessToken); + } else if (account.serverAuthCode && account.hasScope("https://www.googleapis.com/auth/games_lite")) { + credential = new PlayGamesAuthCredential(account.serverAuthCode); + } } + this.error = error; } public override function clone():Event { diff --git a/native_extension/MessagingANE/ane/air_package.json b/native_extension/MessagingANE/ane/air_package.json index 2af14ba1..850b6fe1 100644 --- a/native_extension/MessagingANE/ane/air_package.json +++ b/native_extension/MessagingANE/ane/air_package.json @@ -1,6 +1,6 @@ { "name": "com.tuarua.firebase.MessagingANE", - "version": "0.18.0", + "version": "0.19.0", "repository": { "url": "https://tuarua.github.io/air/air_packages.json" }, diff --git a/native_extension/MessagingANE/ane/extension_multi.xml b/native_extension/MessagingANE/ane/extension_multi.xml index 1e577c14..86b0cb17 100644 --- a/native_extension/MessagingANE/ane/extension_multi.xml +++ b/native_extension/MessagingANE/ane/extension_multi.xml @@ -3,7 +3,7 @@ com.tuarua.firebase.MessagingANE Firebase Messaging ANE This work is licensed under Apache License, Copyright (c) 2018 Tua Rua Ltd. - 0.18.0 + 0.19.0 diff --git a/native_extension/MessagingANE/bin/MessagingANE.swc b/native_extension/MessagingANE/bin/MessagingANE.swc index 3288c902e468a1ef8e926dad072a6561e99bb996..0d87f2f8dcbbdb6079037c7f36aeb3679a0e5270 100644 GIT binary patch delta 47 vcmZoMX))mq@MdNaVc_84V9@JXxsg|tml;TJR^?6R0Wl_bOPYb{Ba#jP5%vu- delta 47 vcmZoMX))mq@MdNaVc_84V31ujaU-uNFEfzdtje3r17b|>mNWy?Mcom.tuarua.firebase.ModelInterpreterANE Firebase Tensor Flow Lite ANE This work is licensed under Apache License, Copyright (c) 2018 Tua Rua Ltd. - 0.18.0 + 0.19.0 diff --git a/native_extension/ModelInterpreterANE/bin/ModelInterpreterANE.swc b/native_extension/ModelInterpreterANE/bin/ModelInterpreterANE.swc index a78b646d6f3296035379e81328911d2d066d9367..f9c7cc67c70ce443119c8e2f4e360d451be45b9b 100644 GIT binary patch delta 47 wcmZ1wy&#%5z?+#xgn@&DgTbU{_RPSAA#061k0^Z)<= diff --git a/native_extension/OneSignalANE/ane/air_package.json b/native_extension/OneSignalANE/ane/air_package.json index b99d7f48..3271206f 100644 --- a/native_extension/OneSignalANE/ane/air_package.json +++ b/native_extension/OneSignalANE/ane/air_package.json @@ -1,6 +1,6 @@ { "name": "com.tuarua.OneSignalANE", - "version": "0.18.0", + "version": "0.19.0", "repository": { "url": "https://tuarua.github.io/air/air_packages.json" }, diff --git a/native_extension/OneSignalANE/ane/extension_multi.xml b/native_extension/OneSignalANE/ane/extension_multi.xml index 1e86145b..b5a84336 100644 --- a/native_extension/OneSignalANE/ane/extension_multi.xml +++ b/native_extension/OneSignalANE/ane/extension_multi.xml @@ -3,7 +3,7 @@ com.tuarua.OneSignalANE OneSignal ANE This work is licensed under Apache License, Copyright (c) 2018 Tua Rua Ltd. - 0.18.0 + 0.19.0 diff --git a/native_extension/OneSignalANE/bin/OneSignalANE.swc b/native_extension/OneSignalANE/bin/OneSignalANE.swc index 7bdfbb291f0bc91d95bd4d344c28a76256fe1ea0..bb450fb9584773369b44b2990eb66f51ec7a0b9c 100644 GIT binary patch delta 49 ycmdng&A6$XkvG7bnMH(wgM))Xw`b)>UNZ$|Aidd5;e!f@G1=193``ffIsgDyRu20B delta 49 ycmdng&A6$XkvG7bnMH(wgM))XX3@lryk-i_Kzg&A!Uq))W3r{I8JI3|bpQZS^bW58 diff --git a/native_extension/PerformanceANE/ane/air_package.json b/native_extension/PerformanceANE/ane/air_package.json index 40652f75..5b0e9a55 100644 --- a/native_extension/PerformanceANE/ane/air_package.json +++ b/native_extension/PerformanceANE/ane/air_package.json @@ -1,6 +1,6 @@ { "name": "com.tuarua.firebase.PerformanceANE", - "version": "0.18.0", + "version": "0.19.0", "repository": { "url": "https://tuarua.github.io/air/air_packages.json" }, diff --git a/native_extension/PerformanceANE/ane/extension_multi.xml b/native_extension/PerformanceANE/ane/extension_multi.xml index 171ec99e..1db0d59e 100644 --- a/native_extension/PerformanceANE/ane/extension_multi.xml +++ b/native_extension/PerformanceANE/ane/extension_multi.xml @@ -3,7 +3,7 @@ com.tuarua.firebase.PerformanceANE Firebase Performance ANE This work is licensed under Apache License, Copyright (c) 2017 Tua Rua Ltd. - 0.18.0 + 0.19.0 diff --git a/native_extension/PerformanceANE/bin/PerformanceANE.swc b/native_extension/PerformanceANE/bin/PerformanceANE.swc index 0a9dd0c005c527073c98ec7fd97457a9a40db020..8d434ccef405fe45ac1f9be6d11f53ccaeeeabe9 100644 GIT binary patch delta 47 wcmeya_+61Vz?+#xgn@&DgF&}vb%7 diff --git a/native_extension/RemoteConfigANE/ane/air_package.json b/native_extension/RemoteConfigANE/ane/air_package.json index b91fe4c4..8381313a 100644 --- a/native_extension/RemoteConfigANE/ane/air_package.json +++ b/native_extension/RemoteConfigANE/ane/air_package.json @@ -1,6 +1,6 @@ { "name": "com.tuarua.firebase.RemoteConfigANE", - "version": "0.18.0", + "version": "0.19.0", "repository": { "url": "https://tuarua.github.io/air/air_packages.json" }, diff --git a/native_extension/RemoteConfigANE/ane/extension_multi.xml b/native_extension/RemoteConfigANE/ane/extension_multi.xml index a97212d7..7588288b 100644 --- a/native_extension/RemoteConfigANE/ane/extension_multi.xml +++ b/native_extension/RemoteConfigANE/ane/extension_multi.xml @@ -3,7 +3,7 @@ com.tuarua.firebase.RemoteConfigANE Firebase Remote Config ANE This work is licensed under Apache License, Copyright (c) 2017 Tua Rua Ltd. - 0.18.0 + 0.19.0 diff --git a/native_extension/RemoteConfigANE/bin/RemoteConfigANE.swc b/native_extension/RemoteConfigANE/bin/RemoteConfigANE.swc index f7441e29bd6890798b23bcd5f536d27b6be52e12..92c6ea93454602ec6979228b0598edfa3797e021 100644 GIT binary patch delta 47 wcmZ2xx6F<=z?+#xgn@&DgF&Zfcom.tuarua.firebase.StorageANE Firebase Storage ANE This work is licensed under Apache License, Copyright (c) 2017 Tua Rua Ltd. - 0.18.0 + 0.19.0 diff --git a/native_extension/StorageANE/bin/StorageANE.swc b/native_extension/StorageANE/bin/StorageANE.swc index 8e566e1b199c4405849b2074f3a264053257d415..9673e438c48902e573a8e47ea00440ae0644bf21 100644 GIT binary patch delta 49 ycmccB!Fa2KkvG7bnMH(wgM))Xr)T9xUKMp_Aidc{eU%J|G5Mjh8JL!GaR2~gTn{P$ delta 49 ycmccB!Fa2KkvG7bnMH(wgM))XYSF}vyejIcom.tuarua.firebase.VisionANE Firebase Vision ANE This work is licensed under Apache License, Copyright (c) 2018 Tua Rua Ltd. - 0.18.0 + 0.19.0 diff --git a/native_extension/VisionANE/bin/VisionANE.swc b/native_extension/VisionANE/bin/VisionANE.swc index 5f5e16692b6eb3cff78edb2f87a7998ba740f3ac..ee2a86eb985987129a397cb8aa51eabb4b1595b6 100644 GIT binary patch delta 49 ycmZ2@o^j!MM&1B#W)=|!4h{|mlb)3ud7r8<1L@6QRScX!jL915W?(uo-2niB+7M#^ delta 49 ycmZ2@o^j!MM&1B#W)=|!4h{|m)kPCG@;+5z2GX0qsu(zd7?U;9&A@bGx&r`x6c8T( diff --git a/native_extension/VisionCloudDocumentANE/ane/extension_multi.xml b/native_extension/VisionCloudDocumentANE/ane/extension_multi.xml index ab01d604..fc80d955 100644 --- a/native_extension/VisionCloudDocumentANE/ane/extension_multi.xml +++ b/native_extension/VisionCloudDocumentANE/ane/extension_multi.xml @@ -3,7 +3,7 @@ com.tuarua.firebase.VisionCloudDocumentANE Firebase Vision Cloud Document ANE This work is licensed under Apache License, Copyright (c) 2018 Tua Rua Ltd. - 0.18.0 + 0.19.0 diff --git a/native_extension/VisionCloudDocumentANE/bin/VisionCloudDocumentANE.swc b/native_extension/VisionCloudDocumentANE/bin/VisionCloudDocumentANE.swc index 4cbfde7339043b15bc1f446e9a83d178f00fec80..9038f8842bf86c577287ad6f5d5f657d2d0c4370 100644 GIT binary patch delta 47 wcmX>cb2x@Kz?+#xgn@&DgTc6Gcb2x@Kz?+#xgn@&DgF$7{#Erb?1(|{L=KF##q(O|yr*zH0G_#%q0Ac|ThX4Qo diff --git a/native_extension/VisionCloudLabelANE/ane/extension_multi.xml b/native_extension/VisionCloudLabelANE/ane/extension_multi.xml index c2fe395f..2af5c05b 100644 --- a/native_extension/VisionCloudLabelANE/ane/extension_multi.xml +++ b/native_extension/VisionCloudLabelANE/ane/extension_multi.xml @@ -3,7 +3,7 @@ com.tuarua.firebase.VisionCloudLabelANE Firebase Vision Cloud Label ANE This work is licensed under Apache License, Copyright (c) 2018 Tua Rua Ltd. - 0.18.0 + 0.19.0 diff --git a/native_extension/VisionCloudLabelANE/bin/VisionCloudLabelANE.swc b/native_extension/VisionCloudLabelANE/bin/VisionCloudLabelANE.swc index 14ca9f114c6981da85ec471691fa1ee535c82f89..2dfaba1ad70d09bfcb529d80c5009038b9c7e49f 100644 GIT binary patch delta 47 wcmeCs?$G89@MdNaVc_84U@-1kxsi7-7c-FFe3r`|%$UqCY6cRR>>=s^048w_U;qFB delta 47 wcmeCs?$G89@MdNaVc_84U{F~!aU<_uE@mLT`7D<`m@%1O)C?pr*+bL;03oXl8~^|S diff --git a/native_extension/VisionCloudTextANE/ane/extension_multi.xml b/native_extension/VisionCloudTextANE/ane/extension_multi.xml index bf0586da..ed46a8c0 100644 --- a/native_extension/VisionCloudTextANE/ane/extension_multi.xml +++ b/native_extension/VisionCloudTextANE/ane/extension_multi.xml @@ -3,7 +3,7 @@ com.tuarua.firebase.VisionCloudTextANE Firebase Vision Cloud Text ANE This work is licensed under Apache License, Copyright (c) 2018 Tua Rua Ltd. - 0.18.0 + 0.19.0 diff --git a/native_extension/VisionCloudTextANE/bin/VisionCloudTextANE.swc b/native_extension/VisionCloudTextANE/bin/VisionCloudTextANE.swc index 23a766d4607e8ff9d960a3214325ffce0b7a0011..20aa51b5e9ceac5024a3657bdbbf50355052c0b2 100644 GIT binary patch delta 47 wcmccbbl-_Lz?+#xgn@&DgTbh0com.tuarua.firebase.VisionLandmarkANE Firebase Vision Landmark ANE This work is licensed under Apache License, Copyright (c) 2018 Tua Rua Ltd. - 0.18.0 + 0.19.0 diff --git a/native_extension/VisionLandmarkANE/bin/VisionLandmarkANE.swc b/native_extension/VisionLandmarkANE/bin/VisionLandmarkANE.swc index ec0fbe147f4fe9c249bf462499a75d4c6d43465d..391f4bc11c8342ae3656787c78b02235f9f9a1fd 100644 GIT binary patch delta 47 wcmdm^u}6b9z?+#xgn@&DgTbh0com.tuarua.firebase.FirebaseANE Firebase ANE This work is licensed under Apache License, Copyright (c) 2018 Tua Rua Ltd. - 0.18.0 + 0.19.0 diff --git a/native_extension/bin/ANEUtils.swc b/native_extension/bin/ANEUtils.swc index fddb7248fd592073d783f077bec345245f8c6e6b..b3b9044aae1c49e914a209953ccee88c7897b1eb 100644 GIT binary patch delta 99 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 R}Z8V(j!;93L}w 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�m%sm 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�X? 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 ZU;o`68REYW-1Kr2NK!anBgjwd{{wfxMvwpi diff --git a/native_library/android/FirebaseANE/.idea/modules/Analytics/FirebaseANE.Analytics.iml b/native_library/android/FirebaseANE/.idea/modules/Analytics/FirebaseANE.Analytics.iml index 3ab2afc3..b2f511b6 100644 --- a/native_library/android/FirebaseANE/.idea/modules/Analytics/FirebaseANE.Analytics.iml +++ b/native_library/android/FirebaseANE/.idea/modules/Analytics/FirebaseANE.Analytics.iml @@ -32,7 +32,7 @@

If the current value is an integer or a double, both the current and the given value will be + interpreted as doubles and all arithmetic will follow IEEE 754 semantics. Otherwise, the + transformation will set the field to the given value.

+ + remove Returns a sentinel for use with update() to mark a field for deletion.com.tuarua.firebase.firestore:FieldValue Returns a sentinel for use with update() to mark a field for deletion. serverTimestamp + Returns a sentinel for use with set() or update() to include a server-generated + timestamp in the written data.com.tuarua.firebase.firestore:FieldValue + Returns a sentinel for use with set() or update() to include a server-generated + timestamp in the written data. + FirestoreSettingsObjectFirestoreSettingsareTimestampsInSnapshotsEnabled Specifies whether to use FIRTimestamps for timestamp fields in FIRDocumentSnapshots.This setting now defaults to true and will be removed in a future release. If you are already setting it to true, just remove the setting. If you are setting it to false, you should update your code to expect FIRTimestamp objects instead of NSDate and then remove the setting. @@ -117,7 +133,7 @@ To opt into the old behavior of returning NSDate objects, you can temporarily set areTimestampsInSnapshotsEnabled to false. - host The hostname to connect to. The hostname to connect to. isPersistenceEnabled Set to false to disable local persistent storage.true Set to false to disable local persistent storage. isSslEnabled Whether to use SSL when connecting.true Whether to use SSL when connecting. WhereObjectWherefieldPathoperatorvaluefieldPathoperatorvalueWriteBatchObjectWriteBatch Creates a new write batch Creates a new write batch commit + host The hostname to connect to. The hostname to connect to. isPersistenceEnabled Set to false to disable local persistent storage.true Set to false to disable local persistent storage. isSslEnabled Whether to use SSL when connecting.true Whether to use SSL when connecting. WhereObjectWherefieldPathoperatorvaluefieldPathoperatorvalueNumericIncrementFieldValuecom.tuarua.firebase.firestore:FieldValueNumericIncrementFieldValueoperandmethodNameFieldValue.incrementoperandWriteBatchObjectWriteBatch Creates a new write batch Creates a new write batch commit Commits all of the writes in this write batch as a single atomic unit.listenernullOptional This function will only execute when the client is online and the commit has completed against the server. The completion handler will not be called when the device is offline, though local diff --git a/native_extension/ane/docs/com.tuarua.firebase.remoteconfig.xml b/native_extension/ane/docs/com.tuarua.firebase.remoteconfig.xml index 12577506..7ca4e97b 100644 --- a/native_extension/ane/docs/com.tuarua.firebase.remoteconfig.xml +++ b/native_extension/ane/docs/com.tuarua.firebase.remoteconfig.xml @@ -1,4 +1 @@ -com.tuarua.firebase.remoteconfigRemoteConfigInfoObjectconfigSettingscom.tuarua.firebase.remoteconfig:RemoteConfigSettingsfetchTime Last successful fetch completion time. Last successful fetch completion time.lastFetchStatus Last fetch status. Last fetch status.RemoteConfigSettingsObjectRemoteConfigSettingsdeveloperModeEnabledfalsedeveloperModeEnabled - - - fetchTimeout Sets the connection timeout for fetch requests to the Firebase Remote Config servers in seconds.60 Sets the connection timeout for fetch requests to the Firebase Remote Config servers in seconds.minimumFetchInterval Sets the minimum interval between successive fetch calls.0 Sets the minimum interval between successive fetch calls.RemoteConfigFetchStatusObjectFAILURE Config fetch failed.2 Config fetch failed.NO_FETCH_YET Config has never been fetched.0 Config has never been fetched.SUCCESS Config fetch succeeded.1 Config fetch succeeded.THROTTLED Config fetch was throttled.3 Config fetch was throttled. \ No newline at end of file +com.tuarua.firebase.remoteconfigRemoteConfigInfoObjectconfigSettingscom.tuarua.firebase.remoteconfig:RemoteConfigSettingsfetchTime Last successful fetch completion time. Last successful fetch completion time.lastFetchStatus Last fetch status. Last fetch status.RemoteConfigSettingsObjectRemoteConfigSettingsfetchTimeout Sets the connection timeout for fetch requests to the Firebase Remote Config servers in seconds.60 Sets the connection timeout for fetch requests to the Firebase Remote Config servers in seconds.minimumFetchInterval Sets the minimum interval between successive fetch calls.0 Sets the minimum interval between successive fetch calls.RemoteConfigFetchStatusObjectFAILURE Config fetch failed.2 Config fetch failed.NO_FETCH_YET Config has never been fetched.0 Config has never been fetched.SUCCESS Config fetch succeeded.1 Config fetch succeeded.THROTTLED Config fetch was throttled.3 Config fetch was throttled. \ No newline at end of file diff --git a/native_extension/ane/docs/com.tuarua.firebase.xml b/native_extension/ane/docs/com.tuarua.firebase.xml index 3993e987..3b6361eb 100644 --- a/native_extension/ane/docs/com.tuarua.firebase.xml +++ b/native_extension/ane/docs/com.tuarua.firebase.xml @@ -169,15 +169,7 @@ This setting is persisted, and is applied on future invocations of your application. Once explicitly set, it overrides any settings in your Info.plist. - RemoteConfigflash.events:EventDispatcheractivateFetched - Applies Fetched Config data to the Active Config, causing updates to the behavior and appearance of the - app to take effect (depending on how config data is used in the app). - true if there was a Fetched Config, and it was activated, false if no - Fetched Config was found, or the Fetched Config was already activated. - - Applies Fetched Config data to the Active Config, causing updates to the behavior and appearance of the - app to take effect (depending on how config data is used in the app). - activate + RemoteConfigflash.events:EventDispatcheractivate Asynchronously activates the most recently fetched configs, so that the fetched key value pairs take effect. Asynchronously activates the most recently fetched configs, so that the fetched key value pairs take effect. addEventListenertypelisteneruseCapturefalsepriority0useWeakReferencefalsedispose Disposes the ANE Disposes the ANE fetchAndActivate @@ -264,9 +256,18 @@ Sets whether analytics collection is enabled for this app on this device. This setting is persisted across app sessions. By default it is enabled. currentScreen - The name of the current screen. + The name of the current screen. + The name of the current screen. Should contain 1 to 100 characters. Set to null to clear the current screen name. + defaultEventParameters + Adds parameters that will be set on every event logged from the SDK, including automatic ones. + Adds parameters that will be set on every event logged from the SDK, including automatic ones. + The values passed in the parameters dictionary will be added to the dictionary of default event parameters. + These parameters persist across app runs. They are of lower precedence than event parameters, + so if an event parameter and a parameter set using this API have the same name, the value of the event + parameter will be used. The same limitations on event parameters apply to default event parameters. + minimumSessionDuration Sets the minimum engagement time in seconds required to start a new session. diff --git a/native_extension/ane/docs/com.tuarua.google.signin.events.xml b/native_extension/ane/docs/com.tuarua.google.signin.events.xml index 0a55c894..65b98e86 100644 --- a/native_extension/ane/docs/com.tuarua.google.signin.events.xml +++ b/native_extension/ane/docs/com.tuarua.google.signin.events.xml @@ -1 +1 @@ -com.tuarua.google.signin.eventsGoogleSignInEventflash.events:EventGoogleSignInEventtypecredentialcom.tuarua.firebase.auth:GoogleAuthCredentialnullerrornullbubblesfalsecancelablefalseclonetoStringERRORGoogleSignInEvent.ErrorSIGN_INGoogleSignInEvent.SignIncredentialcom.tuarua.firebase.auth:GoogleAuthCredentialerror \ No newline at end of file +com.tuarua.google.signin.eventsGoogleSignInEventflash.events:EventGoogleSignInEventtypeaccountcom.tuarua.google.signin:GoogleSignInAccountnullerrornullbubblesfalsecancelablefalseclonetoStringERRORGoogleSignInEvent.ErrorSIGN_INGoogleSignInEvent.SignInaccountcom.tuarua.google.signin:GoogleSignInAccountcredentialcom.tuarua.firebase.auth:AuthCredentialerror \ No newline at end of file diff --git a/native_extension/ane/docs/com.tuarua.google.signin.xml b/native_extension/ane/docs/com.tuarua.google.signin.xml index c1d2badd..d0054674 100644 --- a/native_extension/ane/docs/com.tuarua.google.signin.xml +++ b/native_extension/ane/docs/com.tuarua.google.signin.xml @@ -1 +1,90 @@ -com.tuarua.google.signinGoogleSignInStatusCodeObjectAPI_NOT_CONNECTED The client attempted to call a method from an API that failed to connect.17 The client attempted to call a method from an API that failed to connect. CANCELED The result was canceled either due to client disconnect16 The result was canceled either due to client disconnectDEVELOPER_ERROR The application is misconfigured.10 The application is misconfigured.ERROR The operation failed with no more detailed information.13 The operation failed with no more detailed information.INTERNAL_ERROR An internal error occurred.8 An internal error occurred.INTERRUPTED A blocking call was interrupted while waiting and did not run to completion.14 A blocking call was interrupted while waiting and did not run to completion.INVALID_ACCOUNT The client attempted to connect to the service with an invalid account name specified.5 The client attempted to connect to the service with an invalid account name specified.NETWORK_ERROR A network error occurred.7 A network error occurred.RESOLUTION_REQUIRED Completing the operation requires some form of resolution.6 Completing the operation requires some form of resolution.SIGN_IN_CANCELLED The sign in was cancelled by the user.12501 The sign in was cancelled by the user. SIGN_IN_CURRENTLY_IN_PROGRESS A sign in process is currently in progress and the current one cannot continue.12502 A sign in process is currently in progress and the current one cannot continue.SIGN_IN_FAILED The sign in attempt didn't succeed with the current account.12500 The sign in attempt didn't succeed with the current account. SIGN_IN_REQUIRED The client attempted to connect to the service but the user is not signed in.4 The client attempted to connect to the service but the user is not signed in.TIMEOUT Timed out while awaiting the result.15 Timed out while awaiting the result. \ No newline at end of file +com.tuarua.google.signinGoogleSignInAccount + GoogleSignIn account information + Object + GoogleSignIn account information + GoogleSignInAccounthasScopescopeaccessToken + The OAuth2 access token to access Google services. + The OAuth2 access token to access Google services. + iOS only. + displayName + Returns the display name of the signed in user. + Returns the display name of the signed in user. + Will be present if `profile` scope was granted. + email + Returns the email address of the signed in user. + Returns the email address of the signed in user. + Will be present if `email` scope was granted. + familyName + Returns the family name of the signed in user. + Returns the family name of the signed in user. + Will be present if `profile` scope was granted. + givenName + Returns the given name of the signed in user. + Returns the given name of the signed in user. + Will be present if `profile` scope was granted. + grantedScopes + Returns all scopes that have been authorized to your application.unknown + Returns all scopes that have been authorized to your application. + idToken + Returns an ID token that you can send to your server. + Returns an ID token that you can send to your server. + Will be present if client options requestIdToken is true. + id + Unique ID for the Google account. + Unique ID for the Google account. + Will be present if `openid` scope was granted. + photoUrl + Returns the photo url of the signed in user. + Returns the photo url of the signed in user. + Will be present if user has a profile picture and `profile` scope was granted. + serverAuthCode + Returns a one-time server auth code to send to your web server which can be exchanged for access token. + Returns a one-time server auth code to send to your web server which can be exchanged for access token. + Will be present if client options requestServerAuthCode is true. + GoogleSignInOptions + Options for GoogleSignIn client.Object + Options for GoogleSignIn client. + GoogleSignInOptionsscopesnulladdScope + Add OAuth scope to requested + + scope + Add OAuth scope to requested + + hasScopescoperequestIdToken + Specifies that an ID token for authenticated users is requested.false + Specifies that an ID token for authenticated users is requested. + Requesting an ID token requires that the server client ID be specified. + requestServerAuthCode + Specifies that offline access is requested.false + Specifies that offline access is requested. + Requesting offline access requires that the server client ID be specified. + serverClientId + The client ID of the server that will need to get `serverAuthCode` or verify `idToken` + On Android you can leave that unspecified, then string value of resource `default_web_client_id` will be used. + The client ID of the server that will need to get `serverAuthCode` or verify `idToken` + On Android you can leave that unspecified, then string value of resource `default_web_client_id` will be used. + DEFAULT_GAMES_SIGN_IN + Default and recommended configuration for Play Games Sign In.com.tuarua.google.signin:GoogleSignInOptions + Default and recommended configuration for Play Games Sign In. + DEFAULT_SIGN_IN + Default configuration for Google Sign In.com.tuarua.google.signin:GoogleSignInOptions + Default configuration for Google Sign In. + requestEmail + Specifies that email info is requested by your application. + Specifies that email info is requested by your application. + Will add `email` scope if set to true. + + GoogleSignInAccount.emailrequestId + Specifies that user ID is requested by your application. + Specifies that user ID is requested by your application. + Will add `openid` scope if set to true. + + GoogleSignInAccount.idrequestProfile + Specifies that user's profile info is requested by your application. + Specifies that user's profile info is requested by your application. + Will add `profile` scope if set to true. + scopes + Specifies OAuth 2.0 scopes your application requests. + Specifies OAuth 2.0 scopes your application requests. + You can modify requested scopes using addScope() + GoogleSignInStatusCodeObjectAPI_NOT_CONNECTED The client attempted to call a method from an API that failed to connect.17 The client attempted to call a method from an API that failed to connect. CANCELED The result was canceled either due to client disconnect16 The result was canceled either due to client disconnectDEVELOPER_ERROR The application is misconfigured.10 The application is misconfigured.ERROR The operation failed with no more detailed information.13 The operation failed with no more detailed information.INTERNAL_ERROR An internal error occurred.8 An internal error occurred.INTERRUPTED A blocking call was interrupted while waiting and did not run to completion.14 A blocking call was interrupted while waiting and did not run to completion.INVALID_ACCOUNT The client attempted to connect to the service with an invalid account name specified.5 The client attempted to connect to the service with an invalid account name specified.NETWORK_ERROR A network error occurred.7 A network error occurred.RESOLUTION_REQUIRED Completing the operation requires some form of resolution.6 Completing the operation requires some form of resolution.SIGN_IN_CANCELLED The sign in was cancelled by the user.12501 The sign in was cancelled by the user. SIGN_IN_CURRENTLY_IN_PROGRESS A sign in process is currently in progress and the current one cannot continue.12502 A sign in process is currently in progress and the current one cannot continue.SIGN_IN_FAILED The sign in attempt didn't succeed with the current account.12500 The sign in attempt didn't succeed with the current account. SIGN_IN_REQUIRED The client attempted to connect to the service but the user is not signed in.4 The client attempted to connect to the service but the user is not signed in.TIMEOUT Timed out while awaiting the result.15 Timed out while awaiting the result. \ No newline at end of file diff --git a/native_extension/ane/docs/com.tuarua.google.xml b/native_extension/ane/docs/com.tuarua.google.xml index d83a8f2c..91adedbd 100644 --- a/native_extension/ane/docs/com.tuarua.google.xml +++ b/native_extension/ane/docs/com.tuarua.google.xml @@ -1,5 +1,19 @@ -com.tuarua.googleGoogleSignInflash.events:EventDispatcherdispose Disposes the ANE Disposes the ANE handle urlsourceApplication revokeAccess Revokes access given to the current application. Revokes access given to the current application. Future sign-in attempts will require the user to re-consent +com.tuarua.googleGoogleSignIn + It is possible to configure GoogleSignIn before use with options property.flash.events:EventDispatcher + It is possible to configure GoogleSignIn before use with options property. + + + // To sign into Play Games insted of regular Google account + // Note: officially supported on Android only + GoogleSignIn.options = GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN; + GoogleSignIn.shared().signIn(); + + + GoogleSignInOptionsdispose Disposes the ANE Disposes the ANE handle urlsourceApplication revokeAccess Revokes access given to the current application. Revokes access given to the current application. Future sign-in attempts will require the user to re-consent to all requested scopes. Applications are required to provide users that are signed in with Google the ability to disconnect their Google account from the app. If the user deletes their account, you must delete the information that your app obtained from the Google APIs. shared The ANE instance.com.tuarua.google:GoogleSignIn The ANE instance. signInSilently Attempts to sign in a previously authenticated user without interaction. Attempts to sign in a previously authenticated user without interaction. signIn Starts the sign-in process. Starts the sign-in process. Note that this method should not be called when the app is starting up.signOut Signs out the current signed-in user if any. Signs out the current signed-in user if any. It also clears the account previously selected by the user - and a future sign in attempt will require the user pick an account again. apiKey set the API key if not using Firebase resources set the API key if not using Firebase resources \ No newline at end of file + and a future sign in attempt will require the user pick an account again. options + Configuration for GoogleSignIn client.com.tuarua.google.signin:GoogleSignInOptions + Configuration for GoogleSignIn client. Set it before access GoogleSignIn api if needed. + \ No newline at end of file diff --git a/native_extension/ane/docs/com.tuarua.onesignal.xml b/native_extension/ane/docs/com.tuarua.onesignal.xml index 665690d9..4195d9e5 100644 --- a/native_extension/ane/docs/com.tuarua.onesignal.xml +++ b/native_extension/ane/docs/com.tuarua.onesignal.xml @@ -1,6 +1,6 @@ com.tuarua.onesignalOSEmailSubscriptionStateObjectOSEmailSubscriptionStateemailAddressemailUserIdsubscribedActionTypeObjectactionTaken1opened0OSPermissionStateObjectOSPermissionStateenabled Android only Android onlyhasPrompted iOS only iOS onlyprovidesAppNotificationSettings iOS only iOS onlyreachable iOS only iOS onlystatus iOS only iOS onlyOSNotificationDisplayTypeObjectinAppAlert Default Native Alert View display (note this is not an In-App Message) 1 Default Native Alert View display (note this is not an In-App Message) none Notification is silent, or app is in focus but InAppAlertNotifications are disabled.0 Notification is silent, or app is in focus but InAppAlertNotifications are disabled. notification Native native notification display.2 Native native notification display.OSNotificationPermissionObjectauthorized2denied1notDetermined0provisional3LogLevelObjectdebug5error2fatal1info4none0verbose6warn3OSSubscriptionStateObjectOSSubscriptionStatepushTokensubscribeduserIduserSubscriptionSettingActionButtonObjectActionButtoniconidtextOSNotificationActionObjectOSNotificationActionactionID The ID associated with the button tapped. The ID associated with the button tapped. null when the actionType is NotificationTapped or InAppAlertClosed type The type of the notification action The type of the notification action OSNotificationPayloadObjectOSNotificationPayloadactionButtons List of action buttons on the notification.unknown List of action buttons on the notification. additionalData Custom additional data that was sent with the notification. Custom additional data that was sent with the notification. Set on the dashboard under Options > Additional Data or with the 'data' field on the REST API. - attachments iOS attachments sent as part of the rich notification. iOS attachments sent as part of the rich notification.bigPicture Android big picture image set on the notification. Android big picture image set on the notification.body Body text of the notification. Body text of the notification. collapseIdcontents_available iOS - Provided key with a value of 1 to indicate that new content is available. iOS - Provided key with a value of 1 to indicate that new content is available. + attachments iOS attachments sent as part of the rich notification. iOS attachments sent as part of the rich notification.badgeIncrementbadgebigPicture Android big picture image set on the notification. Android big picture image set on the notification.body Body text of the notification. Body text of the notification. categorycollapseIdcontentAvailable iOS - Provided key with a value of 1 to indicate that new content is available. iOS - Provided key with a value of 1 to indicate that new content is available. Including this key and value means that when your app is launched in the background or resumed application:didReceiveRemoteNotification:fetchCompletionHandler: is called.fromProjectNumber The Google project number the notification was sent under. The Google project number the notification was sent under.groupKey Notifications with this same key will be grouped together as a single summary notification. Notifications with this same key will be grouped together as a single summary notification.groupMessage Summary text displayed in the summary notification. Summary text displayed in the summary notification.largeIcon Android large icon set on the notification. Android large icon set on the notification. launchURL URL to open when opening the notification. URL to open when opening the notification.ledColor Devices that have a notification LED will blink in this color. Devices that have a notification LED will blink in this color. ARGB format.lockScreenVisibility Privacy setting for how the notification should be shown on the lockscreen of Android 5+ devices. Privacy setting for how the notification should be shown on the lockscreen of Android 5+ devices. @@ -8,7 +8,7 @@ 0 - Private (Contents are hidden) - -1 - Secret (not shown).notificationID OneSignal notification UUID. OneSignal notification UUID. priorityrawPayload Raw JSON payload string received from OneSignal. Raw JSON payload string received from OneSignal. smallIconAccentColor Accent color shown around small notification icon on Android 5+ devices. Accent color shown around small notification icon on Android 5+ devices. ARGB format.smallIcon Android small icon resource name set on the notification. Android small icon resource name set on the notification. sound Sound resource parameter to play when the notification is shown. Sound resource parameter to play when the notification is shown. + -1 - Secret (not shown).mutableContentnotificationID OneSignal notification UUID. OneSignal notification UUID. priorityrawPayload Raw JSON payload string received from OneSignal. Raw JSON payload string received from OneSignal. smallIconAccentColor Accent color shown around small notification icon on Android 5+ devices. Accent color shown around small notification icon on Android 5+ devices. ARGB format.smallIcon Android small icon resource name set on the notification. Android small icon resource name set on the notification. sound Sound resource parameter to play when the notification is shown. Sound resource parameter to play when the notification is shown. iOS default set to UILocalNotificationDefaultSoundName. - subtitle iOS subtitle text of the notification. iOS subtitle text of the notification. title Title text of the notification. Title text of the notification. OSNotificationOpenResultObjectOSNotificationOpenResultactioncom.tuarua.onesignal:OSNotificationActionnotificationcom.tuarua.onesignal:OSNotificationOSNotification The notification the user received Object The notification the user received OSNotificationandroidNotificationId Android notification id. Android notification id. Can later be used to dismiss the notification programmatically. displayTypegroupedNotifications Will be set if a summary notification is opened.unknown Will be set if a summary notification is opened. + subtitle iOS subtitle text of the notification. iOS subtitle text of the notification. templateIDtemplateNametitle Title text of the notification. Title text of the notification. OSNotificationOpenResultObjectOSNotificationOpenResultactioncom.tuarua.onesignal:OSNotificationActionnotificationcom.tuarua.onesignal:OSNotificationOSNotification The notification the user received Object The notification the user received OSNotificationandroidNotificationId Android notification id. Android notification id. Can later be used to dismiss the notification programmatically. displayTypegroupedNotifications Will be set if a summary notification is opened.unknown Will be set if a summary notification is opened. The payload will be the most recent notification received.isAppInFocus Is app Active. Is app Active.payload Notification payload received from OneSignal com.tuarua.onesignal:OSNotificationPayload Notification payload received from OneSignal shown Was it displayed to the user. Was it displayed to the user. OSPermissionSubscriptionStateObjectOSPermissionSubscriptionStateemailSubscriptionStatuscom.tuarua.onesignal:OSEmailSubscriptionStatepermissionStatuscom.tuarua.onesignal:OSPermissionStatesubscriptionStatuscom.tuarua.onesignal:OSSubscriptionState \ No newline at end of file diff --git a/native_extension/ane/docs/com.tuarua.xml b/native_extension/ane/docs/com.tuarua.xml index 7f1312a6..de759061 100644 --- a/native_extension/ane/docs/com.tuarua.xml +++ b/native_extension/ane/docs/com.tuarua.xml @@ -52,7 +52,7 @@ Retrieve a list of tags that have been set on the user from the OneSignal server.listener Retrieve a list of tags that have been set on the user from the OneSignal server. Android will provide a cached copy if there is no network connection. - getTriggerValueForKey Returns a single trigger value for the given key (if it exists, otherwise returns null) key Returns a single trigger value for the given key (if it exists, otherwise returns null) initautoPromptLocationfalsedisableGmsMissingPromptfalsefilterOtherGCMReceiversfalseunsubscribeWhenNotificationsAreDisabledfalseinFocusDisplayingunknownlogoutEmail + getTriggerValueForKey Returns a single trigger value for the given key (if it exists, otherwise returns null) key Returns a single trigger value for the given key (if it exists, otherwise returns null) initappIdautoPromptLocationfalsedisableGmsMissingPromptfalsefilterOtherGCMReceiversfalseunsubscribeWhenNotificationsAreDisabledfalseinFocusDisplayingunknownlogoutEmail Call when user logs out of their account. Call when user logs out of their account. This dissociates the device from the email address. diff --git a/native_extension/ane/docs/packages.dita b/native_extension/ane/docs/packages.dita index da1afc2f..5075509b 100644 --- a/native_extension/ane/docs/packages.dita +++ b/native_extension/ane/docs/packages.dita @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file