From 370b5ac161e2d6fb21041de5b1c4692ec39c15ca Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Wed, 13 Feb 2019 10:32:03 -0800 Subject: [PATCH 1/8] cloud functions multiple app support --- .../cloudfunctions/CloudFunctionsPlugin.java | 13 +++++++++++-- .../ios/Classes/CloudFunctionsPlugin.m | 11 ++++++++++- packages/cloud_functions/lib/cloud_functions.dart | 10 ++++++++++ .../cloud_functions/test/cloud_functions_test.dart | 5 ++++- 4 files changed, 35 insertions(+), 4 deletions(-) diff --git a/packages/cloud_functions/android/src/main/java/io/flutter/plugins/firebase/cloudfunctions/cloudfunctions/CloudFunctionsPlugin.java b/packages/cloud_functions/android/src/main/java/io/flutter/plugins/firebase/cloudfunctions/cloudfunctions/CloudFunctionsPlugin.java index 2851480bfb1a..1c7b082d2c7e 100644 --- a/packages/cloud_functions/android/src/main/java/io/flutter/plugins/firebase/cloudfunctions/cloudfunctions/CloudFunctionsPlugin.java +++ b/packages/cloud_functions/android/src/main/java/io/flutter/plugins/firebase/cloudfunctions/cloudfunctions/CloudFunctionsPlugin.java @@ -32,9 +32,18 @@ public void onMethodCall(MethodCall call, final Result result) { switch (call.method) { case "CloudFunctions#call": String functionName = call.argument("functionName"); - HttpsCallableReference httpsCallableReference = - FirebaseFunctions.getInstance().getHttpsCallable(functionName); Map parameters = call.argument("parameters"); + String appName = call.argument("app"); + FirebaseApp app = FirebaseApp.getInstance(appName); + String region = call.argument("region"); + FirebaseFunctions functions; + if (region != null) { + functions = FirebaseFunctions.getInstance(app, region); + } else { + functions = FirebaseFunctions.getInstance(app); + } + HttpsCallableReference httpsCallableReference = + functions.getHttpsCallable(functionName); httpsCallableReference .call(parameters) .addOnCompleteListener( diff --git a/packages/cloud_functions/ios/Classes/CloudFunctionsPlugin.m b/packages/cloud_functions/ios/Classes/CloudFunctionsPlugin.m index 701c5efb3466..63a0429a870d 100644 --- a/packages/cloud_functions/ios/Classes/CloudFunctionsPlugin.m +++ b/packages/cloud_functions/ios/Classes/CloudFunctionsPlugin.m @@ -35,7 +35,16 @@ - (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result if ([@"CloudFunctions#call" isEqualToString:call.method]) { NSString *functionName = call.arguments[@"functionName"]; NSObject *parameters = call.arguments[@"parameters"]; - [[FIRFunctions functions] + NSString *appName = call.arguments[@"app"]; + NSString *region = call.arguments[@"region"]; + FirebaseApp *app = [FirebaseApp appWithName:appName]; + FIRFunctions *functions; + if (region != nil) { + functions = [FIRFunctions functionsWithApp:app region:region]; + } else { + functions = [FIRFunctions functionsWithApp:app]; + } + [functions callFunction:functionName withObject:parameters completion:^(FIRHTTPSCallableResult *callableResult, NSError *error) { diff --git a/packages/cloud_functions/lib/cloud_functions.dart b/packages/cloud_functions/lib/cloud_functions.dart index 59c8e4501cd1..eccbf7c89931 100644 --- a/packages/cloud_functions/lib/cloud_functions.dart +++ b/packages/cloud_functions/lib/cloud_functions.dart @@ -4,6 +4,7 @@ import 'dart:async'; +import 'package:firebase_core/firebase_core.dart'; import 'package:flutter/services.dart'; import 'package:meta/meta.dart'; @@ -22,10 +23,17 @@ class CloudFunctions { @visibleForTesting static const MethodChannel channel = MethodChannel('cloud_functions'); + CloudFunctions({FirebaseApp app, String region}) + : _app = app ?? FirebaseApp.instance, _region = region; + static CloudFunctions _instance = CloudFunctions(); static CloudFunctions get instance => _instance; + final FirebaseApp _app; + + final String _region; + /// Executes this Callable HTTPS trigger asynchronously. /// /// @param functionName The name of the callable function being triggered. @@ -38,6 +46,8 @@ class CloudFunctions { // https://github.com/flutter/flutter/issues/26431 // ignore: strong_mode_implicit_dynamic_method await channel.invokeMethod('CloudFunctions#call', { + 'app': _app.name, + 'region': _region, 'functionName': functionName, 'parameters': parameters, }); diff --git a/packages/cloud_functions/test/cloud_functions_test.dart b/packages/cloud_functions/test/cloud_functions_test.dart index 51bf3f0a1edc..a33e64d7a464 100644 --- a/packages/cloud_functions/test/cloud_functions_test.dart +++ b/packages/cloud_functions/test/cloud_functions_test.dart @@ -3,6 +3,7 @@ // BSD-style license that can be found in the LICENSE file. import 'package:cloud_functions/cloud_functions.dart'; +import 'package:firebase_core/firebase_core.dart'; import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; @@ -28,7 +29,7 @@ void main() { test('call', () async { await CloudFunctions.instance.call(functionName: 'baz'); - await CloudFunctions.instance + await CloudFunctions(app: FirebaseApp(name: '1337')) .call(functionName: 'qux', parameters: { 'quux': 'quuz', }); @@ -38,6 +39,7 @@ void main() { isMethodCall( 'CloudFunctions#call', arguments: { + 'app': '[DEFAULT]', 'functionName': 'baz', 'parameters': null, }, @@ -45,6 +47,7 @@ void main() { isMethodCall( 'CloudFunctions#call', arguments: { + 'app': '1337', 'functionName': 'qux', 'parameters': { 'quux': 'quuz', From d275c7349feec2f0cb177d377847b1de598daba9 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Wed, 13 Feb 2019 11:45:22 -0800 Subject: [PATCH 2/8] Update CHANGELOG and pubspec.yaml for publishing --- packages/cloud_functions/CHANGELOG.md | 4 ++++ packages/cloud_functions/pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/cloud_functions/CHANGELOG.md b/packages/cloud_functions/CHANGELOG.md index 109160f13283..84d237dea5ed 100644 --- a/packages/cloud_functions/CHANGELOG.md +++ b/packages/cloud_functions/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.1.1 + +* Support for regions and multiple apps + ## 0.1.0+1 * Log a more detailed warning at build time about the previous AndroidX diff --git a/packages/cloud_functions/pubspec.yaml b/packages/cloud_functions/pubspec.yaml index 78ad901e200e..14956828efad 100644 --- a/packages/cloud_functions/pubspec.yaml +++ b/packages/cloud_functions/pubspec.yaml @@ -1,6 +1,6 @@ name: cloud_functions description: Flutter plugin for Cloud Functions. -version: 0.1.0+1 +version: 0.1.1 author: Flutter Team homepage: https://github.com/flutter/plugins/tree/master/packages/cloud_functions From 95cf9cb9ae6c6d55e7564559a963177321309a43 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Wed, 13 Feb 2019 12:04:53 -0800 Subject: [PATCH 3/8] Reformat --- .../cloudfunctions/CloudFunctionsPlugin.java | 3 +- .../ios/Classes/CloudFunctionsPlugin.m | 58 +++++++++---------- .../cloud_functions/lib/cloud_functions.dart | 7 ++- 3 files changed, 34 insertions(+), 34 deletions(-) diff --git a/packages/cloud_functions/android/src/main/java/io/flutter/plugins/firebase/cloudfunctions/cloudfunctions/CloudFunctionsPlugin.java b/packages/cloud_functions/android/src/main/java/io/flutter/plugins/firebase/cloudfunctions/cloudfunctions/CloudFunctionsPlugin.java index 1c7b082d2c7e..f48d8fb68f35 100644 --- a/packages/cloud_functions/android/src/main/java/io/flutter/plugins/firebase/cloudfunctions/cloudfunctions/CloudFunctionsPlugin.java +++ b/packages/cloud_functions/android/src/main/java/io/flutter/plugins/firebase/cloudfunctions/cloudfunctions/CloudFunctionsPlugin.java @@ -42,8 +42,7 @@ public void onMethodCall(MethodCall call, final Result result) { } else { functions = FirebaseFunctions.getInstance(app); } - HttpsCallableReference httpsCallableReference = - functions.getHttpsCallable(functionName); + HttpsCallableReference httpsCallableReference = functions.getHttpsCallable(functionName); httpsCallableReference .call(parameters) .addOnCompleteListener( diff --git a/packages/cloud_functions/ios/Classes/CloudFunctionsPlugin.m b/packages/cloud_functions/ios/Classes/CloudFunctionsPlugin.m index 63a0429a870d..660c9f1e4f9e 100644 --- a/packages/cloud_functions/ios/Classes/CloudFunctionsPlugin.m +++ b/packages/cloud_functions/ios/Classes/CloudFunctionsPlugin.m @@ -44,36 +44,36 @@ - (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result } else { functions = [FIRFunctions functionsWithApp:app]; } - [functions - callFunction:functionName - withObject:parameters - completion:^(FIRHTTPSCallableResult *callableResult, NSError *error) { - if (error) { - FlutterError *flutterError; - if (error.domain == FIRFunctionsErrorDomain) { - NSDictionary *details = [NSMutableDictionary dictionary]; - [details setValue:[self mapFunctionsErrorCodes:error.code] forKey:@"code"]; - if (error.localizedDescription != nil) { - [details setValue:error.localizedDescription forKey:@"message"]; - } - if (error.userInfo[FIRFunctionsErrorDetailsKey] != nil) { - [details setValue:error.userInfo[FIRFunctionsErrorDetailsKey] forKey:@"details"]; - } + [functions callFunction:functionName + withObject:parameters + completion:^(FIRHTTPSCallableResult *callableResult, NSError *error) { + if (error) { + FlutterError *flutterError; + if (error.domain == FIRFunctionsErrorDomain) { + NSDictionary *details = [NSMutableDictionary dictionary]; + [details setValue:[self mapFunctionsErrorCodes:error.code] forKey:@"code"]; + if (error.localizedDescription != nil) { + [details setValue:error.localizedDescription forKey:@"message"]; + } + if (error.userInfo[FIRFunctionsErrorDetailsKey] != nil) { + [details setValue:error.userInfo[FIRFunctionsErrorDetailsKey] + forKey:@"details"]; + } - flutterError = - [FlutterError errorWithCode:@"functionsError" - message:@"Firebase function failed with exception." - details:details]; - } else { - flutterError = [FlutterError errorWithCode:nil - message:error.localizedDescription - details:nil]; - } - result(flutterError); - } else { - result(callableResult.data); - } - }]; + flutterError = + [FlutterError errorWithCode:@"functionsError" + message:@"Firebase function failed with exception." + details:details]; + } else { + flutterError = [FlutterError errorWithCode:nil + message:error.localizedDescription + details:nil]; + } + result(flutterError); + } else { + result(callableResult.data); + } + }]; } else { result(FlutterMethodNotImplemented); } diff --git a/packages/cloud_functions/lib/cloud_functions.dart b/packages/cloud_functions/lib/cloud_functions.dart index eccbf7c89931..92ede2c33184 100644 --- a/packages/cloud_functions/lib/cloud_functions.dart +++ b/packages/cloud_functions/lib/cloud_functions.dart @@ -20,12 +20,13 @@ class CloudFunctionsException implements Exception { /// /// You can get an instance by calling [CloudFunctions.instance]. class CloudFunctions { + CloudFunctions({FirebaseApp app, String region}) + : _app = app ?? FirebaseApp.instance, + _region = region; + @visibleForTesting static const MethodChannel channel = MethodChannel('cloud_functions'); - CloudFunctions({FirebaseApp app, String region}) - : _app = app ?? FirebaseApp.instance, _region = region; - static CloudFunctions _instance = CloudFunctions(); static CloudFunctions get instance => _instance; From 3ea42ee20758a6cf9bb0164753df6bc4afb8059e Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Wed, 13 Feb 2019 12:04:57 -0800 Subject: [PATCH 4/8] Fix test --- packages/cloud_functions/test/cloud_functions_test.dart | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/cloud_functions/test/cloud_functions_test.dart b/packages/cloud_functions/test/cloud_functions_test.dart index a33e64d7a464..aafd3f8acbdf 100644 --- a/packages/cloud_functions/test/cloud_functions_test.dart +++ b/packages/cloud_functions/test/cloud_functions_test.dart @@ -29,7 +29,7 @@ void main() { test('call', () async { await CloudFunctions.instance.call(functionName: 'baz'); - await CloudFunctions(app: FirebaseApp(name: '1337')) + await CloudFunctions(app: const FirebaseApp(name: '1337'), region: 'space') .call(functionName: 'qux', parameters: { 'quux': 'quuz', }); @@ -40,6 +40,7 @@ void main() { 'CloudFunctions#call', arguments: { 'app': '[DEFAULT]', + 'region': null, 'functionName': 'baz', 'parameters': null, }, @@ -48,6 +49,7 @@ void main() { 'CloudFunctions#call', arguments: { 'app': '1337', + 'region': 'space', 'functionName': 'qux', 'parameters': { 'quux': 'quuz', From face804a31e37d71efa1f5b9182d345d224556ce Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Wed, 13 Feb 2019 12:10:51 -0800 Subject: [PATCH 5/8] Fix errors in iOS code --- .../ios/Classes/CloudFunctionsPlugin.m | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/packages/cloud_functions/ios/Classes/CloudFunctionsPlugin.m b/packages/cloud_functions/ios/Classes/CloudFunctionsPlugin.m index 660c9f1e4f9e..b1e2aca5aaac 100644 --- a/packages/cloud_functions/ios/Classes/CloudFunctionsPlugin.m +++ b/packages/cloud_functions/ios/Classes/CloudFunctionsPlugin.m @@ -37,12 +37,12 @@ - (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result NSObject *parameters = call.arguments[@"parameters"]; NSString *appName = call.arguments[@"app"]; NSString *region = call.arguments[@"region"]; - FirebaseApp *app = [FirebaseApp appWithName:appName]; + FIRApp *app = [FIRApp appNamed:appName]; FIRFunctions *functions; if (region != nil) { - functions = [FIRFunctions functionsWithApp:app region:region]; + functions = [FIRFunctions functionsForApp:app region:region]; } else { - functions = [FIRFunctions functionsWithApp:app]; + functions = [FIRFunctions functionsForApp:app]; } [functions callFunction:functionName withObject:parameters @@ -65,9 +65,10 @@ - (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result message:@"Firebase function failed with exception." details:details]; } else { - flutterError = [FlutterError errorWithCode:nil - message:error.localizedDescription - details:nil]; + flutterError = [FlutterError + errorWithCode:[NSString stringWithFormat:@"%ld", error.code] + message:error.localizedDescription + details:nil]; } result(flutterError); } else { From 1428c9a57367df0b45e1628ed10e8d983c6fc57f Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Wed, 13 Feb 2019 12:14:40 -0800 Subject: [PATCH 6/8] reformat --- packages/cloud_functions/test/cloud_functions_test.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/cloud_functions/test/cloud_functions_test.dart b/packages/cloud_functions/test/cloud_functions_test.dart index aafd3f8acbdf..8fc18cb6db65 100644 --- a/packages/cloud_functions/test/cloud_functions_test.dart +++ b/packages/cloud_functions/test/cloud_functions_test.dart @@ -29,7 +29,8 @@ void main() { test('call', () async { await CloudFunctions.instance.call(functionName: 'baz'); - await CloudFunctions(app: const FirebaseApp(name: '1337'), region: 'space') + await CloudFunctions( + app: const FirebaseApp(name: '1337'), region: 'space') .call(functionName: 'qux', parameters: { 'quux': 'quuz', }); From 1656d4d4bbd5dc604f9a296b38b399434731773e Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Wed, 13 Feb 2019 14:27:27 -0800 Subject: [PATCH 7/8] Add missing import --- .../cloudfunctions/cloudfunctions/CloudFunctionsPlugin.java | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/cloud_functions/android/src/main/java/io/flutter/plugins/firebase/cloudfunctions/cloudfunctions/CloudFunctionsPlugin.java b/packages/cloud_functions/android/src/main/java/io/flutter/plugins/firebase/cloudfunctions/cloudfunctions/CloudFunctionsPlugin.java index f48d8fb68f35..c9d0da6026e6 100644 --- a/packages/cloud_functions/android/src/main/java/io/flutter/plugins/firebase/cloudfunctions/cloudfunctions/CloudFunctionsPlugin.java +++ b/packages/cloud_functions/android/src/main/java/io/flutter/plugins/firebase/cloudfunctions/cloudfunctions/CloudFunctionsPlugin.java @@ -7,6 +7,7 @@ import androidx.annotation.NonNull; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.Task; +import com.google.firebase.FirebaseApp; import com.google.firebase.functions.FirebaseFunctions; import com.google.firebase.functions.FirebaseFunctionsException; import com.google.firebase.functions.HttpsCallableReference; From f55f6f43d85261bc4cbb13f3c40f8eee80164ff8 Mon Sep 17 00:00:00 2001 From: Collin Jackson Date: Thu, 21 Feb 2019 08:06:43 -0800 Subject: [PATCH 8/8] update dependency --- packages/cloud_functions/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cloud_functions/pubspec.yaml b/packages/cloud_functions/pubspec.yaml index 14956828efad..c7771c0df7fa 100644 --- a/packages/cloud_functions/pubspec.yaml +++ b/packages/cloud_functions/pubspec.yaml @@ -13,11 +13,11 @@ dependencies: meta: ^1.1.6 flutter: sdk: flutter + firebase_core: ^0.3.0 dev_dependencies: flutter_test: sdk: flutter - firebase_core: ^0.3.0 environment: sdk: ">=2.0.0-dev.28.0 <3.0.0"