From e75d134faef2cbf156d8936fa3f1c8c69cd59ec2 Mon Sep 17 00:00:00 2001 From: Russell Wheatley Date: Tue, 23 Apr 2024 10:11:45 +0100 Subject: [PATCH] fix(storage): pass StorageMetadata as nullable for `putFile()` API. Metadata ought to be inferred from File. (#12612) --- .../storage/FlutterFirebaseStoragePlugin.java | 8 +++++--- .../storage/GeneratedAndroidFirebaseStorage.java | 2 +- .../ios/Classes/FLTFirebaseStoragePlugin.m | 10 +++++++--- .../ios/Classes/firebase_storage_messages.g.h | 2 +- .../windows/firebase_storage_plugin.cpp | 2 +- .../windows/firebase_storage_plugin.h | 2 +- .../firebase_storage/windows/messages.g.cpp | 10 +++------- .../firebase_storage/windows/messages.g.h | 2 +- .../lib/src/method_channel/method_channel_task.dart | 4 +++- .../lib/src/pigeon/messages.pigeon.dart | 2 +- .../pigeons/messages.dart | 2 +- .../test/pigeon/test_api.dart | 12 +++--------- .../firebase_storage/reference_e2e.dart | 8 ++++++++ tests/ios/Runner.xcodeproj/project.pbxproj | 2 +- 14 files changed, 37 insertions(+), 31 deletions(-) diff --git a/packages/firebase_storage/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/FlutterFirebaseStoragePlugin.java b/packages/firebase_storage/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/FlutterFirebaseStoragePlugin.java index 60dbe9c7ca1e..732e15c5ea33 100755 --- a/packages/firebase_storage/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/FlutterFirebaseStoragePlugin.java +++ b/packages/firebase_storage/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/FlutterFirebaseStoragePlugin.java @@ -493,16 +493,18 @@ public void referencePutFile( @NonNull GeneratedAndroidFirebaseStorage.PigeonStorageFirebaseApp app, @NonNull GeneratedAndroidFirebaseStorage.PigeonStorageReference reference, @NonNull String filePath, - @NonNull GeneratedAndroidFirebaseStorage.PigeonSettableMetadata settableMetaData, + @Nullable GeneratedAndroidFirebaseStorage.PigeonSettableMetadata settableMetaData, @NonNull Long handle, @NonNull GeneratedAndroidFirebaseStorage.Result result) { StorageReference androidReference = getReferenceFromPigeon(app, reference); - StorageMetadata androidMetaData = getMetaDataFromPigeon(settableMetaData); FlutterFirebaseStorageTask storageTask = FlutterFirebaseStorageTask.uploadFile( - handle.intValue(), androidReference, Uri.fromFile(new File(filePath)), androidMetaData); + handle.intValue(), + androidReference, + Uri.fromFile(new File(filePath)), + settableMetaData == null ? null : getMetaDataFromPigeon(settableMetaData)); try { TaskStateChannelStreamHandler handler = storageTask.startTaskWithMethodChannel(channel); diff --git a/packages/firebase_storage/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/GeneratedAndroidFirebaseStorage.java b/packages/firebase_storage/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/GeneratedAndroidFirebaseStorage.java index f497b3f7ebd4..d3a167febc03 100644 --- a/packages/firebase_storage/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/GeneratedAndroidFirebaseStorage.java +++ b/packages/firebase_storage/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/GeneratedAndroidFirebaseStorage.java @@ -796,7 +796,7 @@ void referencePutFile( @NonNull PigeonStorageFirebaseApp app, @NonNull PigeonStorageReference reference, @NonNull String filePath, - @NonNull PigeonSettableMetadata settableMetaData, + @Nullable PigeonSettableMetadata settableMetaData, @NonNull Long handle, @NonNull Result result); diff --git a/packages/firebase_storage/firebase_storage/ios/Classes/FLTFirebaseStoragePlugin.m b/packages/firebase_storage/firebase_storage/ios/Classes/FLTFirebaseStoragePlugin.m index 59fa5223b352..2bafb113cb81 100644 --- a/packages/firebase_storage/firebase_storage/ios/Classes/FLTFirebaseStoragePlugin.m +++ b/packages/firebase_storage/firebase_storage/ios/Classes/FLTFirebaseStoragePlugin.m @@ -452,11 +452,15 @@ - (void)referencePutFileApp:(PigeonStorageFirebaseApp *)app completion:(void (^)(NSString *_Nullable, FlutterError *_Nullable))completion { FIRStorageReference *storage_reference = [self getFIRStorageReferenceFromPigeon:app reference:reference]; - FIRStorageMetadata *metadata = [self getFIRStorageMetadataFromPigeon:settableMetaData]; NSURL *fileUrl = [NSURL fileURLWithPath:filePath]; - FIRStorageObservableTask *task = [storage_reference putFile:fileUrl - metadata:metadata]; + FIRStorageObservableTask *task; + if (settableMetaData == nil) { + task = [storage_reference putFile:fileUrl]; + } else { + FIRStorageMetadata *metadata = [self getFIRStorageMetadataFromPigeon:settableMetaData]; + task = [storage_reference putFile:fileUrl metadata:metadata]; + } @synchronized(self->_tasks) { self->_tasks[handle] = task; diff --git a/packages/firebase_storage/firebase_storage/ios/Classes/firebase_storage_messages.g.h b/packages/firebase_storage/firebase_storage/ios/Classes/firebase_storage_messages.g.h index 0eccf505fa24..451ee2320ce8 100644 --- a/packages/firebase_storage/firebase_storage/ios/Classes/firebase_storage_messages.g.h +++ b/packages/firebase_storage/firebase_storage/ios/Classes/firebase_storage_messages.g.h @@ -187,7 +187,7 @@ NSObject *FirebaseStorageHostApiGetCodec(void); - (void)referencePutFileApp:(PigeonStorageFirebaseApp *)app reference:(PigeonStorageReference *)reference filePath:(NSString *)filePath - settableMetaData:(PigeonSettableMetadata *)settableMetaData + settableMetaData:(nullable PigeonSettableMetadata *)settableMetaData handle:(NSNumber *)handle completion:(void (^)(NSString *_Nullable, FlutterError *_Nullable))completion; - (void)referenceDownloadFileApp:(PigeonStorageFirebaseApp *)app diff --git a/packages/firebase_storage/firebase_storage/windows/firebase_storage_plugin.cpp b/packages/firebase_storage/firebase_storage/windows/firebase_storage_plugin.cpp index 3f2d617358eb..4369b063493f 100644 --- a/packages/firebase_storage/firebase_storage/windows/firebase_storage_plugin.cpp +++ b/packages/firebase_storage/firebase_storage/windows/firebase_storage_plugin.cpp @@ -712,7 +712,7 @@ void FirebaseStoragePlugin::ReferencePutFile( const PigeonStorageFirebaseApp& pigeon_app, const PigeonStorageReference& pigeon_reference, const std::string& file_path, - const PigeonSettableMetadata& settable_meta_data, int64_t handle, + const PigeonSettableMetadata* settable_meta_data, int64_t handle, std::function reply)> result) { Storage* cpp_storage = GetCPPStorageFromPigeon(pigeon_app, pigeon_reference.bucket()); diff --git a/packages/firebase_storage/firebase_storage/windows/firebase_storage_plugin.h b/packages/firebase_storage/firebase_storage/windows/firebase_storage_plugin.h index d202b6c24a97..221946b5d61a 100644 --- a/packages/firebase_storage/firebase_storage/windows/firebase_storage_plugin.h +++ b/packages/firebase_storage/firebase_storage/windows/firebase_storage_plugin.h @@ -97,7 +97,7 @@ class FirebaseStoragePlugin : public flutter::Plugin, virtual void ReferencePutFile( const PigeonStorageFirebaseApp& app, const PigeonStorageReference& reference, const std::string& file_path, - const PigeonSettableMetadata& settable_meta_data, int64_t handle, + const PigeonSettableMetadata* settable_meta_data, int64_t handle, std::function reply)> result) override; virtual void ReferenceDownloadFile( const PigeonStorageFirebaseApp& app, diff --git a/packages/firebase_storage/firebase_storage/windows/messages.g.cpp b/packages/firebase_storage/firebase_storage/windows/messages.g.cpp index b1f48b944899..a77d577dc345 100644 --- a/packages/firebase_storage/firebase_storage/windows/messages.g.cpp +++ b/packages/firebase_storage/firebase_storage/windows/messages.g.cpp @@ -1253,14 +1253,10 @@ void FirebaseStorageHostApi::SetUp(flutter::BinaryMessenger* binary_messenger, const auto& file_path_arg = std::get(encodable_file_path_arg); const auto& encodable_settable_meta_data_arg = args.at(3); - if (encodable_settable_meta_data_arg.IsNull()) { - reply(WrapError("settable_meta_data_arg unexpectedly null.")); - return; - } - const auto& settable_meta_data_arg = - std::any_cast( + const auto* settable_meta_data_arg = + &(std::any_cast( std::get( - encodable_settable_meta_data_arg)); + encodable_settable_meta_data_arg))); const auto& encodable_handle_arg = args.at(4); if (encodable_handle_arg.IsNull()) { reply(WrapError("handle_arg unexpectedly null.")); diff --git a/packages/firebase_storage/firebase_storage/windows/messages.g.h b/packages/firebase_storage/firebase_storage/windows/messages.g.h index 96c39aa9788e..307747a7320b 100644 --- a/packages/firebase_storage/firebase_storage/windows/messages.g.h +++ b/packages/firebase_storage/firebase_storage/windows/messages.g.h @@ -373,7 +373,7 @@ class FirebaseStorageHostApi { virtual void ReferencePutFile( const PigeonStorageFirebaseApp& app, const PigeonStorageReference& reference, const std::string& file_path, - const PigeonSettableMetadata& settable_meta_data, int64_t handle, + const PigeonSettableMetadata* settable_meta_data, int64_t handle, std::function reply)> result) = 0; virtual void ReferenceDownloadFile( const PigeonStorageFirebaseApp& app, diff --git a/packages/firebase_storage/firebase_storage_platform_interface/lib/src/method_channel/method_channel_task.dart b/packages/firebase_storage/firebase_storage_platform_interface/lib/src/method_channel/method_channel_task.dart index 6d0be81fb02f..b12a242cf851 100644 --- a/packages/firebase_storage/firebase_storage_platform_interface/lib/src/method_channel/method_channel_task.dart +++ b/packages/firebase_storage/firebase_storage_platform_interface/lib/src/method_channel/method_channel_task.dart @@ -262,7 +262,9 @@ class MethodChannelPutFileTask extends MethodChannelTask { MethodChannelFirebaseStorage.getPigeonReference( storage.bucket, path, 'putFile'), file.path, - MethodChannelFirebaseStorage.getPigeonSettableMetaData(metadata), + metadata == null + ? null + : MethodChannelFirebaseStorage.getPigeonSettableMetaData(metadata), handle, ); } diff --git a/packages/firebase_storage/firebase_storage_platform_interface/lib/src/pigeon/messages.pigeon.dart b/packages/firebase_storage/firebase_storage_platform_interface/lib/src/pigeon/messages.pigeon.dart index a1f5a8d0f894..d5f1ca5617df 100644 --- a/packages/firebase_storage/firebase_storage_platform_interface/lib/src/pigeon/messages.pigeon.dart +++ b/packages/firebase_storage/firebase_storage_platform_interface/lib/src/pigeon/messages.pigeon.dart @@ -673,7 +673,7 @@ class FirebaseStorageHostApi { PigeonStorageFirebaseApp arg_app, PigeonStorageReference arg_reference, String arg_filePath, - PigeonSettableMetadata arg_settableMetaData, + PigeonSettableMetadata? arg_settableMetaData, int arg_handle) async { final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referencePutFile', diff --git a/packages/firebase_storage/firebase_storage_platform_interface/pigeons/messages.dart b/packages/firebase_storage/firebase_storage_platform_interface/pigeons/messages.dart index 587ad0d194d9..499c58e938c9 100644 --- a/packages/firebase_storage/firebase_storage_platform_interface/pigeons/messages.dart +++ b/packages/firebase_storage/firebase_storage_platform_interface/pigeons/messages.dart @@ -255,7 +255,7 @@ abstract class FirebaseStorageHostApi { PigeonStorageFirebaseApp app, PigeonStorageReference reference, String filePath, - PigeonSettableMetadata settableMetaData, + PigeonSettableMetadata? settableMetaData, int handle, ); diff --git a/packages/firebase_storage/firebase_storage_platform_interface/test/pigeon/test_api.dart b/packages/firebase_storage/firebase_storage_platform_interface/test/pigeon/test_api.dart index 095d25382e90..d11d0f21236b 100644 --- a/packages/firebase_storage/firebase_storage_platform_interface/test/pigeon/test_api.dart +++ b/packages/firebase_storage/firebase_storage_platform_interface/test/pigeon/test_api.dart @@ -114,7 +114,7 @@ abstract class TestFirebaseStorageHostApi { PigeonStorageFirebaseApp app, PigeonStorageReference reference, String filePath, - PigeonSettableMetadata settableMetaData, + PigeonSettableMetadata? settableMetaData, int handle); Future referenceDownloadFile(PigeonStorageFirebaseApp app, @@ -570,17 +570,11 @@ abstract class TestFirebaseStorageHostApi { 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referencePutFile was null, expected non-null String.'); final PigeonSettableMetadata? arg_settableMetaData = (args[3] as PigeonSettableMetadata?); - assert(arg_settableMetaData != null, - 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referencePutFile was null, expected non-null PigeonSettableMetadata.'); final int? arg_handle = (args[4] as int?); assert(arg_handle != null, 'Argument for dev.flutter.pigeon.firebase_storage_platform_interface.FirebaseStorageHostApi.referencePutFile was null, expected non-null int.'); - final String output = await api.referencePutFile( - arg_app!, - arg_reference!, - arg_filePath!, - arg_settableMetaData!, - arg_handle!); + final String output = await api.referencePutFile(arg_app!, + arg_reference!, arg_filePath!, arg_settableMetaData, arg_handle!); return [output]; }); } diff --git a/tests/integration_test/firebase_storage/reference_e2e.dart b/tests/integration_test/firebase_storage/reference_e2e.dart index 3546bde81ba8..eda058bb0c25 100644 --- a/tests/integration_test/firebase_storage/reference_e2e.dart +++ b/tests/integration_test/firebase_storage/reference_e2e.dart @@ -331,6 +331,14 @@ void setupReferenceTests() { // Metadata isn't saved on objects when using the emulator which fails test // expect(complete.metadata?.contentLanguage, 'en'); // expect(complete.metadata?.customMetadata!['activity'], 'test'); + + // Check without SettableMetadata + final Reference ref2 = + storage.ref('flutter-tests').child('flt-ok-2.txt'); + final TaskSnapshot complete2 = await ref2.putFile( + file, + ); + expect(complete2.metadata?.size, kTestString.length); }, // putFile is not supported on the web platform. skip: kIsWeb, diff --git a/tests/ios/Runner.xcodeproj/project.pbxproj b/tests/ios/Runner.xcodeproj/project.pbxproj index f6ab81ef2caa..fecfd4c1442d 100644 --- a/tests/ios/Runner.xcodeproj/project.pbxproj +++ b/tests/ios/Runner.xcodeproj/project.pbxproj @@ -271,7 +271,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build\n"; }; AC660AAB7696B4DD121B84D0 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase;