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/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..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; @@ -32,9 +33,17 @@ 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..b1e2aca5aaac 100644 --- a/packages/cloud_functions/ios/Classes/CloudFunctionsPlugin.m +++ b/packages/cloud_functions/ios/Classes/CloudFunctionsPlugin.m @@ -35,36 +35,46 @@ - (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] - 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"]; - } + NSString *appName = call.arguments[@"app"]; + NSString *region = call.arguments[@"region"]; + FIRApp *app = [FIRApp appNamed:appName]; + FIRFunctions *functions; + if (region != nil) { + functions = [FIRFunctions functionsForApp:app region:region]; + } else { + functions = [FIRFunctions functionsForApp: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"]; + } - 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:[NSString stringWithFormat:@"%ld", error.code] + 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 59c8e4501cd1..92ede2c33184 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'; @@ -19,6 +20,10 @@ 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'); @@ -26,6 +31,10 @@ class 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 +47,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/pubspec.yaml b/packages/cloud_functions/pubspec.yaml index 78ad901e200e..c7771c0df7fa 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 @@ -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" diff --git a/packages/cloud_functions/test/cloud_functions_test.dart b/packages/cloud_functions/test/cloud_functions_test.dart index 51bf3f0a1edc..8fc18cb6db65 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,8 @@ void main() { test('call', () async { await CloudFunctions.instance.call(functionName: 'baz'); - await CloudFunctions.instance + await CloudFunctions( + app: const FirebaseApp(name: '1337'), region: 'space') .call(functionName: 'qux', parameters: { 'quux': 'quuz', }); @@ -38,6 +40,8 @@ void main() { isMethodCall( 'CloudFunctions#call', arguments: { + 'app': '[DEFAULT]', + 'region': null, 'functionName': 'baz', 'parameters': null, }, @@ -45,6 +49,8 @@ void main() { isMethodCall( 'CloudFunctions#call', arguments: { + 'app': '1337', + 'region': 'space', 'functionName': 'qux', 'parameters': { 'quux': 'quuz',