From fd74e43484acd63982909a6e8a5f3a4159ca3023 Mon Sep 17 00:00:00 2001 From: Marcos Kobuchi Date: Tue, 26 May 2020 15:26:31 -0300 Subject: [PATCH] Upgrade plugin to use Android plugin API v2. --- .../FacebookLoginMethodCallHandler.java | 129 +++++++++++++++ .../facebooklogin/FacebookLoginPlugin.java | 148 ++++++------------ 2 files changed, 173 insertions(+), 104 deletions(-) create mode 100644 android/src/main/java/com/roughike/facebooklogin/facebooklogin/FacebookLoginMethodCallHandler.java diff --git a/android/src/main/java/com/roughike/facebooklogin/facebooklogin/FacebookLoginMethodCallHandler.java b/android/src/main/java/com/roughike/facebooklogin/facebooklogin/FacebookLoginMethodCallHandler.java new file mode 100644 index 0000000..26d2706 --- /dev/null +++ b/android/src/main/java/com/roughike/facebooklogin/facebooklogin/FacebookLoginMethodCallHandler.java @@ -0,0 +1,129 @@ +package com.roughike.facebooklogin.facebooklogin; + +import com.facebook.AccessToken; +import com.facebook.CallbackManager; +import com.facebook.login.LoginBehavior; +import com.facebook.login.LoginManager; + +import java.util.List; +import java.util.Map; + +import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding; +import io.flutter.plugin.common.MethodCall; +import io.flutter.plugin.common.MethodChannel; +import io.flutter.plugin.common.MethodChannel.Result; +import io.flutter.plugin.common.PluginRegistry.Registrar; + +public class FacebookLoginMethodCallHandler implements MethodChannel.MethodCallHandler { + + private static final String ERROR_UNKNOWN_LOGIN_BEHAVIOR = "unknown_login_behavior"; + + private static final String METHOD_LOG_IN = "logIn"; + private static final String METHOD_LOG_OUT = "logOut"; + private static final String METHOD_GET_CURRENT_ACCESS_TOKEN = "getCurrentAccessToken"; + + private static final String ARG_LOGIN_BEHAVIOR = "behavior"; + private static final String ARG_PERMISSIONS = "permissions"; + + private static final String LOGIN_BEHAVIOR_NATIVE_WITH_FALLBACK = "nativeWithFallback"; + private static final String LOGIN_BEHAVIOR_NATIVE_ONLY = "nativeOnly"; + private static final String LOGIN_BEHAVIOR_WEB_ONLY = "webOnly"; + private static final String LOGIN_BEHAVIOR_WEB_VIEW_ONLY = "webViewOnly"; + + private final FacebookSignInDelegate delegate; + + static Registrar registrar; + static ActivityPluginBinding binding; + + FacebookLoginMethodCallHandler() { + delegate = new FacebookLoginMethodCallHandler.FacebookSignInDelegate(); + } + + @Override + public void onMethodCall(MethodCall call, Result result) { + String loginBehaviorStr; + LoginBehavior loginBehavior; + + switch (call.method) { + case METHOD_LOG_IN: + loginBehaviorStr = call.argument(ARG_LOGIN_BEHAVIOR); + loginBehavior = loginBehaviorFromString(loginBehaviorStr, result); + List permissions = call.argument(ARG_PERMISSIONS); + + delegate.logIn(loginBehavior, permissions, result); + break; + case METHOD_LOG_OUT: + delegate.logOut(result); + break; + case METHOD_GET_CURRENT_ACCESS_TOKEN: + delegate.getCurrentAccessToken(result); + break; + default: + result.notImplemented(); + break; + } + } + + private LoginBehavior loginBehaviorFromString(String loginBehavior, Result result) { + switch (loginBehavior) { + case LOGIN_BEHAVIOR_NATIVE_WITH_FALLBACK: + return LoginBehavior.NATIVE_WITH_FALLBACK; + case LOGIN_BEHAVIOR_NATIVE_ONLY: + return LoginBehavior.NATIVE_ONLY; + case LOGIN_BEHAVIOR_WEB_ONLY: + return LoginBehavior.WEB_ONLY; + case LOGIN_BEHAVIOR_WEB_VIEW_ONLY: + return LoginBehavior.WEB_VIEW_ONLY; + default: + result.error( + ERROR_UNKNOWN_LOGIN_BEHAVIOR, + "setLoginBehavior called with unknown login behavior: " + + loginBehavior, + null + ); + return null; + } + } + + public static final class FacebookSignInDelegate { + + private final CallbackManager callbackManager; + private final LoginManager loginManager; + private final FacebookLoginResultDelegate resultDelegate; + + public FacebookSignInDelegate() { + this.callbackManager = CallbackManager.Factory.create(); + this.loginManager = LoginManager.getInstance(); + this.resultDelegate = new FacebookLoginResultDelegate(callbackManager); + + loginManager.registerCallback(callbackManager, resultDelegate); + } + + public void logIn( + LoginBehavior loginBehavior, List permissions, Result result) { + resultDelegate.setPendingResult(METHOD_LOG_IN, result); + + loginManager.setLoginBehavior(loginBehavior); + if (registrar != null) { + registrar.addActivityResultListener(resultDelegate); + loginManager.logIn(registrar.activity(), permissions); + } else if (binding != null) { + binding.addActivityResultListener(resultDelegate); + loginManager.logIn(binding.getActivity(), permissions); + } + } + + public void logOut(Result result) { + loginManager.logOut(); + result.success(null); + } + + public void getCurrentAccessToken(Result result) { + AccessToken accessToken = AccessToken.getCurrentAccessToken(); + Map tokenMap = FacebookLoginResults.accessToken(accessToken); + + result.success(tokenMap); + } + } + +} diff --git a/android/src/main/java/com/roughike/facebooklogin/facebooklogin/FacebookLoginPlugin.java b/android/src/main/java/com/roughike/facebooklogin/facebooklogin/FacebookLoginPlugin.java index 7ca10aa..343dd88 100644 --- a/android/src/main/java/com/roughike/facebooklogin/facebooklogin/FacebookLoginPlugin.java +++ b/android/src/main/java/com/roughike/facebooklogin/facebooklogin/FacebookLoginPlugin.java @@ -1,128 +1,68 @@ package com.roughike.facebooklogin.facebooklogin; -import com.facebook.AccessToken; -import com.facebook.CallbackManager; -import com.facebook.login.LoginBehavior; -import com.facebook.login.LoginManager; +import androidx.annotation.NonNull; -import java.util.List; -import java.util.Map; - -import io.flutter.plugin.common.MethodCall; +import io.flutter.embedding.engine.plugins.FlutterPlugin; +import io.flutter.embedding.engine.plugins.activity.ActivityAware; +import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding; +import io.flutter.plugin.common.BinaryMessenger; import io.flutter.plugin.common.MethodChannel; -import io.flutter.plugin.common.MethodChannel.MethodCallHandler; -import io.flutter.plugin.common.MethodChannel.Result; import io.flutter.plugin.common.PluginRegistry.Registrar; -public class FacebookLoginPlugin implements MethodCallHandler { +public class FacebookLoginPlugin implements FlutterPlugin, ActivityAware { private static final String CHANNEL_NAME = "com.roughike/flutter_facebook_login"; - private static final String ERROR_UNKNOWN_LOGIN_BEHAVIOR = "unknown_login_behavior"; - - private static final String METHOD_LOG_IN = "logIn"; - private static final String METHOD_LOG_OUT = "logOut"; - private static final String METHOD_GET_CURRENT_ACCESS_TOKEN = "getCurrentAccessToken"; - - private static final String ARG_LOGIN_BEHAVIOR = "behavior"; - private static final String ARG_PERMISSIONS = "permissions"; - - private static final String LOGIN_BEHAVIOR_NATIVE_WITH_FALLBACK = "nativeWithFallback"; - private static final String LOGIN_BEHAVIOR_NATIVE_ONLY = "nativeOnly"; - private static final String LOGIN_BEHAVIOR_WEB_ONLY = "webOnly"; - private static final String LOGIN_BEHAVIOR_WEB_VIEW_ONLY = "webViewOnly"; - - private final FacebookSignInDelegate delegate; - - private FacebookLoginPlugin(Registrar registrar) { - delegate = new FacebookSignInDelegate(registrar); - } + private MethodChannel channel; + private FacebookLoginMethodCallHandler handler; + /* -------------- Old API Behaviour -------------- */ public static void registerWith(Registrar registrar) { - final FacebookLoginPlugin plugin = new FacebookLoginPlugin(registrar); - final MethodChannel channel = new MethodChannel(registrar.messenger(), CHANNEL_NAME); - channel.setMethodCallHandler(plugin); + final FacebookLoginPlugin plugin = new FacebookLoginPlugin(); + plugin.setupChannel(registrar.messenger(), registrar); } + /* ----------- FlutterPlugin Behaviour ----------- */ @Override - public void onMethodCall(MethodCall call, Result result) { - String loginBehaviorStr; - LoginBehavior loginBehavior; - - switch (call.method) { - case METHOD_LOG_IN: - loginBehaviorStr = call.argument(ARG_LOGIN_BEHAVIOR); - loginBehavior = loginBehaviorFromString(loginBehaviorStr, result); - List permissions = call.argument(ARG_PERMISSIONS); - - delegate.logIn(loginBehavior, permissions, result); - break; - case METHOD_LOG_OUT: - delegate.logOut(result); - break; - case METHOD_GET_CURRENT_ACCESS_TOKEN: - delegate.getCurrentAccessToken(result); - break; - default: - result.notImplemented(); - break; - } + public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) { + setupChannel(binding.getBinaryMessenger(), null); } - private LoginBehavior loginBehaviorFromString(String loginBehavior, Result result) { - switch (loginBehavior) { - case LOGIN_BEHAVIOR_NATIVE_WITH_FALLBACK: - return LoginBehavior.NATIVE_WITH_FALLBACK; - case LOGIN_BEHAVIOR_NATIVE_ONLY: - return LoginBehavior.NATIVE_ONLY; - case LOGIN_BEHAVIOR_WEB_ONLY: - return LoginBehavior.WEB_ONLY; - case LOGIN_BEHAVIOR_WEB_VIEW_ONLY: - return LoginBehavior.WEB_VIEW_ONLY; - default: - result.error( - ERROR_UNKNOWN_LOGIN_BEHAVIOR, - "setLoginBehavior called with unknown login behavior: " - + loginBehavior, - null - ); - return null; - } + @Override + public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) { + teardownChannel(); } - public static final class FacebookSignInDelegate { - private final Registrar registrar; - private final CallbackManager callbackManager; - private final LoginManager loginManager; - private final FacebookLoginResultDelegate resultDelegate; - - public FacebookSignInDelegate(Registrar registrar) { - this.registrar = registrar; - this.callbackManager = CallbackManager.Factory.create(); - this.loginManager = LoginManager.getInstance(); - this.resultDelegate = new FacebookLoginResultDelegate(callbackManager); - - loginManager.registerCallback(callbackManager, resultDelegate); - registrar.addActivityResultListener(resultDelegate); - } + private void setupChannel(BinaryMessenger messenger, Registrar registrar) { + FacebookLoginMethodCallHandler.registrar = registrar; + handler = new FacebookLoginMethodCallHandler(); + channel = new MethodChannel(messenger, CHANNEL_NAME); + channel.setMethodCallHandler(handler); + } - public void logIn( - LoginBehavior loginBehavior, List permissions, Result result) { - resultDelegate.setPendingResult(METHOD_LOG_IN, result); + private void teardownChannel() { + channel.setMethodCallHandler(null); + channel = null; + } - loginManager.setLoginBehavior(loginBehavior); - loginManager.logIn(registrar.activity(), permissions); - } + /* ----------- ActivityAware Behaviour ----------- */ + @Override + public void onAttachedToActivity(@NonNull ActivityPluginBinding binding) { + FacebookLoginMethodCallHandler.binding = binding; + } - public void logOut(Result result) { - loginManager.logOut(); - result.success(null); - } + @Override + public void onDetachedFromActivityForConfigChanges() { + FacebookLoginMethodCallHandler.binding = null; + } - public void getCurrentAccessToken(Result result) { - AccessToken accessToken = AccessToken.getCurrentAccessToken(); - Map tokenMap = FacebookLoginResults.accessToken(accessToken); + @Override + public void onReattachedToActivityForConfigChanges(@NonNull ActivityPluginBinding binding) { + FacebookLoginMethodCallHandler.binding = binding; + } - result.success(tokenMap); - } + @Override + public void onDetachedFromActivity() { + FacebookLoginMethodCallHandler.binding = null; } + }