From 196830d3cffe8ffffa55ddad7935af070b8c8675 Mon Sep 17 00:00:00 2001 From: Olle Fredriksson Date: Thu, 23 Jun 2016 16:33:36 +0200 Subject: [PATCH 1/6] Add Facebook login example using foreign code --- Samples/NativeFacebookLogin/Facebook.uno | 180 ++++++++++++++++++ Samples/NativeFacebookLogin/Facebook.unoproj | 24 +++ Samples/NativeFacebookLogin/Facebook.uxl | 64 +++++++ .../FacebookLoginButton.uno | 58 ++++++ Samples/NativeFacebookLogin/MainView.ux | 8 + Samples/NativeFacebookLogin/README.md | 21 ++ 6 files changed, 355 insertions(+) create mode 100644 Samples/NativeFacebookLogin/Facebook.uno create mode 100644 Samples/NativeFacebookLogin/Facebook.unoproj create mode 100644 Samples/NativeFacebookLogin/Facebook.uxl create mode 100644 Samples/NativeFacebookLogin/FacebookLoginButton.uno create mode 100644 Samples/NativeFacebookLogin/MainView.ux create mode 100644 Samples/NativeFacebookLogin/README.md diff --git a/Samples/NativeFacebookLogin/Facebook.uno b/Samples/NativeFacebookLogin/Facebook.uno new file mode 100644 index 0000000..a620148 --- /dev/null +++ b/Samples/NativeFacebookLogin/Facebook.uno @@ -0,0 +1,180 @@ +using Fuse; +using Fuse.Platform; +using Uno; +using Uno.Compiler.ExportTargetInterop; + +[Require("Xcode.FrameworkDirectory", "@('FacebookSDKs-iOS':Path)")] +[Require("Xcode.Framework", "@('FacebookSDKs-iOS/FBSDKCoreKit.framework':Path)")] +[Require("Xcode.Framework", "@('FacebookSDKs-iOS/FBSDKLoginKit.framework':Path)")] +[ForeignInclude(Language.ObjC, "FBSDKCoreKit/FBSDKCoreKit.h")] +[ForeignInclude(Language.ObjC, "FBSDKLoginKit/FBSDKLoginKit.h")] +[Require("Gradle.Dependency","compile('com.facebook.android:facebook-android-sdk:4.8.+') { exclude module: 'support-v4' }")] +[Require("Gradle.Repository","mavenCentral()")] +[ForeignInclude(Language.Java, "android.content.Intent")] +[ForeignInclude(Language.Java, "com.facebook.*")] +[ForeignInclude(Language.Java, "com.facebook.appevents.AppEventsLogger")] +[ForeignInclude(Language.Java, "com.facebook.login.*")] +[ForeignInclude(Language.Java, "com.fuse.Activity")] +public class Facebook +{ + public Facebook() + { + Lifecycle.Started += Started; + Lifecycle.EnteringInteractive += OnEnteringInteractive; + Lifecycle.ExitedInteractive += OnExitedInteractive; + InterApp.ReceivedURI += OnReceivedUri; + } + + [Foreign(Language.ObjC)] + extern(iOS) void Started(ApplicationState state) + @{ + [[FBSDKApplicationDelegate sharedInstance] + application: [UIApplication sharedApplication] + didFinishLaunchingWithOptions: nil]; + @} + + extern(Android) Java.Object _callbackManager; + + [Foreign(Language.Java)] + extern(Android) void Started(ApplicationState state) + @{ + FacebookSdk.sdkInitialize(Activity.getRootActivity()); + final CallbackManager callbackManager = CallbackManager.Factory.create(); + @{Facebook:Of(_this)._callbackManager:Set(callbackManager)}; + Activity.subscribeToResults(new Activity.ResultListener() + { + @Override + public boolean onResult(int requestCode, int resultCode, Intent data) + { + return callbackManager.onActivityResult(requestCode, resultCode, data); + } + + }); + @} + + extern(!iOS && !Android) void Started(ApplicationState state) + { + } + + [Foreign(Language.ObjC)] + static extern(iOS) void OnEnteringInteractive(ApplicationState state) + @{ + [FBSDKAppEvents activateApp]; + @} + + [Foreign(Language.Java)] + static extern(Android) void OnEnteringInteractive(ApplicationState state) + @{ + AppEventsLogger.activateApp(Activity.getRootActivity()); + @} + + static extern(!iOS && !Android) void OnEnteringInteractive(ApplicationState state) + { + } + + [Foreign(Language.Java)] + static extern(Android) void OnExitedInteractive(ApplicationState state) + @{ + AppEventsLogger.deactivateApp(Activity.getRootActivity()); + @} + + static extern(!Android) void OnExitedInteractive(ApplicationState state) + { + } + + static void OnReceivedUri(string uri) + { + debug_log "Received Uri: " + uri; + if (uri.StartsWith("fb")) + { + OpenFacebookURL(uri); + } + } + + [Foreign(Language.ObjC)] + static extern(iOS) void OpenFacebookURL(string url) + @{ + [[FBSDKApplicationDelegate sharedInstance] + application: [UIApplication sharedApplication] + openURL: [NSURL URLWithString:url] + sourceApplication: @"com.apple.mobilesafari" + annotation: nil]; + @} + + static extern(!iOS) void OpenFacebookURL(string url) + { + } + + public class AccessToken + { + extern(iOS) ObjC.Object _token; + extern(Android) Java.Object _token; + public extern(iOS) AccessToken(ObjC.Object token) + { + _token = token; + } + public extern(Android) AccessToken(Java.Object token) + { + _token = token; + } + } + + [Foreign(Language.ObjC)] + public extern(iOS) void Login(Action onSuccess, Action onCancelled, Action onError) + @{ + FBSDKLoginManager* login = [[FBSDKLoginManager alloc] init]; + [login + logInWithReadPermissions: @[@"public_profile"] + fromViewController: [[[UIApplication sharedApplication] keyWindow] rootViewController] + handler: ^(FBSDKLoginManagerLoginResult* result, NSError* error) + { + if (error) + { + onError([error localizedDescription]); + return; + } + if (result.isCancelled) + { + onCancelled(); + return; + } + id unoAccessToken = @{AccessToken(ObjC.Object):New(result.token)}; + onSuccess(unoAccessToken); + } + ]; + @} + + [Foreign(Language.Java)] + [Require("Entity", "AccessToken(Java.Object)")] + public extern(Android) void Login(Action onSuccess, Action onCancelled, Action onError) + @{ + CallbackManager callbackManager = (CallbackManager)@{Facebook:Of(_this)._callbackManager:Get()}; + LoginManager.getInstance().registerCallback(callbackManager, + new FacebookCallback() + { + @Override + public void onSuccess(LoginResult loginResult) + { + AccessToken accessToken = loginResult.getAccessToken(); + // TODO this should be UnoObject when https://github.com/fusetools/uno/issues/602 + // has been fixed + Object unoAccessToken = @{AccessToken(Java.Object):New(accessToken)}; + onSuccess.run(unoAccessToken); + } + + @Override + public void onCancel() + { + onCancelled.run(); + } + + @Override + public void onError(FacebookException exception) + { + onError.run(exception.toString()); + } + } + ); + LoginManager.getInstance().logInWithReadPermissions(Activity.getRootActivity(), java.util.Arrays.asList("public_profile")); + @} +} diff --git a/Samples/NativeFacebookLogin/Facebook.unoproj b/Samples/NativeFacebookLogin/Facebook.unoproj new file mode 100644 index 0000000..6da78c8 --- /dev/null +++ b/Samples/NativeFacebookLogin/Facebook.unoproj @@ -0,0 +1,24 @@ +{ + "iOS": { + "BundleIdentifier": "com.uno.test", + }, + "Android": { + "Package": "com.uno.test", + "Activity": "MainActivity", + "SDK": { + "MinVersion": "15", + "CompileVersion": "23", + } + }, + "Packages": [ + "Uno.Permissions", + "Fuse", + "Fuse.Platform", + ], + "Includes": [ + "Facebook.uno", + "Facebook.uxl", + "FacebookLoginButton.uno", + "MainView.ux", + ], +} diff --git a/Samples/NativeFacebookLogin/Facebook.uxl b/Samples/NativeFacebookLogin/Facebook.uxl new file mode 100644 index 0000000..c15f4c1 --- /dev/null +++ b/Samples/NativeFacebookLogin/Facebook.uxl @@ -0,0 +1,64 @@ + + + + + @(Facebook.AppID) + ]]> + + + + + ]]> + + + + CFBundleURLTypes + + + CFBundleURLSchemes + + fb@(Facebook.AppID) + + + + FacebookAppID + @(Facebook.AppID) + FacebookDisplayName + Fuse Test App + + NSAppTransportSecurity + + NSExceptionDomains + + facebook.com + + NSIncludesSubdomains + NSThirdPartyExceptionRequiresForwardSecrecy + + fbcdn.net + + NSIncludesSubdomains + NSThirdPartyExceptionRequiresForwardSecrecy + + akamaihd.net + + NSIncludesSubdomains + NSThirdPartyExceptionRequiresForwardSecrecy + + + + + LSApplicationQueriesSchemes + + fbauth2 + + ]]> + + diff --git a/Samples/NativeFacebookLogin/FacebookLoginButton.uno b/Samples/NativeFacebookLogin/FacebookLoginButton.uno new file mode 100644 index 0000000..de5a731 --- /dev/null +++ b/Samples/NativeFacebookLogin/FacebookLoginButton.uno @@ -0,0 +1,58 @@ +using Uno; +using Uno.Permissions; +using Fuse.Controls; + +public class FacebookLoginButton : Button +{ + Facebook _facebook; + public FacebookLoginButton() + : base() + { + _facebook = new Facebook(); + Fuse.Gestures.Clicked.AddHandler(this, ClickHandler); + } + + public void ClickHandler(object x, object y) + { + if defined(Android) + { + Permissions.Request(Permissions.Android.INTERNET).Then( + OnPermissionsPermitted, + OnPermissionsRejected); + } + else + { + Login(); + } + } + + void Login() + { + _facebook.Login(OnSuccess, OnCancelled, OnError); + } + + extern(Android) void OnPermissionsPermitted(PlatformPermission p) + { + Login(); + } + + void OnSuccess(Facebook.AccessToken token) + { + debug_log "Login successful"; + } + + void OnCancelled() + { + debug_log "Login cancelled"; + } + + void OnError(string reason) + { + debug_log "Login failed: " + reason; + } + + extern(Android) void OnPermissionsRejected(Exception e) + { + debug_log "Permission rejected: " + e.Message; + } +} diff --git a/Samples/NativeFacebookLogin/MainView.ux b/Samples/NativeFacebookLogin/MainView.ux new file mode 100644 index 0000000..3f61edd --- /dev/null +++ b/Samples/NativeFacebookLogin/MainView.ux @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/Samples/NativeFacebookLogin/README.md b/Samples/NativeFacebookLogin/README.md new file mode 100644 index 0000000..9afe09b --- /dev/null +++ b/Samples/NativeFacebookLogin/README.md @@ -0,0 +1,21 @@ +# Facebook login using foreign code + +This sample shows how we can get Facebook login working with Fuse using the +Facebook Android and iOS SDKs. +It is part of the tutorial over at [https://www.fusetools.com/docs/native-interop/facebook-login](Fuse's docs page), +so head over there if that's not where you came from! + +## Setup + +You will need to [register for a Facebook App ID](https://developers.facebook.com/docs/apps/register) +and fill it in as `Facebook.AppID` in `Facebook.uxl`. + +## Building + +To build for Android, we need to enable Gradle. The Facebook SDK for Android +dependency will then be handled automatically by Gradle. + +Use e.g. `uno build --target=Android -DGRADLE --run`. + +To build for iOS, you currently have to download the Facebook SDK for iOS +manually. It needs to be extracted in `FacebookSDKs-iOS` in the current folder. From db01b53c24886cbc2eacff2983cd2b32637f4452 Mon Sep 17 00:00:00 2001 From: Olle Fredriksson Date: Tue, 28 Jun 2016 14:04:18 +0200 Subject: [PATCH 2/6] Modularise NativeFacebookLogin sample The main functionality is now in the FacebookLogin Uno project --- Samples/NativeFacebookLogin/FacebookAppId.uxl | 3 +++ .../{Facebook.unoproj => FacebookExample.unoproj} | 9 +++++---- .../{Facebook.uno => FacebookLogin/FacebookLogin.uno} | 8 ++++---- .../FacebookLogin/FacebookLogin.unoproj | 10 ++++++++++ .../{Facebook.uxl => FacebookLogin/FacebookLogin.uxl} | 2 -- Samples/NativeFacebookLogin/FacebookLoginButton.uno | 8 ++++---- Samples/NativeFacebookLogin/README.md | 5 ++++- 7 files changed, 30 insertions(+), 15 deletions(-) create mode 100644 Samples/NativeFacebookLogin/FacebookAppId.uxl rename Samples/NativeFacebookLogin/{Facebook.unoproj => FacebookExample.unoproj} (79%) rename Samples/NativeFacebookLogin/{Facebook.uno => FacebookLogin/FacebookLogin.uno} (95%) create mode 100644 Samples/NativeFacebookLogin/FacebookLogin/FacebookLogin.unoproj rename Samples/NativeFacebookLogin/{Facebook.uxl => FacebookLogin/FacebookLogin.uxl} (97%) diff --git a/Samples/NativeFacebookLogin/FacebookAppId.uxl b/Samples/NativeFacebookLogin/FacebookAppId.uxl new file mode 100644 index 0000000..ced65ff --- /dev/null +++ b/Samples/NativeFacebookLogin/FacebookAppId.uxl @@ -0,0 +1,3 @@ + + + diff --git a/Samples/NativeFacebookLogin/Facebook.unoproj b/Samples/NativeFacebookLogin/FacebookExample.unoproj similarity index 79% rename from Samples/NativeFacebookLogin/Facebook.unoproj rename to Samples/NativeFacebookLogin/FacebookExample.unoproj index 6da78c8..c36a46c 100644 --- a/Samples/NativeFacebookLogin/Facebook.unoproj +++ b/Samples/NativeFacebookLogin/FacebookExample.unoproj @@ -11,13 +11,14 @@ } }, "Packages": [ - "Uno.Permissions", "Fuse", - "Fuse.Platform", + "Uno.Permissions", + ], + "Projects": [ + "FacebookLogin/FacebookLogin.unoproj", ], "Includes": [ - "Facebook.uno", - "Facebook.uxl", + "FacebookAppId.uxl", "FacebookLoginButton.uno", "MainView.ux", ], diff --git a/Samples/NativeFacebookLogin/Facebook.uno b/Samples/NativeFacebookLogin/FacebookLogin/FacebookLogin.uno similarity index 95% rename from Samples/NativeFacebookLogin/Facebook.uno rename to Samples/NativeFacebookLogin/FacebookLogin/FacebookLogin.uno index a620148..9e23e46 100644 --- a/Samples/NativeFacebookLogin/Facebook.uno +++ b/Samples/NativeFacebookLogin/FacebookLogin/FacebookLogin.uno @@ -15,9 +15,9 @@ using Uno.Compiler.ExportTargetInterop; [ForeignInclude(Language.Java, "com.facebook.appevents.AppEventsLogger")] [ForeignInclude(Language.Java, "com.facebook.login.*")] [ForeignInclude(Language.Java, "com.fuse.Activity")] -public class Facebook +public class FacebookLogin { - public Facebook() + public FacebookLogin() { Lifecycle.Started += Started; Lifecycle.EnteringInteractive += OnEnteringInteractive; @@ -40,7 +40,7 @@ public class Facebook @{ FacebookSdk.sdkInitialize(Activity.getRootActivity()); final CallbackManager callbackManager = CallbackManager.Factory.create(); - @{Facebook:Of(_this)._callbackManager:Set(callbackManager)}; + @{FacebookLogin:Of(_this)._callbackManager:Set(callbackManager)}; Activity.subscribeToResults(new Activity.ResultListener() { @Override @@ -148,7 +148,7 @@ public class Facebook [Require("Entity", "AccessToken(Java.Object)")] public extern(Android) void Login(Action onSuccess, Action onCancelled, Action onError) @{ - CallbackManager callbackManager = (CallbackManager)@{Facebook:Of(_this)._callbackManager:Get()}; + CallbackManager callbackManager = (CallbackManager)@{FacebookLogin:Of(_this)._callbackManager:Get()}; LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback() { diff --git a/Samples/NativeFacebookLogin/FacebookLogin/FacebookLogin.unoproj b/Samples/NativeFacebookLogin/FacebookLogin/FacebookLogin.unoproj new file mode 100644 index 0000000..960ed10 --- /dev/null +++ b/Samples/NativeFacebookLogin/FacebookLogin/FacebookLogin.unoproj @@ -0,0 +1,10 @@ +{ + "Packages": [ + "Fuse", + "Fuse.Platform", + ], + "Includes": [ + "FacebookLogin.uno", + "FacebookLogin.uxl", + ], +} diff --git a/Samples/NativeFacebookLogin/Facebook.uxl b/Samples/NativeFacebookLogin/FacebookLogin/FacebookLogin.uxl similarity index 97% rename from Samples/NativeFacebookLogin/Facebook.uxl rename to Samples/NativeFacebookLogin/FacebookLogin/FacebookLogin.uxl index c15f4c1..b93c3c1 100644 --- a/Samples/NativeFacebookLogin/Facebook.uxl +++ b/Samples/NativeFacebookLogin/FacebookLogin/FacebookLogin.uxl @@ -1,6 +1,4 @@ - - @(Facebook.AppID) diff --git a/Samples/NativeFacebookLogin/FacebookLoginButton.uno b/Samples/NativeFacebookLogin/FacebookLoginButton.uno index de5a731..76fdeed 100644 --- a/Samples/NativeFacebookLogin/FacebookLoginButton.uno +++ b/Samples/NativeFacebookLogin/FacebookLoginButton.uno @@ -4,11 +4,11 @@ using Fuse.Controls; public class FacebookLoginButton : Button { - Facebook _facebook; + FacebookLogin _facebookLogin; public FacebookLoginButton() : base() { - _facebook = new Facebook(); + _facebookLogin = new FacebookLogin(); Fuse.Gestures.Clicked.AddHandler(this, ClickHandler); } @@ -28,7 +28,7 @@ public class FacebookLoginButton : Button void Login() { - _facebook.Login(OnSuccess, OnCancelled, OnError); + _facebookLogin.Login(OnSuccess, OnCancelled, OnError); } extern(Android) void OnPermissionsPermitted(PlatformPermission p) @@ -36,7 +36,7 @@ public class FacebookLoginButton : Button Login(); } - void OnSuccess(Facebook.AccessToken token) + void OnSuccess(FacebookLogin.AccessToken token) { debug_log "Login successful"; } diff --git a/Samples/NativeFacebookLogin/README.md b/Samples/NativeFacebookLogin/README.md index 9afe09b..61cdbce 100644 --- a/Samples/NativeFacebookLogin/README.md +++ b/Samples/NativeFacebookLogin/README.md @@ -5,10 +5,13 @@ Facebook Android and iOS SDKs. It is part of the tutorial over at [https://www.fusetools.com/docs/native-interop/facebook-login](Fuse's docs page), so head over there if that's not where you came from! +The main login functionality is implemented in the `FacebookLogin` Uno project +in the `FacebookLogin` folder. + ## Setup You will need to [register for a Facebook App ID](https://developers.facebook.com/docs/apps/register) -and fill it in as `Facebook.AppID` in `Facebook.uxl`. +and fill it in as `Facebook.AppID` in `FacebookAppId.uxl`. ## Building From bd3488436a0815953692d12b9b6497192501e17c Mon Sep 17 00:00:00 2001 From: Olle Fredriksson Date: Tue, 28 Jun 2016 15:50:48 +0200 Subject: [PATCH 3/6] Make a NativeModule for FB login --- .../FacebookLogin/FacebookLogin.uno | 10 +-- .../FacebookLogin/FacebookLogin.unoproj | 6 ++ .../FacebookLogin/FacebookLoginModule.uno | 82 +++++++++++++++++++ .../FacebookLoginButton.uno | 58 ------------- ...e.unoproj => FacebookLoginExample.unoproj} | 1 - Samples/NativeFacebookLogin/MainView.ux | 23 +++++- 6 files changed, 112 insertions(+), 68 deletions(-) create mode 100644 Samples/NativeFacebookLogin/FacebookLogin/FacebookLoginModule.uno delete mode 100644 Samples/NativeFacebookLogin/FacebookLoginButton.uno rename Samples/NativeFacebookLogin/{FacebookExample.unoproj => FacebookLoginExample.unoproj} (92%) diff --git a/Samples/NativeFacebookLogin/FacebookLogin/FacebookLogin.uno b/Samples/NativeFacebookLogin/FacebookLogin/FacebookLogin.uno index 9e23e46..a95cd32 100644 --- a/Samples/NativeFacebookLogin/FacebookLogin/FacebookLogin.uno +++ b/Samples/NativeFacebookLogin/FacebookLogin/FacebookLogin.uno @@ -3,11 +3,11 @@ using Fuse.Platform; using Uno; using Uno.Compiler.ExportTargetInterop; -[Require("Xcode.FrameworkDirectory", "@('FacebookSDKs-iOS':Path)")] -[Require("Xcode.Framework", "@('FacebookSDKs-iOS/FBSDKCoreKit.framework':Path)")] -[Require("Xcode.Framework", "@('FacebookSDKs-iOS/FBSDKLoginKit.framework':Path)")] -[ForeignInclude(Language.ObjC, "FBSDKCoreKit/FBSDKCoreKit.h")] -[ForeignInclude(Language.ObjC, "FBSDKLoginKit/FBSDKLoginKit.h")] +[extern(iOS) Require("Xcode.FrameworkDirectory", "@('FacebookSDKs-iOS':Path)")] +[extern(iOS) Require("Xcode.Framework", "@('FacebookSDKs-iOS/FBSDKCoreKit.framework':Path)")] +[extern(iOS) Require("Xcode.Framework", "@('FacebookSDKs-iOS/FBSDKLoginKit.framework':Path)")] +[extern(iOS) ForeignInclude(Language.ObjC, "FBSDKCoreKit/FBSDKCoreKit.h")] +[extern(iOS) ForeignInclude(Language.ObjC, "FBSDKLoginKit/FBSDKLoginKit.h")] [Require("Gradle.Dependency","compile('com.facebook.android:facebook-android-sdk:4.8.+') { exclude module: 'support-v4' }")] [Require("Gradle.Repository","mavenCentral()")] [ForeignInclude(Language.Java, "android.content.Intent")] diff --git a/Samples/NativeFacebookLogin/FacebookLogin/FacebookLogin.unoproj b/Samples/NativeFacebookLogin/FacebookLogin/FacebookLogin.unoproj index 960ed10..7f3d8b9 100644 --- a/Samples/NativeFacebookLogin/FacebookLogin/FacebookLogin.unoproj +++ b/Samples/NativeFacebookLogin/FacebookLogin/FacebookLogin.unoproj @@ -1,10 +1,16 @@ { + "IsTransitive": true, "Packages": [ "Fuse", "Fuse.Platform", + "Fuse.Scripting", + "FuseJS", + "Uno.Permissions", + "Uno.Threading", ], "Includes": [ "FacebookLogin.uno", "FacebookLogin.uxl", + "FacebookLoginModule.uno", ], } diff --git a/Samples/NativeFacebookLogin/FacebookLogin/FacebookLoginModule.uno b/Samples/NativeFacebookLogin/FacebookLogin/FacebookLoginModule.uno new file mode 100644 index 0000000..c3eb52c --- /dev/null +++ b/Samples/NativeFacebookLogin/FacebookLogin/FacebookLoginModule.uno @@ -0,0 +1,82 @@ +using Fuse.Scripting; +using Uno.Permissions; +using Uno.Threading; +using Uno.UX; +using Uno; + +[UXGlobalModule] +public class FacebookLoginModule : NativeModule +{ + class FacebookLoginPromise : Promise + { + readonly FacebookLogin _facebookLogin; + + public FacebookLoginPromise(FacebookLogin facebookLogin) + { + _facebookLogin = facebookLogin; + if defined(Android) + { + Permissions.Request(Permissions.Android.INTERNET).Then( + OnPermissionsPermitted, + OnPermissionsRejected); + } + else + { + Login(); + } + } + + void Login() + { + if defined(iOS || Android) + _facebookLogin.Login(this.Resolve, OnCancelled, OnError); + else + throw new NotImplementedException(); + } + + void OnCancelled() + { + Reject(new Exception("Cancelled")); + } + + void OnError(string error) + { + Reject(new Exception(error)); + } + + extern(Android) void OnPermissionsPermitted(PlatformPermission p) + { + Login(); + } + + extern(Android) void OnPermissionsRejected(Exception e) + { + Reject(e); + } + } + + static readonly FacebookLoginModule _instance; + readonly FacebookLogin _facebookLogin; + + public FacebookLoginModule() + { + if (_instance != null) + return; + + _facebookLogin = new FacebookLogin(); + + _instance = this; + Resource.SetGlobalKey(_instance, "FacebookLogin"); + AddMember(new NativePromise("login", Login, Converter)); + } + + Future Login(object[] args) + { + return new FacebookLoginPromise(_facebookLogin); + } + + External Converter(Context context, FacebookLogin.AccessToken accessToken) + { + return new External(accessToken); + } +} diff --git a/Samples/NativeFacebookLogin/FacebookLoginButton.uno b/Samples/NativeFacebookLogin/FacebookLoginButton.uno deleted file mode 100644 index 76fdeed..0000000 --- a/Samples/NativeFacebookLogin/FacebookLoginButton.uno +++ /dev/null @@ -1,58 +0,0 @@ -using Uno; -using Uno.Permissions; -using Fuse.Controls; - -public class FacebookLoginButton : Button -{ - FacebookLogin _facebookLogin; - public FacebookLoginButton() - : base() - { - _facebookLogin = new FacebookLogin(); - Fuse.Gestures.Clicked.AddHandler(this, ClickHandler); - } - - public void ClickHandler(object x, object y) - { - if defined(Android) - { - Permissions.Request(Permissions.Android.INTERNET).Then( - OnPermissionsPermitted, - OnPermissionsRejected); - } - else - { - Login(); - } - } - - void Login() - { - _facebookLogin.Login(OnSuccess, OnCancelled, OnError); - } - - extern(Android) void OnPermissionsPermitted(PlatformPermission p) - { - Login(); - } - - void OnSuccess(FacebookLogin.AccessToken token) - { - debug_log "Login successful"; - } - - void OnCancelled() - { - debug_log "Login cancelled"; - } - - void OnError(string reason) - { - debug_log "Login failed: " + reason; - } - - extern(Android) void OnPermissionsRejected(Exception e) - { - debug_log "Permission rejected: " + e.Message; - } -} diff --git a/Samples/NativeFacebookLogin/FacebookExample.unoproj b/Samples/NativeFacebookLogin/FacebookLoginExample.unoproj similarity index 92% rename from Samples/NativeFacebookLogin/FacebookExample.unoproj rename to Samples/NativeFacebookLogin/FacebookLoginExample.unoproj index c36a46c..c9b975f 100644 --- a/Samples/NativeFacebookLogin/FacebookExample.unoproj +++ b/Samples/NativeFacebookLogin/FacebookLoginExample.unoproj @@ -19,7 +19,6 @@ ], "Includes": [ "FacebookAppId.uxl", - "FacebookLoginButton.uno", "MainView.ux", ], } diff --git a/Samples/NativeFacebookLogin/MainView.ux b/Samples/NativeFacebookLogin/MainView.ux index 3f61edd..2d1fed4 100644 --- a/Samples/NativeFacebookLogin/MainView.ux +++ b/Samples/NativeFacebookLogin/MainView.ux @@ -1,8 +1,23 @@ - + + var FacebookLogin = require("FacebookLogin"); + + function login() { + FacebookLogin.login().then(function(result) { + console.log("Login successful"); + }, function(err) { + console.log("Login failed: " + err); + }); + } + + module.exports = { + login: login, + }; + + + - - +