From ad9ed350ec37602fd64f09eeda772456fe9ade4b Mon Sep 17 00:00:00 2001 From: Mairramer Date: Tue, 5 Sep 2023 12:18:45 -0300 Subject: [PATCH 01/30] [ios_platform_images] migrate objC to swift --- packages/ios_platform_images/AUTHORS | 1 + .../ios/Runner.xcodeproj/project.pbxproj | 90 +++++++++++-------- .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++ .../xcshareddata/xcschemes/Runner.xcscheme | 14 +++ .../example/ios/Runner/AppDelegate.swift | 2 +- .../ios/RunnerTests/IosPlatformImagesTests.m | 18 ---- .../RunnerTests/IosPlatformImagesTests.swift | 61 +++++++++++++ .../RunnerTests/Mocks/MockMethodChannel.swift | 14 +++ .../ios/Classes/IosPlatformImagesPlugin.h | 10 --- .../ios/Classes/IosPlatformImagesPlugin.m | 48 ---------- .../ios/Classes/IosPlatformImagesPlugin.swift | 59 ++++++++++++ .../ios/Classes/UIImage+ios_platform_images.h | 27 ------ .../ios/Classes/UIImage+ios_platform_images.m | 25 ------ .../Classes/UIImageIosPlatformImages.swift | 27 ++++++ .../ios/ios_platform_images.podspec | 8 +- .../lib/ios_platform_images.dart | 2 +- .../test/ios_platform_images_test.dart | 27 ++++-- 17 files changed, 267 insertions(+), 174 deletions(-) create mode 100644 packages/ios_platform_images/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 packages/ios_platform_images/example/ios/RunnerTests/IosPlatformImagesTests.m create mode 100644 packages/ios_platform_images/example/ios/RunnerTests/IosPlatformImagesTests.swift create mode 100644 packages/ios_platform_images/example/ios/RunnerTests/Mocks/MockMethodChannel.swift delete mode 100644 packages/ios_platform_images/ios/Classes/IosPlatformImagesPlugin.h delete mode 100644 packages/ios_platform_images/ios/Classes/IosPlatformImagesPlugin.m create mode 100644 packages/ios_platform_images/ios/Classes/IosPlatformImagesPlugin.swift delete mode 100644 packages/ios_platform_images/ios/Classes/UIImage+ios_platform_images.h delete mode 100644 packages/ios_platform_images/ios/Classes/UIImage+ios_platform_images.m create mode 100644 packages/ios_platform_images/ios/Classes/UIImageIosPlatformImages.swift diff --git a/packages/ios_platform_images/AUTHORS b/packages/ios_platform_images/AUTHORS index 493a0b4ef9c..0d1bfa6a90c 100644 --- a/packages/ios_platform_images/AUTHORS +++ b/packages/ios_platform_images/AUTHORS @@ -64,3 +64,4 @@ Aleksandr Yurkovskiy Anton Borries Alex Li Rahul Raj <64.rahulraj@gmail.com> +Mairramer diff --git a/packages/ios_platform_images/example/ios/Runner.xcodeproj/project.pbxproj b/packages/ios_platform_images/example/ios/Runner.xcodeproj/project.pbxproj index d6b4ef94bce..5b3a799f7b0 100644 --- a/packages/ios_platform_images/example/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/ios_platform_images/example/ios/Runner.xcodeproj/project.pbxproj @@ -7,6 +7,8 @@ objects = { /* Begin PBXBuildFile section */ + 00B3EC2182B376150E73B4F0 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EF5A3DF370A997C1CD10C63C /* Pods_RunnerTests.framework */; }; + 0CA9F612F3F481AA48224853 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 76A903AA066001EE3E024A3C /* Pods_Runner.framework */; }; 0DE21BF72447752100097E3A /* textfile in Resources */ = {isa = PBXBuildFile; fileRef = 0DE21BF62447752100097E3A /* textfile */; }; 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; @@ -14,9 +16,7 @@ 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - A30D9778BC0D4D09580CF4BE /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 906079E3CC5A6FAB808EAF1E /* Pods_Runner.framework */; }; - F76AC1C1266713D00040C8BC /* IosPlatformImagesTests.m in Sources */ = {isa = PBXBuildFile; fileRef = F76AC1C0266713D00040C8BC /* IosPlatformImagesTests.m */; }; - FC73B055B2CD2E32A3E50B27 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AD2C5EF0E06B6EC7EBCB922C /* Pods_RunnerTests.framework */; }; + F76AC1C1266713D00040C8BC /* IosPlatformImagesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F76AC1C0266713D00040C8BC /* IosPlatformImagesTests.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -52,9 +52,9 @@ 4B56C310C5932F84CD6C17AC /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 76A903AA066001EE3E024A3C /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 80830F517E3E8B75B2D3AC0A /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; - 906079E3CC5A6FAB808EAF1E /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -62,11 +62,11 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - AD2C5EF0E06B6EC7EBCB922C /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D1A761179BC59B1BAEE63036 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; D36FEDC657E1CE88220062D7 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + EF5A3DF370A997C1CD10C63C /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; F76AC1BE266713D00040C8BC /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - F76AC1C0266713D00040C8BC /* IosPlatformImagesTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = IosPlatformImagesTests.m; sourceTree = ""; }; + F76AC1C0266713D00040C8BC /* IosPlatformImagesTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = IosPlatformImagesTests.swift; sourceTree = ""; }; F76AC1C2266713D00040C8BC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; /* End PBXFileReference section */ @@ -75,7 +75,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - A30D9778BC0D4D09580CF4BE /* Pods_Runner.framework in Frameworks */, + 0CA9F612F3F481AA48224853 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -83,7 +83,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - FC73B055B2CD2E32A3E50B27 /* Pods_RunnerTests.framework in Frameworks */, + 00B3EC2182B376150E73B4F0 /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -154,8 +154,8 @@ DBEBA2309FD49D5C34798105 /* Frameworks */ = { isa = PBXGroup; children = ( - 906079E3CC5A6FAB808EAF1E /* Pods_Runner.framework */, - AD2C5EF0E06B6EC7EBCB922C /* Pods_RunnerTests.framework */, + 76A903AA066001EE3E024A3C /* Pods_Runner.framework */, + EF5A3DF370A997C1CD10C63C /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -163,7 +163,7 @@ F76AC1BF266713D00040C8BC /* RunnerTests */ = { isa = PBXGroup; children = ( - F76AC1C0266713D00040C8BC /* IosPlatformImagesTests.m */, + F76AC1C0266713D00040C8BC /* IosPlatformImagesTests.swift */, F76AC1C2266713D00040C8BC /* Info.plist */, ); path = RunnerTests; @@ -183,7 +183,7 @@ 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 54C54D6BB826835E8AB0FA51 /* [CP] Embed Pods Frameworks */, + 3411F108744C4F871E33084D /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -276,39 +276,39 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + 3411F108744C4F871E33084D /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputPaths = ( - "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", + "${BUILT_PRODUCTS_DIR}/ios_platform_images/ios_platform_images.framework", ); - name = "Thin Binary"; + name = "[CP] Embed Pods Frameworks"; outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ios_platform_images.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; }; - 54C54D6BB826835E8AB0FA51 /* [CP] Embed Pods Frameworks */ = { + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${BUILT_PRODUCTS_DIR}/ios_platform_images/ios_platform_images.framework", + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", ); - name = "[CP] Embed Pods Frameworks"; + name = "Thin Binary"; outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ios_platform_images.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; 73331024E8B67D581A0862F0 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; @@ -334,8 +334,7 @@ }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; - buildActionMask = 2147483647; + buildActionMask = 8; files = ( ); inputPaths = ( @@ -343,9 +342,9 @@ name = "Run Script"; outputPaths = ( ); - runOnlyForDeploymentPostprocessing = 0; + runOnlyForDeploymentPostprocessing = 1; 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"; }; C102F13F37851E08F0608EE5 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; @@ -385,7 +384,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - F76AC1C1266713D00040C8BC /* IosPlatformImagesTests.m in Sources */, + F76AC1C1266713D00040C8BC /* IosPlatformImagesTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -482,7 +481,10 @@ "$(PROJECT_DIR)/Flutter", ); INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/Flutter", @@ -614,7 +616,10 @@ "$(PROJECT_DIR)/Flutter", ); INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/Flutter", @@ -641,7 +646,10 @@ "$(PROJECT_DIR)/Flutter", ); INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); LIBRARY_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/Flutter", @@ -662,7 +670,11 @@ CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = S8QB4VV633; INFOPLIST_FILE = RunnerTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = dev.flutter.plugins.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/Runner"; @@ -677,7 +689,11 @@ CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = S8QB4VV633; INFOPLIST_FILE = RunnerTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = dev.flutter.plugins.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/Runner"; @@ -692,7 +708,11 @@ CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = S8QB4VV633; INFOPLIST_FILE = RunnerTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = dev.flutter.plugins.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/Runner"; diff --git a/packages/ios_platform_images/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/packages/ios_platform_images/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000000..18d981003d6 --- /dev/null +++ b/packages/ios_platform_images/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/packages/ios_platform_images/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/ios_platform_images/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 7ae2cb4d4e5..71ade3c6b88 100644 --- a/packages/ios_platform_images/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/packages/ios_platform_images/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -20,6 +20,20 @@ ReferencedContainer = "container:Runner.xcodeproj"> + + + + Void)? = nil + func invokeMethod(_ method: String, arguments: Any?) { + invokeMethodStub?(method, arguments) + } +} diff --git a/packages/ios_platform_images/ios/Classes/IosPlatformImagesPlugin.h b/packages/ios_platform_images/ios/Classes/IosPlatformImagesPlugin.h deleted file mode 100644 index f3c8efe9bd6..00000000000 --- a/packages/ios_platform_images/ios/Classes/IosPlatformImagesPlugin.h +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import - -/// A plugin for Flutter that allows Flutter to load images in a platform -/// specific way on iOS. -@interface IosPlatformImagesPlugin : NSObject -@end diff --git a/packages/ios_platform_images/ios/Classes/IosPlatformImagesPlugin.m b/packages/ios_platform_images/ios/Classes/IosPlatformImagesPlugin.m deleted file mode 100644 index 5f7debc3fe0..00000000000 --- a/packages/ios_platform_images/ios/Classes/IosPlatformImagesPlugin.m +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import "IosPlatformImagesPlugin.h" - -#if !__has_feature(objc_arc) -#error ARC must be enabled! -#endif - -@interface IosPlatformImagesPlugin () -@end - -@implementation IosPlatformImagesPlugin - -+ (void)registerWithRegistrar:(NSObject *)registrar { - FlutterMethodChannel *channel = - [FlutterMethodChannel methodChannelWithName:@"plugins.flutter.io/ios_platform_images" - binaryMessenger:[registrar messenger]]; - - [channel setMethodCallHandler:^(FlutterMethodCall *call, FlutterResult result) { - if ([@"loadImage" isEqualToString:call.method]) { - NSString *name = call.arguments; - UIImage *image = [UIImage imageNamed:name]; - NSData *data = UIImagePNGRepresentation(image); - if (data) { - result(@{ - @"scale" : @(image.scale), - @"data" : [FlutterStandardTypedData typedDataWithBytes:data], - }); - } else { - result(nil); - } - return; - } else if ([@"resolveURL" isEqualToString:call.method]) { - NSArray *args = call.arguments; - NSString *name = args[0]; - NSString *extension = (args[1] == (id)NSNull.null) ? nil : args[1]; - - NSURL *url = [[NSBundle mainBundle] URLForResource:name withExtension:extension]; - result(url.absoluteString); - return; - } - result(FlutterMethodNotImplemented); - }]; -} - -@end diff --git a/packages/ios_platform_images/ios/Classes/IosPlatformImagesPlugin.swift b/packages/ios_platform_images/ios/Classes/IosPlatformImagesPlugin.swift new file mode 100644 index 00000000000..cfcfafc5c89 --- /dev/null +++ b/packages/ios_platform_images/ios/Classes/IosPlatformImagesPlugin.swift @@ -0,0 +1,59 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import Flutter +import Foundation + +public class IosPlatformImagesPlugin: NSObject, FlutterPlugin { + + public static func register(with registrar: FlutterPluginRegistrar) { + let channel = FlutterMethodChannel( + name: "plugins.flutter.io/ios_platform_images", + binaryMessenger: registrar.messenger()) + + let plugin = IosPlatformImagesPlugin() + registrar.addMethodCallDelegate(plugin, channel: channel) + } + + public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { + switch call.method { + case "loadImage": + handleLoadImage(call, result) + case "resolveURL": + handleResolveURL(call, result) + default: + result(FlutterMethodNotImplemented) + } + } + + private func handleLoadImage(_ call: FlutterMethodCall, _ result: @escaping FlutterResult) { + guard let name = call.arguments as? String, + let image = UIImage(named: name), + let data = image.pngData() + else { + result(nil) + return + } + + let imageResult: [String: Any] = [ + "scale": image.scale, + "data": FlutterStandardTypedData(bytes: data), + ] + + result(imageResult) + } + + private func handleResolveURL(_ call: FlutterMethodCall, _ result: @escaping FlutterResult) { + guard let args = call.arguments as? [Any], + let name = args.first as? String, + let extensionOrNil = args.dropFirst().first as? String?, + let url = Bundle.main.url(forResource: name, withExtension: extensionOrNil) + else { + result(nil) + return + } + + result(url.absoluteString) + } +} diff --git a/packages/ios_platform_images/ios/Classes/UIImage+ios_platform_images.h b/packages/ios_platform_images/ios/Classes/UIImage+ios_platform_images.h deleted file mode 100644 index 356a5f1cfe3..00000000000 --- a/packages/ios_platform_images/ios/Classes/UIImage+ios_platform_images.h +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import - -@interface UIImage (ios_platform_images) - -/// Loads a UIImage from the embedded Flutter project's assets. -/// -/// This method loads the Flutter asset that is appropriate for the current -/// screen. If you are on a 2x retina device where usually `UIImage` would be -/// loading `@2x` assets, it will attempt to load the `2.0x` variant. It will -/// load the standard image if it can't find the `2.0x` variant. -/// -/// For example, if your Flutter project's `pubspec.yaml` lists "assets/foo.png" -/// and "assets/2.0x/foo.png", calling -/// `[UIImage flutterImageWithName:@"assets/foo.png"]` will load -/// "assets/2.0x/foo.png". -/// -/// See also https://flutter.dev/docs/development/ui/assets-and-images -/// -/// Note: We don't yet support images from package dependencies (ex. -/// `AssetImage('icons/heart.png', package: 'my_icons')`). -+ (UIImage *)flutterImageWithName:(NSString *)name; - -@end diff --git a/packages/ios_platform_images/ios/Classes/UIImage+ios_platform_images.m b/packages/ios_platform_images/ios/Classes/UIImage+ios_platform_images.m deleted file mode 100644 index f20bbcd08c9..00000000000 --- a/packages/ios_platform_images/ios/Classes/UIImage+ios_platform_images.m +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import -#import "UIImage+ios_platform_images.h" - -@implementation UIImage (ios_platform_images) -+ (UIImage *)flutterImageWithName:(NSString *)name { - NSString *filename = [name lastPathComponent]; - NSString *path = [name stringByDeletingLastPathComponent]; - for (int screenScale = [UIScreen mainScreen].scale; screenScale > 1; --screenScale) { - NSString *key = [FlutterDartProject - lookupKeyForAsset:[NSString stringWithFormat:@"%@/%d.0x/%@", path, screenScale, filename]]; - UIImage *image = [UIImage imageNamed:key - inBundle:[NSBundle mainBundle] - compatibleWithTraitCollection:nil]; - if (image) { - return image; - } - } - NSString *key = [FlutterDartProject lookupKeyForAsset:name]; - return [UIImage imageNamed:key inBundle:[NSBundle mainBundle] compatibleWithTraitCollection:nil]; -} -@end diff --git a/packages/ios_platform_images/ios/Classes/UIImageIosPlatformImages.swift b/packages/ios_platform_images/ios/Classes/UIImageIosPlatformImages.swift new file mode 100644 index 00000000000..38694b49dd1 --- /dev/null +++ b/packages/ios_platform_images/ios/Classes/UIImageIosPlatformImages.swift @@ -0,0 +1,27 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import Flutter +import Foundation +import UIKit + +extension UIImage { + static func flutterImage(withName name: String) -> UIImage? { + let components = name.components(separatedBy: "/") + guard let filename = components.last else { + return nil + } + let path = components.dropLast().joined(separator: "/") + + for screenScale in stride(from: UIScreen.main.scale, to: 1, by: -1) { + let key = FlutterDartProject.lookupKey(forAsset: "\(path)/\(screenScale)0x/\(filename)") + if let image = UIImage(named: key, in: Bundle.main, compatibleWith: nil) { + return image + } + } + + let key = FlutterDartProject.lookupKey(forAsset: name) + return UIImage(named: key, in: Bundle.main, compatibleWith: nil) + } +} diff --git a/packages/ios_platform_images/ios/ios_platform_images.podspec b/packages/ios_platform_images/ios/ios_platform_images.podspec index 6b67de3f133..ea4b1a3d049 100644 --- a/packages/ios_platform_images/ios/ios_platform_images.podspec +++ b/packages/ios_platform_images/ios/ios_platform_images.podspec @@ -15,11 +15,13 @@ Downloaded by pub (not CocoaPods). s.author = { 'Flutter Dev Team' => 'flutter-dev@googlegroups.com' } s.source = { :http => 'https://github.com/flutter/packages/tree/main/packages/ios_platform_images' } s.documentation_url = 'https://pub.dev/packages/ios_platform_images' - s.source_files = 'Classes/**/*' + s.source_files = 'Classes/**/*.swift' s.dependency 'Flutter' s.platform = :ios, '11.0' - # Flutter.framework does not contain a i386 slice. Only x86_64 simulators are supported. - s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES' } + s.xcconfig = { + 'LIBRARY_SEARCH_PATHS' => '$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)/ $(SDKROOT)/usr/lib/swift', + 'LD_RUNPATH_SEARCH_PATHS' => '/usr/lib/swift', + } s.swift_version = '5.0' end diff --git a/packages/ios_platform_images/lib/ios_platform_images.dart b/packages/ios_platform_images/lib/ios_platform_images.dart index b372d362f6f..e5ea05f0114 100644 --- a/packages/ios_platform_images/lib/ios_platform_images.dart +++ b/packages/ios_platform_images/lib/ios_platform_images.dart @@ -123,7 +123,7 @@ class IosPlatformImages { loadInfo.then((Map? map) { if (map == null) { scaleCompleter.completeError( - Exception("Image couldn't be found: $name"), + Exception("Scale couldn't be found to load image: $name"), ); bytesCompleter.completeError( Exception("Image couldn't be found: $name"), diff --git a/packages/ios_platform_images/test/ios_platform_images_test.dart b/packages/ios_platform_images/test/ios_platform_images_test.dart index f42b7864603..2a424e233eb 100644 --- a/packages/ios_platform_images/test/ios_platform_images_test.dart +++ b/packages/ios_platform_images/test/ios_platform_images_test.dart @@ -2,21 +2,28 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:ios_platform_images/ios_platform_images.dart'; void main() { - const MethodChannel channel = - MethodChannel('plugins.flutter.io/ios_platform_images'); + const MethodChannel channel = MethodChannel('plugins.flutter.io/ios_platform_images'); TestWidgetsFlutterBinding.ensureInitialized(); setUp(() { - _ambiguate(TestDefaultBinaryMessengerBinding.instance)! - .defaultBinaryMessenger - .setMockMethodCallHandler(channel, (MethodCall methodCall) async { - return '42'; + _ambiguate(TestDefaultBinaryMessengerBinding.instance)!.defaultBinaryMessenger.setMockMethodCallHandler(channel, + (MethodCall methodCall) async { + if (methodCall.method == 'loadImage') { + return { + 'scale': 1.0, + 'data': Uint8List.fromList([1, 2, 3, 4]) + }; + } else if (methodCall.method == 'resolveURL') { + return '42'; + } + return null; }); }); @@ -29,6 +36,14 @@ void main() { test('resolveURL', () async { expect(await IosPlatformImages.resolveURL('foobar'), '42'); }); + + test('load', () async { + expect(IosPlatformImages.load('foobar'), isNotNull); + + final ImageProvider image = IosPlatformImages.load('foobar'); + expect(image.obtainCacheStatus(configuration: ImageConfiguration.empty), isA>()); + expect(image.resolve(ImageConfiguration.empty), isA()); + }); } /// This allows a value of type T or T? to be treated as a value of type T?. From e5545bc9a1ea76cc760b8791498201d301e9a1d0 Mon Sep 17 00:00:00 2001 From: Mairramer Date: Tue, 5 Sep 2023 12:21:49 -0300 Subject: [PATCH 02/30] pump version --- packages/ios_platform_images/CHANGELOG.md | 4 ++++ packages/ios_platform_images/pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/ios_platform_images/CHANGELOG.md b/packages/ios_platform_images/CHANGELOG.md index 69781d6576a..99772e6bc6e 100644 --- a/packages/ios_platform_images/CHANGELOG.md +++ b/packages/ios_platform_images/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.3.0 + +* Migrate objC to Swift. + ## 0.2.2+2 * Adds pub topics to package metadata. diff --git a/packages/ios_platform_images/pubspec.yaml b/packages/ios_platform_images/pubspec.yaml index 7a14d4a71b5..e5ee42a9ace 100644 --- a/packages/ios_platform_images/pubspec.yaml +++ b/packages/ios_platform_images/pubspec.yaml @@ -2,7 +2,7 @@ name: ios_platform_images description: A plugin to share images between Flutter and iOS in add-to-app setups. repository: https://github.com/flutter/packages/tree/main/packages/ios_platform_images issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+ios_platform_images%22 -version: 0.2.2+2 +version: 0.3.0 environment: sdk: ">=2.19.0 <4.0.0" From cf211826127cafc138096a9e5f0c3cfd41af1e1f Mon Sep 17 00:00:00 2001 From: Mairramer Date: Wed, 6 Sep 2023 14:05:52 -0300 Subject: [PATCH 03/30] added some tests --- .../ios_platform_images/example/ios/Podfile | 5 +- .../ios/Runner.xcodeproj/project.pbxproj | 69 +++++++++-------- .../RunnerTests/IosPlatformImagesTests.swift | 76 ++++++++++++------- .../ios/Classes/IosPlatformImagesPlugin.swift | 37 +++++---- .../ios/Classes/MethodChannel.swift | 16 ++++ 5 files changed, 125 insertions(+), 78 deletions(-) create mode 100644 packages/ios_platform_images/ios/Classes/MethodChannel.swift diff --git a/packages/ios_platform_images/example/ios/Podfile b/packages/ios_platform_images/example/ios/Podfile index fdcc671eb34..129254ee831 100644 --- a/packages/ios_platform_images/example/ios/Podfile +++ b/packages/ios_platform_images/example/ios/Podfile @@ -28,9 +28,6 @@ require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelpe flutter_ios_podfile_setup target 'Runner' do - use_frameworks! - use_modular_headers! - flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do inherit! :search_paths @@ -41,4 +38,4 @@ post_install do |installer| installer.pods_project.targets.each do |target| flutter_additional_ios_build_settings(target) end -end +end \ No newline at end of file diff --git a/packages/ios_platform_images/example/ios/Runner.xcodeproj/project.pbxproj b/packages/ios_platform_images/example/ios/Runner.xcodeproj/project.pbxproj index 5b3a799f7b0..f9374b33b1b 100644 --- a/packages/ios_platform_images/example/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/ios_platform_images/example/ios/Runner.xcodeproj/project.pbxproj @@ -7,15 +7,17 @@ objects = { /* Begin PBXBuildFile section */ - 00B3EC2182B376150E73B4F0 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EF5A3DF370A997C1CD10C63C /* Pods_RunnerTests.framework */; }; - 0CA9F612F3F481AA48224853 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 76A903AA066001EE3E024A3C /* Pods_Runner.framework */; }; 0DE21BF72447752100097E3A /* textfile in Resources */ = {isa = PBXBuildFile; fileRef = 0DE21BF62447752100097E3A /* textfile */; }; + 1249487BECEEB37B66E4BD6E /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 0A79FBC35316559720A400F3 /* libPods-Runner.a */; }; 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 31DC4A202AA8BBEB00781E88 /* MockMethodChannel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31DC4A1F2AA8BBEB00781E88 /* MockMethodChannel.swift */; }; + 31DC4A212AA8CC9300781E88 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; + F65460B0A71DD10DFBD82C05 /* libPods-RunnerTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B3AED97A07CBBABEE7CAECBB /* libPods-RunnerTests.a */; }; F76AC1C1266713D00040C8BC /* IosPlatformImagesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F76AC1C0266713D00040C8BC /* IosPlatformImagesTests.swift */; }; /* End PBXBuildFile section */ @@ -43,16 +45,17 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 0A79FBC35316559720A400F3 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 0B20D3254D8E1A2B01D83810 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; 0DE21BF62447752100097E3A /* textfile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = textfile; sourceTree = ""; }; 0EF1CD9A3A3064B5289EF22E /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 31DC4A1F2AA8BBEB00781E88 /* MockMethodChannel.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; path = MockMethodChannel.swift; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 4B56C310C5932F84CD6C17AC /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 76A903AA066001EE3E024A3C /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 80830F517E3E8B75B2D3AC0A /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; @@ -62,11 +65,11 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + B3AED97A07CBBABEE7CAECBB /* libPods-RunnerTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-RunnerTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; D1A761179BC59B1BAEE63036 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; D36FEDC657E1CE88220062D7 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; - EF5A3DF370A997C1CD10C63C /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; F76AC1BE266713D00040C8BC /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - F76AC1C0266713D00040C8BC /* IosPlatformImagesTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = IosPlatformImagesTests.swift; sourceTree = ""; }; + F76AC1C0266713D00040C8BC /* IosPlatformImagesTests.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; path = IosPlatformImagesTests.swift; sourceTree = ""; }; F76AC1C2266713D00040C8BC /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; /* End PBXFileReference section */ @@ -75,7 +78,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 0CA9F612F3F481AA48224853 /* Pods_Runner.framework in Frameworks */, + 1249487BECEEB37B66E4BD6E /* libPods-Runner.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -83,13 +86,21 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 00B3EC2182B376150E73B4F0 /* Pods_RunnerTests.framework in Frameworks */, + F65460B0A71DD10DFBD82C05 /* libPods-RunnerTests.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 31DC4A1E2AA8BBBE00781E88 /* Mocks */ = { + isa = PBXGroup; + children = ( + 31DC4A1F2AA8BBEB00781E88 /* MockMethodChannel.swift */, + ); + path = Mocks; + sourceTree = ""; + }; 790F6E36EBDB3EC4A899BEF5 /* Pods */ = { isa = PBXGroup; children = ( @@ -154,8 +165,8 @@ DBEBA2309FD49D5C34798105 /* Frameworks */ = { isa = PBXGroup; children = ( - 76A903AA066001EE3E024A3C /* Pods_Runner.framework */, - EF5A3DF370A997C1CD10C63C /* Pods_RunnerTests.framework */, + 0A79FBC35316559720A400F3 /* libPods-Runner.a */, + B3AED97A07CBBABEE7CAECBB /* libPods-RunnerTests.a */, ); name = Frameworks; sourceTree = ""; @@ -163,6 +174,7 @@ F76AC1BF266713D00040C8BC /* RunnerTests */ = { isa = PBXGroup; children = ( + 31DC4A1E2AA8BBBE00781E88 /* Mocks */, F76AC1C0266713D00040C8BC /* IosPlatformImagesTests.swift */, F76AC1C2266713D00040C8BC /* Info.plist */, ); @@ -183,7 +195,6 @@ 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 3411F108744C4F871E33084D /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -270,30 +281,13 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 31DC4A212AA8CC9300781E88 /* Assets.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 3411F108744C4F871E33084D /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${BUILT_PRODUCTS_DIR}/ios_platform_images/ios_platform_images.framework", - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ios_platform_images.framework", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; @@ -334,7 +328,8 @@ }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; - buildActionMask = 8; + alwaysOutOfDate = 1; + buildActionMask = 12; files = ( ); inputPaths = ( @@ -342,7 +337,7 @@ name = "Run Script"; outputPaths = ( ); - runOnlyForDeploymentPostprocessing = 1; + runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build\n"; }; @@ -384,6 +379,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 31DC4A202AA8BBEB00781E88 /* MockMethodChannel.swift in Sources */, F76AC1C1266713D00040C8BC /* IosPlatformImagesTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -441,6 +437,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -459,7 +456,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -520,6 +517,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -544,7 +542,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -575,6 +573,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -593,10 +592,11 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; @@ -677,6 +677,7 @@ ); PRODUCT_BUNDLE_IDENTIFIER = dev.flutter.plugins.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/Runner"; }; name = Debug; @@ -696,6 +697,7 @@ ); PRODUCT_BUNDLE_IDENTIFIER = dev.flutter.plugins.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/Runner"; }; name = Release; @@ -715,6 +717,7 @@ ); PRODUCT_BUNDLE_IDENTIFIER = dev.flutter.plugins.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/Runner"; }; name = Profile; diff --git a/packages/ios_platform_images/example/ios/RunnerTests/IosPlatformImagesTests.swift b/packages/ios_platform_images/example/ios/RunnerTests/IosPlatformImagesTests.swift index eb5255e4a76..e46bc52e3cf 100644 --- a/packages/ios_platform_images/example/ios/RunnerTests/IosPlatformImagesTests.swift +++ b/packages/ios_platform_images/example/ios/RunnerTests/IosPlatformImagesTests.swift @@ -16,46 +16,70 @@ class IosPlatformImagesTests: XCTestCase { mockChannel = MockMethodChannel() } - func testImageLoading() { + func testHandleMethodCall_loadImage() { + + let name = "flutter" + + let call = FlutterMethodCall(methodName: "loadImage", arguments: [name]) + + let mockChannel = MockMethodChannel() + let plugin = IosPlatformImagesPlugin(channel: mockChannel) - mockChannel.invokeMethodStub = { method, arguments in - - if method == "loadImage" { - let imageData: [String: Any] = [ - "scale": 2.0, - "data": FlutterStandardTypedData(bytes: [UInt8(0), UInt8(1), UInt8(2)]), - ] - plugin.handleLoadImage( - arguments as! FlutterMethodCall, - { result in - result(imageData) - }) + let resultExpectation = expectation(description: "result block must be called.") + + DispatchQueue.main.asyncAfter(deadline: .now() + 1) { + plugin.handle(call) { result in + let result = result as? [String: Any] + XCTAssertNotNil(result) + } + resultExpectation.fulfill() } - let image = UIImage.flutterImage(withName: "testImage.png") + XCTWaiter().wait(for: [resultExpectation], timeout: 2) - XCTAssertNotNil(image) } - func testResolveURL() { + func testHandleMethodCall_loadImage_notFound() { + let name = "testImage" + + let call = FlutterMethodCall(methodName: "loadImage", arguments: [name]) + + let mockChannel = MockMethodChannel() + let plugin = IosPlatformImagesPlugin(channel: mockChannel) - mockChannel.invokeMethodStub = { method, arguments in + let resultExpectation = expectation(description: "result block must be called.") - if method == "resolveURL" { - let url = "https://example.com/testImage.png" - plugin.handleResolveURL( - arguments as! FlutterMethodCall, - { result in - result(url) - }) + DispatchQueue.main.asyncAfter(deadline: .now()) { + plugin.handle(call) { result in + XCTAssertNil(result) + resultExpectation.fulfill() } } - let resolvedURL = IosPlatformImages.resolveURL("testImage.png") + XCTWaiter().wait(for: [resultExpectation], timeout: 1) + } + + func testHandleMethodCall_resolveURL_notFound() { + let name = "testFile" + + let call = FlutterMethodCall(methodName: "resolveURL", arguments: [name]) + + let mockChannel = MockMethodChannel() + + let plugin = IosPlatformImagesPlugin(channel: mockChannel) + + let resultExpectation = expectation(description: "result block must be called.") + + DispatchQueue.main.asyncAfter(deadline: .now()) { + plugin.handle(call) { result in + XCTAssertNil(result) + resultExpectation.fulfill() + } + } - XCTAssertEqual(resolvedURL, "https://example.com/testImage.png") + XCTWaiter().wait(for: [resultExpectation], timeout: 1) } } diff --git a/packages/ios_platform_images/ios/Classes/IosPlatformImagesPlugin.swift b/packages/ios_platform_images/ios/Classes/IosPlatformImagesPlugin.swift index cfcfafc5c89..4e137c98a62 100644 --- a/packages/ios_platform_images/ios/Classes/IosPlatformImagesPlugin.swift +++ b/packages/ios_platform_images/ios/Classes/IosPlatformImagesPlugin.swift @@ -5,29 +5,35 @@ import Flutter import Foundation -public class IosPlatformImagesPlugin: NSObject, FlutterPlugin { +public final class IosPlatformImagesPlugin: NSObject, FlutterPlugin { + + private let channel: MethodChannel + + init(channel: MethodChannel) { + self.channel = channel + } public static func register(with registrar: FlutterPluginRegistrar) { let channel = FlutterMethodChannel( name: "plugins.flutter.io/ios_platform_images", binaryMessenger: registrar.messenger()) - let plugin = IosPlatformImagesPlugin() - registrar.addMethodCallDelegate(plugin, channel: channel) + let instance = IosPlatformImagesPlugin(channel: channel) + registrar.addMethodCallDelegate(instance, channel: channel) } public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { switch call.method { case "loadImage": - handleLoadImage(call, result) + loadImage(call, result) case "resolveURL": - handleResolveURL(call, result) + resolveURL(call, result) default: result(FlutterMethodNotImplemented) } } - private func handleLoadImage(_ call: FlutterMethodCall, _ result: @escaping FlutterResult) { + private func loadImage(_ call: FlutterMethodCall, _ result: @escaping FlutterResult) { guard let name = call.arguments as? String, let image = UIImage(named: name), let data = image.pngData() @@ -44,16 +50,17 @@ public class IosPlatformImagesPlugin: NSObject, FlutterPlugin { result(imageResult) } - private func handleResolveURL(_ call: FlutterMethodCall, _ result: @escaping FlutterResult) { - guard let args = call.arguments as? [Any], - let name = args.first as? String, - let extensionOrNil = args.dropFirst().first as? String?, - let url = Bundle.main.url(forResource: name, withExtension: extensionOrNil) - else { + private func resolveURL(_ call: FlutterMethodCall, _ result: @escaping FlutterResult) { + if let args = call.arguments as? [String?] { + let name = args[0] + + if let url = Bundle.main.url(forResource: name, withExtension: nil) { + result(url.absoluteString) + } else { + result(nil) + } + } else { result(nil) - return } - - result(url.absoluteString) } } diff --git a/packages/ios_platform_images/ios/Classes/MethodChannel.swift b/packages/ios_platform_images/ios/Classes/MethodChannel.swift new file mode 100644 index 00000000000..5d52790dd4b --- /dev/null +++ b/packages/ios_platform_images/ios/Classes/MethodChannel.swift @@ -0,0 +1,16 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import Flutter + +/// A channel for platform code to communicate with the Dart code. +protocol MethodChannel { + /// Invokes a method in Dart code. + /// - Parameter method the method name. + /// - Parameter arguments the method arguments. + func invokeMethod(_ method: String, arguments: Any?) +} + +/// A default implementation of the `MethodChannel` protocol. +extension FlutterMethodChannel: MethodChannel {} From 008d5d3cb6b399cc1560c52db94cdfc2157663f8 Mon Sep 17 00:00:00 2001 From: Mairramer Date: Fri, 8 Sep 2023 10:16:31 -0300 Subject: [PATCH 04/30] update tests --- .../ios/Runner.xcodeproj/project.pbxproj | 2 + .../xcshareddata/xcschemes/Runner.xcscheme | 4 +- .../RunnerTests/IosPlatformImagesTests.swift | 66 ++++++++++++------- .../ios/Classes/IosPlatformImagesPlugin.swift | 13 ++-- .../Classes/UIImageIosPlatformImages.swift | 28 ++++---- 5 files changed, 73 insertions(+), 40 deletions(-) diff --git a/packages/ios_platform_images/example/ios/Runner.xcodeproj/project.pbxproj b/packages/ios_platform_images/example/ios/Runner.xcodeproj/project.pbxproj index f9374b33b1b..9cc40273cac 100644 --- a/packages/ios_platform_images/example/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/ios_platform_images/example/ios/Runner.xcodeproj/project.pbxproj @@ -51,6 +51,7 @@ 0EF1CD9A3A3064B5289EF22E /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 3153765C2AAA95AD009694AF /* libios_platform_images.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libios_platform_images.a; sourceTree = BUILT_PRODUCTS_DIR; }; 31DC4A1F2AA8BBEB00781E88 /* MockMethodChannel.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; path = MockMethodChannel.swift; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 4B56C310C5932F84CD6C17AC /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; @@ -165,6 +166,7 @@ DBEBA2309FD49D5C34798105 /* Frameworks */ = { isa = PBXGroup; children = ( + 3153765C2AAA95AD009694AF /* libios_platform_images.a */, 0A79FBC35316559720A400F3 /* libPods-Runner.a */, B3AED97A07CBBABEE7CAECBB /* libPods-RunnerTests.a */, ); diff --git a/packages/ios_platform_images/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/ios_platform_images/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 71ade3c6b88..59cfd44eea7 100644 --- a/packages/ios_platform_images/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/packages/ios_platform_images/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -22,10 +22,10 @@ + buildForAnalyzing = "NO"> UIImage? { - let components = name.components(separatedBy: "/") - guard let filename = components.last else { - return nil - } - let path = components.dropLast().joined(separator: "/") + let imageName = (name as NSString).lastPathComponent + let path = (name as NSString).deletingLastPathComponent + let screenScale = UIScreen.main.scale + + var scaledImage: UIImage? + + // Search for a scaled image in the bundle + // The image name may be suffixed with a scale factor, e.g. @2x + // If a scaled image is not found, search for standard image - for screenScale in stride(from: UIScreen.main.scale, to: 1, by: -1) { - let key = FlutterDartProject.lookupKey(forAsset: "\(path)/\(screenScale)0x/\(filename)") - if let image = UIImage(named: key, in: Bundle.main, compatibleWith: nil) { - return image + for scale in stride(from: Int(screenScale), through: 1, by: -1) { + let scaledName = imageName.replacingOccurrences(of: ".", with: "@\(scale)x.") + let scaledPath = "\(path)/\(scaledName)" + if let image = UIImage(named: scaledPath, in: Bundle.main, compatibleWith: nil) { + scaledImage = image + break // Exit the loop if a scaled image is found } } - let key = FlutterDartProject.lookupKey(forAsset: name) - return UIImage(named: key, in: Bundle.main, compatibleWith: nil) + // If a scaled image is not found return the standard image if it exists + return scaledImage ?? UIImage(named: imageName, in: Bundle.main, compatibleWith: nil) } } From b0122cf4260854306f0edc03f8a3acf6a1aae64d Mon Sep 17 00:00:00 2001 From: Mairramer Date: Fri, 8 Sep 2023 10:35:14 -0300 Subject: [PATCH 05/30] fix format --- .../test/ios_platform_images_test.dart | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/ios_platform_images/test/ios_platform_images_test.dart b/packages/ios_platform_images/test/ios_platform_images_test.dart index 2a424e233eb..d924b5759d1 100644 --- a/packages/ios_platform_images/test/ios_platform_images_test.dart +++ b/packages/ios_platform_images/test/ios_platform_images_test.dart @@ -8,13 +8,15 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:ios_platform_images/ios_platform_images.dart'; void main() { - const MethodChannel channel = MethodChannel('plugins.flutter.io/ios_platform_images'); + const MethodChannel channel = + MethodChannel('plugins.flutter.io/ios_platform_images'); TestWidgetsFlutterBinding.ensureInitialized(); setUp(() { - _ambiguate(TestDefaultBinaryMessengerBinding.instance)!.defaultBinaryMessenger.setMockMethodCallHandler(channel, - (MethodCall methodCall) async { + _ambiguate(TestDefaultBinaryMessengerBinding.instance)! + .defaultBinaryMessenger + .setMockMethodCallHandler(channel, (MethodCall methodCall) async { if (methodCall.method == 'loadImage') { return { 'scale': 1.0, @@ -41,7 +43,8 @@ void main() { expect(IosPlatformImages.load('foobar'), isNotNull); final ImageProvider image = IosPlatformImages.load('foobar'); - expect(image.obtainCacheStatus(configuration: ImageConfiguration.empty), isA>()); + expect(image.obtainCacheStatus(configuration: ImageConfiguration.empty), + isA>()); expect(image.resolve(ImageConfiguration.empty), isA()); }); } From f3ce0314b34d959d78e39fe915cce25cdd92428b Mon Sep 17 00:00:00 2001 From: Mairramer Date: Mon, 11 Sep 2023 18:24:04 -0300 Subject: [PATCH 06/30] improve code --- packages/ios_platform_images/CHANGELOG.md | 2 +- .../ios_platform_images/example/ios/Podfile | 2 +- .../RunnerTests/IosPlatformImagesTests.swift | 27 +++++++------------ .../ios/Classes/IosPlatformImagesPlugin.swift | 2 +- 4 files changed, 13 insertions(+), 20 deletions(-) diff --git a/packages/ios_platform_images/CHANGELOG.md b/packages/ios_platform_images/CHANGELOG.md index 99772e6bc6e..3c753c45c43 100644 --- a/packages/ios_platform_images/CHANGELOG.md +++ b/packages/ios_platform_images/CHANGELOG.md @@ -1,6 +1,6 @@ ## 0.3.0 -* Migrate objC to Swift. +* Migrates to a Swift implementation. ## 0.2.2+2 diff --git a/packages/ios_platform_images/example/ios/Podfile b/packages/ios_platform_images/example/ios/Podfile index 129254ee831..ec43b513b0d 100644 --- a/packages/ios_platform_images/example/ios/Podfile +++ b/packages/ios_platform_images/example/ios/Podfile @@ -38,4 +38,4 @@ post_install do |installer| installer.pods_project.targets.each do |target| flutter_additional_ios_build_settings(target) end -end \ No newline at end of file +end diff --git a/packages/ios_platform_images/example/ios/RunnerTests/IosPlatformImagesTests.swift b/packages/ios_platform_images/example/ios/RunnerTests/IosPlatformImagesTests.swift index 968516c0b93..d84280a7365 100644 --- a/packages/ios_platform_images/example/ios/RunnerTests/IosPlatformImagesTests.swift +++ b/packages/ios_platform_images/example/ios/RunnerTests/IosPlatformImagesTests.swift @@ -9,17 +9,10 @@ import XCTest class IosPlatformImagesTests: XCTestCase { - var mockChannel: MockMethodChannel! - - override func setUp() { - super.setUp() - mockChannel = MockMethodChannel() - } - func testHandleMethodCall_loadImage() { - let name = "flutter" + let assetName = "flutter" - let call = FlutterMethodCall(methodName: "loadImage", arguments: [name]) + let call = FlutterMethodCall(methodName: "loadImage", arguments: [assetName]) let mockChannel = MockMethodChannel() @@ -30,7 +23,7 @@ class IosPlatformImagesTests: XCTestCase { plugin.handle(call) { result in let result = result as? [String: Any] XCTAssertNotNil(result) - + let scale = result?["scale"] as? CGFloat let data = result?["data"] as? FlutterStandardTypedData @@ -44,9 +37,9 @@ class IosPlatformImagesTests: XCTestCase { } func testHandleMethodCall_loadImage_notFound() { - let name = "flutterNotFound" + let assetName = "flutterNotFound" - let call = FlutterMethodCall(methodName: "loadImage", arguments: [name]) + let call = FlutterMethodCall(methodName: "loadImage", arguments: [assetName]) let mockChannel = MockMethodChannel() @@ -65,9 +58,9 @@ class IosPlatformImagesTests: XCTestCase { } func testHandleMethodCall_resolveURL() { - let name = "textfile" + let assetName = "textfile" - let call = FlutterMethodCall(methodName: "resolveURL", arguments: [name]) + let call = FlutterMethodCall(methodName: "resolveURL", arguments: [assetName]) let mockChannel = MockMethodChannel() @@ -78,7 +71,7 @@ class IosPlatformImagesTests: XCTestCase { plugin.handle(call) { result in let result = result as? String XCTAssertNotNil(result) - XCTAssertEqual(result?.components(separatedBy: "/").last, name) + XCTAssertEqual(result?.components(separatedBy: "/").last, assetName) resultExpectation.fulfill() } @@ -86,9 +79,9 @@ class IosPlatformImagesTests: XCTestCase { } func testHandleMethodCall_resolveURL_notFound() { - let name = "notFound" + let assetName = "notFound" - let call = FlutterMethodCall(methodName: "resolveURL", arguments: [name]) + let call = FlutterMethodCall(methodName: "resolveURL", arguments: [assetName]) let mockChannel = MockMethodChannel() diff --git a/packages/ios_platform_images/ios/Classes/IosPlatformImagesPlugin.swift b/packages/ios_platform_images/ios/Classes/IosPlatformImagesPlugin.swift index 61b4baaedc7..3a8722ec2fc 100644 --- a/packages/ios_platform_images/ios/Classes/IosPlatformImagesPlugin.swift +++ b/packages/ios_platform_images/ios/Classes/IosPlatformImagesPlugin.swift @@ -36,7 +36,7 @@ public final class IosPlatformImagesPlugin: NSObject, FlutterPlugin { private func loadImage(_ call: FlutterMethodCall, _ result: @escaping FlutterResult) { guard let arguments = call.arguments as? [Any], let name = arguments.first as? String, - let image = UIImage.flutterImage(withName: name) + let image = flutterImage(withName: name) else { result(nil) return From 100202a2e582ea9473d302bba3a4138709e7748c Mon Sep 17 00:00:00 2001 From: Mairramer Date: Mon, 11 Sep 2023 18:35:19 -0300 Subject: [PATCH 07/30] rollback comment --- .../Classes/UIImageIosPlatformImages.swift | 43 ++++++++++--------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/packages/ios_platform_images/ios/Classes/UIImageIosPlatformImages.swift b/packages/ios_platform_images/ios/Classes/UIImageIosPlatformImages.swift index 2cb09baf6c7..7ceed106f15 100644 --- a/packages/ios_platform_images/ios/Classes/UIImageIosPlatformImages.swift +++ b/packages/ios_platform_images/ios/Classes/UIImageIosPlatformImages.swift @@ -6,28 +6,29 @@ import Flutter import Foundation import UIKit -extension UIImage { - static func flutterImage(withName name: String) -> UIImage? { - let imageName = (name as NSString).lastPathComponent - let path = (name as NSString).deletingLastPathComponent - let screenScale = UIScreen.main.scale +/// Loads a UIImage from the embedded Flutter project's assets. +/// +/// This method loads the Flutter asset that is appropriate for the current +/// screen. If you are on a 2x retina device where usually `UIImage` would be +/// loading `@2x` assets, it will attempt to load the `2.0x` variant. It will +/// load the standard image if it can't find the `2.0x` variant. +/// +/// For example, if your Flutter project's `pubspec.yaml` lists "assets/foo.png" +/// and "assets/2.0x/foo.png", calling +/// `[UIImage flutterImageWithName:@"assets/foo.png"]` will load +/// "assets/2.0x/foo.png". +/// +/// See also https://flutter.dev/docs/development/ui/assets-and-images +/// +/// Note: We don't yet support images from package dependencies (ex. +/// `AssetImage('icons/heart.png', package: 'my_icons')`). - var scaledImage: UIImage? - - // Search for a scaled image in the bundle - // The image name may be suffixed with a scale factor, e.g. @2x - // If a scaled image is not found, search for standard image - - for scale in stride(from: Int(screenScale), through: 1, by: -1) { - let scaledName = imageName.replacingOccurrences(of: ".", with: "@\(scale)x.") - let scaledPath = "\(path)/\(scaledName)" - if let image = UIImage(named: scaledPath, in: Bundle.main, compatibleWith: nil) { - scaledImage = image - break // Exit the loop if a scaled image is found - } +func flutterImage(withName imageName: String) -> UIImage? { + for scale in stride(from: Int(UIScreen.main.scale), through: 1, by: -1) { + let scaledImage = imageName.replacingOccurrences(of: ".", with: "@\(scale)x.") + return UIImage(named: scaledImage, in: Bundle.main, compatibleWith: nil) } - // If a scaled image is not found return the standard image if it exists - return scaledImage ?? UIImage(named: imageName, in: Bundle.main, compatibleWith: nil) + return UIImage(named: imageName, in: Bundle.main, compatibleWith: nil) } -} + From 97dc083bfac1ceecd7caf12da7a6529591e3ffd8 Mon Sep 17 00:00:00 2001 From: Mairramer Date: Mon, 11 Sep 2023 18:37:42 -0300 Subject: [PATCH 08/30] pump version --- packages/ios_platform_images/CHANGELOG.md | 2 +- packages/ios_platform_images/pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/ios_platform_images/CHANGELOG.md b/packages/ios_platform_images/CHANGELOG.md index 3c753c45c43..ac48602797f 100644 --- a/packages/ios_platform_images/CHANGELOG.md +++ b/packages/ios_platform_images/CHANGELOG.md @@ -1,4 +1,4 @@ -## 0.3.0 +## 0.2.3 * Migrates to a Swift implementation. diff --git a/packages/ios_platform_images/pubspec.yaml b/packages/ios_platform_images/pubspec.yaml index e5ee42a9ace..98422f41e00 100644 --- a/packages/ios_platform_images/pubspec.yaml +++ b/packages/ios_platform_images/pubspec.yaml @@ -2,7 +2,7 @@ name: ios_platform_images description: A plugin to share images between Flutter and iOS in add-to-app setups. repository: https://github.com/flutter/packages/tree/main/packages/ios_platform_images issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+ios_platform_images%22 -version: 0.3.0 +version: 0.2.3 environment: sdk: ">=2.19.0 <4.0.0" From 8da12bdefaf8e02e8f8a35d979b133290c16afe2 Mon Sep 17 00:00:00 2001 From: Mairramer Date: Wed, 13 Sep 2023 18:17:32 -0300 Subject: [PATCH 09/30] rollback implementation --- .../ios/Runner.xcodeproj/project.pbxproj | 2 +- .../xcshareddata/xcschemes/Runner.xcscheme | 2 +- .../RunnerTests/IosPlatformImagesTests.swift | 8 ----- .../ios/Classes/IosPlatformImagesPlugin.swift | 30 +++++++++++-------- .../Classes/UIImageIosPlatformImages.swift | 18 +++++++---- 5 files changed, 31 insertions(+), 29 deletions(-) diff --git a/packages/ios_platform_images/example/ios/Runner.xcodeproj/project.pbxproj b/packages/ios_platform_images/example/ios/Runner.xcodeproj/project.pbxproj index 9cc40273cac..aeca83bd4ca 100644 --- a/packages/ios_platform_images/example/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/ios_platform_images/example/ios/Runner.xcodeproj/project.pbxproj @@ -232,7 +232,7 @@ 97C146E61CF9000F007C117D /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 1300; + LastUpgradeCheck = 1430; ORGANIZATIONNAME = "The Flutter Authors"; TargetAttributes = { 97C146ED1CF9000F007C117D = { diff --git a/packages/ios_platform_images/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/ios_platform_images/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 59cfd44eea7..42695972f4c 100644 --- a/packages/ios_platform_images/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/packages/ios_platform_images/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -1,6 +1,6 @@ UIImage? { - for scale in stride(from: Int(UIScreen.main.scale), through: 1, by: -1) { - let scaledImage = imageName.replacingOccurrences(of: ".", with: "@\(scale)x.") - return UIImage(named: scaledImage, in: Bundle.main, compatibleWith: nil) - } +func flutterImage(withName name: String) -> UIImage? { + let components = name.components(separatedBy: "/") + let filename = components.last + let path = components.dropLast().joined(separator: "/") - return UIImage(named: imageName, in: Bundle.main, compatibleWith: nil) + for screenScale in stride(from: Int(UIScreen.main.scale), to: 1, by: -1) { + let key = FlutterDartProject.lookupKey(forAsset: "\(path)\(screenScale).0x/\(filename!)") + if let image = UIImage(named: key, in: Bundle.main, compatibleWith: nil) { + return image + } } + let key = FlutterDartProject.lookupKey(forAsset: name) + return UIImage(named: key, in: Bundle.main, compatibleWith: nil) +} From 50ce4485f2d1c8b475840a26a1622c96dfa3ac2a Mon Sep 17 00:00:00 2001 From: Mairramer Date: Thu, 14 Sep 2023 08:35:54 -0300 Subject: [PATCH 10/30] rollback original logic --- .../ios/Classes/IosPlatformImagesPlugin.swift | 2 +- .../ios/Classes/UIImageIosPlatformImages.swift | 11 +++++------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/packages/ios_platform_images/ios/Classes/IosPlatformImagesPlugin.swift b/packages/ios_platform_images/ios/Classes/IosPlatformImagesPlugin.swift index b0acb398ad5..e0e95fe0003 100644 --- a/packages/ios_platform_images/ios/Classes/IosPlatformImagesPlugin.swift +++ b/packages/ios_platform_images/ios/Classes/IosPlatformImagesPlugin.swift @@ -35,7 +35,7 @@ public final class IosPlatformImagesPlugin: NSObject, FlutterPlugin { private func loadImage(_ call: FlutterMethodCall, _ result: @escaping FlutterResult) { if let name = call.arguments as? [String], let firstItem = name.first { - guard let image = flutterImage(withName: firstItem) else { + guard let image = flutterImageWithName(withName: firstItem) else { result(nil) return } diff --git a/packages/ios_platform_images/ios/Classes/UIImageIosPlatformImages.swift b/packages/ios_platform_images/ios/Classes/UIImageIosPlatformImages.swift index 53a0c59750b..477bce5224c 100644 --- a/packages/ios_platform_images/ios/Classes/UIImageIosPlatformImages.swift +++ b/packages/ios_platform_images/ios/Classes/UIImageIosPlatformImages.swift @@ -4,7 +4,7 @@ import Flutter import Foundation -import UIKit +import SwiftUI /// Loads a UIImage from the embedded Flutter project's assets. /// @@ -23,13 +23,12 @@ import UIKit /// Note: We don't yet support images from package dependencies (ex. /// `AssetImage('icons/heart.png', package: 'my_icons')`). -func flutterImage(withName name: String) -> UIImage? { - let components = name.components(separatedBy: "/") - let filename = components.last - let path = components.dropLast().joined(separator: "/") +func flutterImageWithName(withName name: String) -> UIImage? { + let filename = (name as NSString).lastPathComponent + let path = (name as NSString).deletingLastPathComponent for screenScale in stride(from: Int(UIScreen.main.scale), to: 1, by: -1) { - let key = FlutterDartProject.lookupKey(forAsset: "\(path)\(screenScale).0x/\(filename!)") + let key = FlutterDartProject.lookupKey(forAsset: "\(path)/\(screenScale).0x/\(filename)") if let image = UIImage(named: key, in: Bundle.main, compatibleWith: nil) { return image } From 59d7b6d86c77ac971dd14b8c92bad75837515b22 Mon Sep 17 00:00:00 2001 From: Mairramer Date: Thu, 14 Sep 2023 15:38:59 -0300 Subject: [PATCH 11/30] fix logic --- .../RunnerTests/IosPlatformImagesTests.swift | 2 +- .../ios/Classes/IosPlatformImagesPlugin.swift | 32 +++++++++---------- 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/packages/ios_platform_images/example/ios/RunnerTests/IosPlatformImagesTests.swift b/packages/ios_platform_images/example/ios/RunnerTests/IosPlatformImagesTests.swift index 1a418f5d319..64d94628453 100644 --- a/packages/ios_platform_images/example/ios/RunnerTests/IosPlatformImagesTests.swift +++ b/packages/ios_platform_images/example/ios/RunnerTests/IosPlatformImagesTests.swift @@ -12,7 +12,7 @@ class IosPlatformImagesTests: XCTestCase { func testHandleMethodCall_loadImage() { let assetName = "flutter" - let call = FlutterMethodCall(methodName: "loadImage", arguments: [assetName]) + let call = FlutterMethodCall(methodName: "loadImage", arguments: assetName) let mockChannel = MockMethodChannel() let plugin = IosPlatformImagesPlugin(channel: mockChannel) diff --git a/packages/ios_platform_images/ios/Classes/IosPlatformImagesPlugin.swift b/packages/ios_platform_images/ios/Classes/IosPlatformImagesPlugin.swift index e0e95fe0003..5d124481cfd 100644 --- a/packages/ios_platform_images/ios/Classes/IosPlatformImagesPlugin.swift +++ b/packages/ios_platform_images/ios/Classes/IosPlatformImagesPlugin.swift @@ -34,26 +34,24 @@ public final class IosPlatformImagesPlugin: NSObject, FlutterPlugin { } private func loadImage(_ call: FlutterMethodCall, _ result: @escaping FlutterResult) { - if let name = call.arguments as? [String], let firstItem = name.first { - guard let image = flutterImageWithName(withName: firstItem) else { - result(nil) - return - } - - guard let data = image.pngData() else { - result(nil) - return - } - - let imageResult: [String: Any] = [ - "scale": image.scale, - "data": FlutterStandardTypedData(bytes: data), - ] + guard let name = call.arguments as? String else { + result(nil) + return + } - result(imageResult) - } else { + guard let image = UIImage(named: name), + let data = image.pngData() + else { result(nil) + return } + + let imageResult: [String: Any] = [ + "scale": image.scale, + "data": FlutterStandardTypedData(bytes: data), + ] + + result(imageResult) } private func resolveURL(_ call: FlutterMethodCall, _ result: @escaping FlutterResult) { From 17a369e82e12a46c575770f2c8f36fe44c0f30c6 Mon Sep 17 00:00:00 2001 From: Mairramer Date: Thu, 14 Sep 2023 17:08:20 -0300 Subject: [PATCH 12/30] rollback logic --- .../ios/Runner.xcodeproj/project.pbxproj | 12 ------- .../RunnerTests/IosPlatformImagesTests.swift | 14 +++----- .../RunnerTests/Mocks/MockMethodChannel.swift | 14 -------- .../ios/Classes/IosPlatformImagesPlugin.swift | 32 ++++++++----------- 4 files changed, 19 insertions(+), 53 deletions(-) delete mode 100644 packages/ios_platform_images/example/ios/RunnerTests/Mocks/MockMethodChannel.swift diff --git a/packages/ios_platform_images/example/ios/Runner.xcodeproj/project.pbxproj b/packages/ios_platform_images/example/ios/Runner.xcodeproj/project.pbxproj index aeca83bd4ca..fe2e72ec9b5 100644 --- a/packages/ios_platform_images/example/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/ios_platform_images/example/ios/Runner.xcodeproj/project.pbxproj @@ -10,7 +10,6 @@ 0DE21BF72447752100097E3A /* textfile in Resources */ = {isa = PBXBuildFile; fileRef = 0DE21BF62447752100097E3A /* textfile */; }; 1249487BECEEB37B66E4BD6E /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 0A79FBC35316559720A400F3 /* libPods-Runner.a */; }; 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 31DC4A202AA8BBEB00781E88 /* MockMethodChannel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31DC4A1F2AA8BBEB00781E88 /* MockMethodChannel.swift */; }; 31DC4A212AA8CC9300781E88 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; @@ -52,7 +51,6 @@ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; 3153765C2AAA95AD009694AF /* libios_platform_images.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libios_platform_images.a; sourceTree = BUILT_PRODUCTS_DIR; }; - 31DC4A1F2AA8BBEB00781E88 /* MockMethodChannel.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; path = MockMethodChannel.swift; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 4B56C310C5932F84CD6C17AC /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; @@ -94,14 +92,6 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 31DC4A1E2AA8BBBE00781E88 /* Mocks */ = { - isa = PBXGroup; - children = ( - 31DC4A1F2AA8BBEB00781E88 /* MockMethodChannel.swift */, - ); - path = Mocks; - sourceTree = ""; - }; 790F6E36EBDB3EC4A899BEF5 /* Pods */ = { isa = PBXGroup; children = ( @@ -176,7 +166,6 @@ F76AC1BF266713D00040C8BC /* RunnerTests */ = { isa = PBXGroup; children = ( - 31DC4A1E2AA8BBBE00781E88 /* Mocks */, F76AC1C0266713D00040C8BC /* IosPlatformImagesTests.swift */, F76AC1C2266713D00040C8BC /* Info.plist */, ); @@ -381,7 +370,6 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 31DC4A202AA8BBEB00781E88 /* MockMethodChannel.swift in Sources */, F76AC1C1266713D00040C8BC /* IosPlatformImagesTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/packages/ios_platform_images/example/ios/RunnerTests/IosPlatformImagesTests.swift b/packages/ios_platform_images/example/ios/RunnerTests/IosPlatformImagesTests.swift index 64d94628453..9d9bdf9d9a8 100644 --- a/packages/ios_platform_images/example/ios/RunnerTests/IosPlatformImagesTests.swift +++ b/packages/ios_platform_images/example/ios/RunnerTests/IosPlatformImagesTests.swift @@ -13,8 +13,7 @@ class IosPlatformImagesTests: XCTestCase { let assetName = "flutter" let call = FlutterMethodCall(methodName: "loadImage", arguments: assetName) - let mockChannel = MockMethodChannel() - let plugin = IosPlatformImagesPlugin(channel: mockChannel) + let plugin = IosPlatformImagesPlugin() let resultExpectation = expectation(description: "result block must be called.") @@ -38,8 +37,7 @@ class IosPlatformImagesTests: XCTestCase { let assetName = "flutterNotFound" let call = FlutterMethodCall(methodName: "loadImage", arguments: [assetName]) - let mockChannel = MockMethodChannel() - let plugin = IosPlatformImagesPlugin(channel: mockChannel) + let plugin = IosPlatformImagesPlugin() let resultExpectation = expectation(description: "result block must be called.") @@ -57,8 +55,7 @@ class IosPlatformImagesTests: XCTestCase { let assetName = "textfile" let call = FlutterMethodCall(methodName: "resolveURL", arguments: [assetName]) - let mockChannel = MockMethodChannel() - let plugin = IosPlatformImagesPlugin(channel: mockChannel) + let plugin = IosPlatformImagesPlugin() let resultExpectation = expectation(description: "result block must be called.") @@ -75,9 +72,8 @@ class IosPlatformImagesTests: XCTestCase { func testHandleMethodCall_resolveURL_notFound() { let assetName = "notFound" - let call = FlutterMethodCall(methodName: "resolveURL", arguments: [assetName]) - let mockChannel = MockMethodChannel() - let plugin = IosPlatformImagesPlugin(channel: mockChannel) + let call = FlutterMethodCall(methodName: "resolveURL", arguments: [assetName, NSNull()]) + let plugin = IosPlatformImagesPlugin() let resultExpectation = expectation(description: "result block must be called.") diff --git a/packages/ios_platform_images/example/ios/RunnerTests/Mocks/MockMethodChannel.swift b/packages/ios_platform_images/example/ios/RunnerTests/Mocks/MockMethodChannel.swift deleted file mode 100644 index 77561e6ac24..00000000000 --- a/packages/ios_platform_images/example/ios/RunnerTests/Mocks/MockMethodChannel.swift +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import Foundation - -@testable import ios_platform_images - -final class MockMethodChannel: MethodChannel { - var invokeMethodStub: ((_ methods: String, _ arguments: Any?) -> Void)? = nil - func invokeMethod(_ method: String, arguments: Any?) { - invokeMethodStub?(method, arguments) - } -} diff --git a/packages/ios_platform_images/ios/Classes/IosPlatformImagesPlugin.swift b/packages/ios_platform_images/ios/Classes/IosPlatformImagesPlugin.swift index 5d124481cfd..b1aa4fb22ba 100644 --- a/packages/ios_platform_images/ios/Classes/IosPlatformImagesPlugin.swift +++ b/packages/ios_platform_images/ios/Classes/IosPlatformImagesPlugin.swift @@ -7,18 +7,12 @@ import Foundation public final class IosPlatformImagesPlugin: NSObject, FlutterPlugin { - private let channel: MethodChannel - - init(channel: MethodChannel) { - self.channel = channel - } - public static func register(with registrar: FlutterPluginRegistrar) { let channel = FlutterMethodChannel( name: "plugins.flutter.io/ios_platform_images", binaryMessenger: registrar.messenger()) - let instance = IosPlatformImagesPlugin(channel: channel) + let instance = IosPlatformImagesPlugin() registrar.addMethodCallDelegate(instance, channel: channel) } @@ -54,18 +48,20 @@ public final class IosPlatformImagesPlugin: NSObject, FlutterPlugin { result(imageResult) } - private func resolveURL(_ call: FlutterMethodCall, _ result: @escaping FlutterResult) { - if let args = call.arguments as? [String?] { - let name = args[0] - let extensionName = args.count == 2 ? args[1] : nil + private func resolveURL(_ call: FlutterMethodCall, _ result: @escaping FlutterResult) { + guard let args = call.arguments as? [String?] else { + return result(nil) + } + + let name = args[0] + let extesnsionName = args.count > 1 && args[1] != nil ? args[1] : nil - if let url = Bundle.main.url(forResource: name, withExtension: extensionName) { - result(url.absoluteString) - } else { - result(nil) - } - } else { - result(nil) + guard let url = Bundle.main.url(forResource: name, withExtension: extesnsionName) else { + return result(nil) } + + result(url) + } + } From 101c190b239f8c7101deb28bdd92c739a5da28ff Mon Sep 17 00:00:00 2001 From: Mairramer Date: Thu, 14 Sep 2023 17:54:17 -0300 Subject: [PATCH 13/30] fix test --- .../ios/Classes/IosPlatformImagesPlugin.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/ios_platform_images/ios/Classes/IosPlatformImagesPlugin.swift b/packages/ios_platform_images/ios/Classes/IosPlatformImagesPlugin.swift index b1aa4fb22ba..3333124e417 100644 --- a/packages/ios_platform_images/ios/Classes/IosPlatformImagesPlugin.swift +++ b/packages/ios_platform_images/ios/Classes/IosPlatformImagesPlugin.swift @@ -54,13 +54,13 @@ public final class IosPlatformImagesPlugin: NSObject, FlutterPlugin { } let name = args[0] - let extesnsionName = args.count > 1 && args[1] != nil ? args[1] : nil + let extensionName = args.count > 1 && args[1] != nil ? args[1] : nil - guard let url = Bundle.main.url(forResource: name, withExtension: extesnsionName) else { + guard let url = Bundle.main.url(forResource: name, withExtension: extensionName) else { return result(nil) } - result(url) + result(url.absoluteString) } From 1d2969b629c9c8e0c40a13ff7ec0fd7da8f0ee70 Mon Sep 17 00:00:00 2001 From: Mairramer Date: Thu, 14 Sep 2023 17:54:22 -0300 Subject: [PATCH 14/30] fix test --- .../ios/Classes/IosPlatformImagesPlugin.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/ios_platform_images/ios/Classes/IosPlatformImagesPlugin.swift b/packages/ios_platform_images/ios/Classes/IosPlatformImagesPlugin.swift index 3333124e417..fd4bb344ab9 100644 --- a/packages/ios_platform_images/ios/Classes/IosPlatformImagesPlugin.swift +++ b/packages/ios_platform_images/ios/Classes/IosPlatformImagesPlugin.swift @@ -48,7 +48,7 @@ public final class IosPlatformImagesPlugin: NSObject, FlutterPlugin { result(imageResult) } - private func resolveURL(_ call: FlutterMethodCall, _ result: @escaping FlutterResult) { + private func resolveURL(_ call: FlutterMethodCall, _ result: @escaping FlutterResult) { guard let args = call.arguments as? [String?] else { return result(nil) } @@ -59,7 +59,7 @@ public final class IosPlatformImagesPlugin: NSObject, FlutterPlugin { guard let url = Bundle.main.url(forResource: name, withExtension: extensionName) else { return result(nil) } - + result(url.absoluteString) } From 372ce111c5bab76b694471be07d9e8f7fb729d1f Mon Sep 17 00:00:00 2001 From: Mairramer Date: Fri, 13 Oct 2023 08:54:14 -0300 Subject: [PATCH 15/30] fix scaled image and migrate tests --- .../example/assets/2.0x/multisize.png | Bin 0 -> 2067 bytes .../example/assets/monosize.png | Bin 0 -> 6671 bytes .../example/assets/multisize.png | Bin 0 -> 6671 bytes .../ios/Runner.xcodeproj/project.pbxproj | 4 ++ .../UIImageIosPlatformImagesTests.swift | 39 ++++++++++++++++++ .../ios_platform_images/example/pubspec.yaml | 2 + 6 files changed, 45 insertions(+) create mode 100644 packages/ios_platform_images/example/assets/2.0x/multisize.png create mode 100644 packages/ios_platform_images/example/assets/monosize.png create mode 100644 packages/ios_platform_images/example/assets/multisize.png create mode 100644 packages/ios_platform_images/example/ios/RunnerTests/UIImageIosPlatformImagesTests.swift diff --git a/packages/ios_platform_images/example/assets/2.0x/multisize.png b/packages/ios_platform_images/example/assets/2.0x/multisize.png new file mode 100644 index 0000000000000000000000000000000000000000..508b77122d87d9b350dcbca594a4f42798004abe GIT binary patch literal 2067 zcmV+u2<-QXP)->Hg&S|Dxso(enPUOP8*|*U0bw z)bRh_^Z&`$=Joym0LlH;^!^{E;|xTO4nT_#Jc_Q_^8i1OonL+<000L*Nkl~C=`sw$Dja7 z0x3A#6-q(5c7;kPk~vWp3vo#- zifrRs37bMn&J@|kA0?3}&=MEQ{1;itGy>(cT@aEO6zRrKZ4~weOuF&!?{yYVk>0K$ z#kch+l3;~5mze&zCwci%6PB79cglZ5S8E`Dc>MM05-Uy89LAyolsd;|(e;|YoD ze!*;4a45hMN6G?65*Ui`$(>Q+M!{)(CC??7pNfHvu0xA=` zL{EWgyiX`+3RdI8LP3;xQLq~C6G{fz_<&H*8t)^?ARAAt7dsS8iAN}Cjps;63S8p} z2`?19o^XmnQD7zR>jk%6to5QOaEy@rVrHn^{*Z9m=BHMU_WM-2n6uj*kjf7qF9DM8vU+QEYWNi+-t1XH4Q7$EAiFn~nQNJ(N; zm?2=>~g^ z!fgD@D&GA4aFMKi5EO)+$;)bSrycbpv73)H)J*f$tH+LH>L}1b*pe@95+kKA@tPqd zj>IvPu4EMp5@)+yBzXi01#xJ+o5T>xB6z!KNtEq!TCZRU2@#OwfsLmfSCkk+=}11V z=8+&0lDs3COunvNELw+yWNnl> zxn?Gw5--b~FS%VNK9;$Ied&B= z0dOYGJR2?D&yk3gi9=DGB&Hpk&wV6PndmKZWsnbWN^x01Ad zp(S5kCA8&s5}n0ILhaZsCG?K1{3NP{hFncTS-d5E%grT2i|2N!eG!nTeF>3tEFzMA zE@6`Q9n(OrF6mkVdeX7TNiLQMlE&gBd9eR|9+u$kdhd&%l63d$#ut4`syn7^S35epzbolj%95~PcfXcY+o9$7$MA^^xciNy8d{DL;xdN&%wJ1(6>Xs$ zbzM;J`;DZfs21AMT%d~*a>q7@e|Edpva31}ouif11K9nOq?Zd_kS+w#(r#DBQW+f` zNr85MIcL&Z>J2k2mLjRUk7U^#zCT?kHb)Nv*8N8E#B~fLNPTG~&Fm_>gOU^lNG^3x z-uC;a{f^@xAt-&RGkM#;?S{v94iXGYE1?eWTp$qLzdwAhm=2=^p!@&+;5y8ZB|!Io z-^Y^3_l0LM@7C#Mc?)C5SQ3ElTXSJTnvw3l*-v*&0ISy7XArh$W2SJc5R)|$nmJof30fDgCAv{S5a7_+`6qmz)aEopK z%I-j0_>qA3#d=97)j_pbuWbVf=#Ke7AnujU5L$v~Vca)05{PI17?B)b`vGHNJjs|O x1a_8;xD9g_Q5#kBwc002ovPDHLkV1m-}*;W7m literal 0 HcmV?d00001 diff --git a/packages/ios_platform_images/example/assets/monosize.png b/packages/ios_platform_images/example/assets/monosize.png new file mode 100644 index 0000000000000000000000000000000000000000..28e7367f145164ac48c75729a89ac8fde595ada5 GIT binary patch literal 6671 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 1.0 { + XCTAssertEqual(image.size.height, height2x, accuracy: 0.00001) + } else { + XCTAssertEqual(image.size.height, height1x, accuracy: 0.00001) + } + } + } + + func testSingleResolutionFindsImage() { + // When there is no resolution-aware asset, the main asset should be used. + if let image = flutterImageWithName(withName: "assets/monosize.png") { + XCTAssertNotNil(image) + } + } + + func testMissingImageReturnsNil() { + let image = flutterImageWithName(withName: "assets/no_such_image.png") + XCTAssertNil(image) + } +} diff --git a/packages/ios_platform_images/example/pubspec.yaml b/packages/ios_platform_images/example/pubspec.yaml index 6674a3a04ae..f8511e6e9c1 100644 --- a/packages/ios_platform_images/example/pubspec.yaml +++ b/packages/ios_platform_images/example/pubspec.yaml @@ -25,4 +25,6 @@ dev_dependencies: sdk: flutter flutter: + assets: + - assets/ uses-material-design: true From aef7985ee90d5dd7d734cb626c008fbf8c33c6f6 Mon Sep 17 00:00:00 2001 From: Mairramer Date: Fri, 13 Oct 2023 10:44:03 -0300 Subject: [PATCH 16/30] migrate pigeon to swift --- .../ios/Runner.xcodeproj/project.pbxproj | 4 +- .../RunnerTests/IosPlatformImagesTests.swift | 90 +++------- .../UIImage+ios_platform_imagesTests.m | 43 ----- .../ios/Classes/IosPlatformImagesPlugin.h | 0 .../ios/Classes/IosPlatformImagesPlugin.m | 0 .../ios/Classes/IosPlatformImagesPlugin.swift | 59 ++----- .../ios/Classes/MethodChannel.swift | 16 -- .../ios/Classes/messages.g.h | 47 ----- .../ios/Classes/messages.g.m | 163 ------------------ .../ios/Classes/messages.g.swift | 162 +++++++++++++++++ .../lib/src/messages.g.dart | 15 +- .../ios_platform_images/pigeons/messages.dart | 6 +- .../test/ios_platform_images_test.dart | 1 - 13 files changed, 212 insertions(+), 394 deletions(-) delete mode 100644 packages/ios_platform_images/example/ios/RunnerTests/UIImage+ios_platform_imagesTests.m delete mode 100644 packages/ios_platform_images/ios/Classes/IosPlatformImagesPlugin.h delete mode 100644 packages/ios_platform_images/ios/Classes/IosPlatformImagesPlugin.m delete mode 100644 packages/ios_platform_images/ios/Classes/MethodChannel.swift delete mode 100644 packages/ios_platform_images/ios/Classes/messages.g.h delete mode 100644 packages/ios_platform_images/ios/Classes/messages.g.m create mode 100644 packages/ios_platform_images/ios/Classes/messages.g.swift diff --git a/packages/ios_platform_images/example/ios/Runner.xcodeproj/project.pbxproj b/packages/ios_platform_images/example/ios/Runner.xcodeproj/project.pbxproj index a28a6cc90b8..b716b9d8e28 100644 --- a/packages/ios_platform_images/example/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/ios_platform_images/example/ios/Runner.xcodeproj/project.pbxproj @@ -323,7 +323,7 @@ 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; - buildActionMask = 12; + buildActionMask = 8; files = ( ); inputPaths = ( @@ -331,7 +331,7 @@ name = "Run Script"; outputPaths = ( ); - runOnlyForDeploymentPostprocessing = 0; + runOnlyForDeploymentPostprocessing = 1; shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build\n"; }; diff --git a/packages/ios_platform_images/example/ios/RunnerTests/IosPlatformImagesTests.swift b/packages/ios_platform_images/example/ios/RunnerTests/IosPlatformImagesTests.swift index 9d9bdf9d9a8..e38abe9f760 100644 --- a/packages/ios_platform_images/example/ios/RunnerTests/IosPlatformImagesTests.swift +++ b/packages/ios_platform_images/example/ios/RunnerTests/IosPlatformImagesTests.swift @@ -8,81 +8,43 @@ import XCTest @testable import ios_platform_images class IosPlatformImagesTests: XCTestCase { + let plugin = IosPlatformImagesPlugin() - func testHandleMethodCall_loadImage() { + func testLoadImage() { let assetName = "flutter" + let imageData = plugin.loadImage(name: assetName) - let call = FlutterMethodCall(methodName: "loadImage", arguments: assetName) - let plugin = IosPlatformImagesPlugin() - - let resultExpectation = expectation(description: "result block must be called.") - - plugin.handle(call) { result in - let result = result as? [String: Any] - XCTAssertNotNil(result) - - let scale = result?["scale"] as? CGFloat - let data = result?["data"] as? FlutterStandardTypedData - - XCTAssertNotNil(scale) - XCTAssertNotNil(data) - - resultExpectation.fulfill() - } - - waitForExpectations(timeout: 2, handler: nil) + XCTAssertNotNil(imageData) + XCTAssertNotNil(imageData?.data) } - func testHandleMethodCall_loadImage_notFound() { - let assetName = "flutterNotFound" - - let call = FlutterMethodCall(methodName: "loadImage", arguments: [assetName]) - let plugin = IosPlatformImagesPlugin() - - let resultExpectation = expectation(description: "result block must be called.") - - plugin.handle(call) { result in - let result = result as? [String: Any] - - XCTAssertNil(result) - resultExpectation.fulfill() - } + func testLoadImageNotFound() { + let assetName = "notFound" + let imageData = plugin.loadImage(name: assetName) - waitForExpectations(timeout: 2, handler: nil) + XCTAssertNil(imageData) } - func testHandleMethodCall_resolveURL() { - let assetName = "textfile" - - let call = FlutterMethodCall(methodName: "resolveURL", arguments: [assetName]) - let plugin = IosPlatformImagesPlugin() - - let resultExpectation = expectation(description: "result block must be called.") - - plugin.handle(call) { result in - let result = result as? String - XCTAssertNotNil(result) - XCTAssertEqual(result?.components(separatedBy: "/").last, assetName) - resultExpectation.fulfill() + func testResolveURL() { + let resourceName = "textfile" + let extensionName: String? = nil + do { + let url = try plugin.resolveUrl(resourceName: resourceName, extension: extensionName) + XCTAssertNotNil(url) + XCTAssertTrue(url!.contains(resourceName)) + } catch { + XCTFail("Error while resolving URL: \(error)") } - - waitForExpectations(timeout: 1, handler: nil) } - func testHandleMethodCall_resolveURL_notFound() { - let assetName = "notFound" - - let call = FlutterMethodCall(methodName: "resolveURL", arguments: [assetName, NSNull()]) - let plugin = IosPlatformImagesPlugin() - - let resultExpectation = expectation(description: "result block must be called.") - - plugin.handle(call) { result in - XCTAssertNil(result) - resultExpectation.fulfill() + func testResolveURLNotFound() { + let resourceName = "notFound" + let extensionName: String? = nil + do { + let url = try plugin.resolveUrl(resourceName: resourceName, extension: extensionName) + XCTAssertNil(url) + } catch { + XCTFail("Error while resolving URL: \(error)") } - - waitForExpectations(timeout: 1, handler: nil) } - } diff --git a/packages/ios_platform_images/example/ios/RunnerTests/UIImage+ios_platform_imagesTests.m b/packages/ios_platform_images/example/ios/RunnerTests/UIImage+ios_platform_imagesTests.m deleted file mode 100644 index d107ac4bd34..00000000000 --- a/packages/ios_platform_images/example/ios/RunnerTests/UIImage+ios_platform_imagesTests.m +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -@import ios_platform_images; -@import XCTest; - -// The tests test the UIImage extension which is a public API intended for use from native code -// outside of the plugin (see package README). Any change that requires changing existing tests -// in this file (unless it's just to reflect changes to the test assets) is a BREAKING CHANGE for -// the package. -@interface UIImageExtensionTests : XCTestCase -@end - -@implementation UIImageExtensionTests - -- (void)testMultiResolutionImageUsesBest { - UIImage *image = [UIImage flutterImageWithName:@"assets/multisize.png"]; - XCTAssertNotNil(image); - const double height1x = 125; // The height of assets/multisize.png. - const double height2x = 250; // The height of assets/2.0x/multisize.png. - // Loading assets should get the best available asset for the screen scale when resolution-aware - // assets are available (and the example app has 1x and 2x for this asset). See - // https://docs.flutter.dev/ui/assets/assets-and-images#resolution-aware - if (UIScreen.mainScreen.scale > 1.0) { - XCTAssertEqualWithAccuracy(image.size.height, height2x, 0.00001); - } else { - XCTAssertEqualWithAccuracy(image.size.height, height1x, 0.00001); - } -} - -- (void)testSingleResolutionFindsImage { - // When there is no resolution-aware asset, the main asset should be used. - UIImage *image = [UIImage flutterImageWithName:@"assets/monosize.png"]; - XCTAssertNotNil(image); -} - -- (void)testMissingImageReturnsNil { - UIImage *image = [UIImage flutterImageWithName:@"assets/no_such_image.png"]; - XCTAssertNil(image); -} - -@end diff --git a/packages/ios_platform_images/ios/Classes/IosPlatformImagesPlugin.h b/packages/ios_platform_images/ios/Classes/IosPlatformImagesPlugin.h deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/packages/ios_platform_images/ios/Classes/IosPlatformImagesPlugin.m b/packages/ios_platform_images/ios/Classes/IosPlatformImagesPlugin.m deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/packages/ios_platform_images/ios/Classes/IosPlatformImagesPlugin.swift b/packages/ios_platform_images/ios/Classes/IosPlatformImagesPlugin.swift index fd4bb344ab9..a47f0673395 100644 --- a/packages/ios_platform_images/ios/Classes/IosPlatformImagesPlugin.swift +++ b/packages/ios_platform_images/ios/Classes/IosPlatformImagesPlugin.swift @@ -5,63 +5,34 @@ import Flutter import Foundation -public final class IosPlatformImagesPlugin: NSObject, FlutterPlugin { - +public final class IosPlatformImagesPlugin: NSObject, FlutterPlugin, PlatformImagesApi { public static func register(with registrar: FlutterPluginRegistrar) { - let channel = FlutterMethodChannel( - name: "plugins.flutter.io/ios_platform_images", - binaryMessenger: registrar.messenger()) - let instance = IosPlatformImagesPlugin() - registrar.addMethodCallDelegate(instance, channel: channel) + let messenger = registrar.messenger() + PlatformImagesApiSetup.setUp(binaryMessenger: messenger, api: instance) } - public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { - switch call.method { - case "loadImage": - loadImage(call, result) - case "resolveURL": - resolveURL(call, result) - default: - result(FlutterMethodNotImplemented) - } - } - - private func loadImage(_ call: FlutterMethodCall, _ result: @escaping FlutterResult) { - guard let name = call.arguments as? String else { - result(nil) - return - } - + func loadImage(name: String) -> PlatformImageData? { guard let image = UIImage(named: name), let data = image.pngData() else { - result(nil) - return + return nil } - let imageResult: [String: Any] = [ - "scale": image.scale, - "data": FlutterStandardTypedData(bytes: data), - ] - - result(imageResult) + return PlatformImageData( + data: FlutterStandardTypedData(bytes: data), scale: Double(image.scale)) } - private func resolveURL(_ call: FlutterMethodCall, _ result: @escaping FlutterResult) { - guard let args = call.arguments as? [String?] else { - return result(nil) - } - - let name = args[0] - let extensionName = args.count > 1 && args[1] != nil ? args[1] : nil - - guard let url = Bundle.main.url(forResource: name, withExtension: extensionName) else { - return result(nil) + func resolveUrl(resourceName: String, extension: String?) throws -> String? { + guard + let url = Bundle.main.url( + forResource: resourceName, + withExtension: `extension`) + else { + return nil } - result(url.absoluteString) - + return url.absoluteString } } diff --git a/packages/ios_platform_images/ios/Classes/MethodChannel.swift b/packages/ios_platform_images/ios/Classes/MethodChannel.swift deleted file mode 100644 index 5d52790dd4b..00000000000 --- a/packages/ios_platform_images/ios/Classes/MethodChannel.swift +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import Flutter - -/// A channel for platform code to communicate with the Dart code. -protocol MethodChannel { - /// Invokes a method in Dart code. - /// - Parameter method the method name. - /// - Parameter arguments the method arguments. - func invokeMethod(_ method: String, arguments: Any?) -} - -/// A default implementation of the `MethodChannel` protocol. -extension FlutterMethodChannel: MethodChannel {} diff --git a/packages/ios_platform_images/ios/Classes/messages.g.h b/packages/ios_platform_images/ios/Classes/messages.g.h deleted file mode 100644 index f4235cf9063..00000000000 --- a/packages/ios_platform_images/ios/Classes/messages.g.h +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. -// Autogenerated from Pigeon (v11.0.1), do not edit directly. -// See also: https://pub.dev/packages/pigeon - -#import - -@protocol FlutterBinaryMessenger; -@protocol FlutterMessageCodec; -@class FlutterError; -@class FlutterStandardTypedData; - -NS_ASSUME_NONNULL_BEGIN - -@class FPIPlatformImageData; - -/// A serialization of a platform image's data. -@interface FPIPlatformImageData : NSObject -/// `init` unavailable to enforce nonnull fields, see the `make` class method. -- (instancetype)init NS_UNAVAILABLE; -+ (instancetype)makeWithData:(FlutterStandardTypedData *)data scale:(NSNumber *)scale; -/// The image data. -@property(nonatomic, strong) FlutterStandardTypedData *data; -/// The image's scale factor. -@property(nonatomic, strong) NSNumber *scale; -@end - -/// The codec used by FPIPlatformImagesApi. -NSObject *FPIPlatformImagesApiGetCodec(void); - -@protocol FPIPlatformImagesApi -/// Returns the URL for the given resource, or null if no such resource is -/// found. -- (nullable NSString *)resolveURLForResource:(NSString *)resourceName - withExtension:(nullable NSString *)extension - error:(FlutterError *_Nullable *_Nonnull)error; -/// Returns the data for the image resource with the given name, or null if -/// no such resource is found. -- (nullable FPIPlatformImageData *)loadImageWithName:(NSString *)name - error:(FlutterError *_Nullable *_Nonnull)error; -@end - -extern void FPIPlatformImagesApiSetup(id binaryMessenger, - NSObject *_Nullable api); - -NS_ASSUME_NONNULL_END diff --git a/packages/ios_platform_images/ios/Classes/messages.g.m b/packages/ios_platform_images/ios/Classes/messages.g.m deleted file mode 100644 index b96e65ea263..00000000000 --- a/packages/ios_platform_images/ios/Classes/messages.g.m +++ /dev/null @@ -1,163 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. -// Autogenerated from Pigeon (v11.0.1), do not edit directly. -// See also: https://pub.dev/packages/pigeon - -#import "messages.g.h" - -#if TARGET_OS_OSX -#import -#else -#import -#endif - -#if !__has_feature(objc_arc) -#error File requires ARC to be enabled. -#endif - -static NSArray *wrapResult(id result, FlutterError *error) { - if (error) { - return @[ - error.code ?: [NSNull null], error.message ?: [NSNull null], error.details ?: [NSNull null] - ]; - } - return @[ result ?: [NSNull null] ]; -} -static id GetNullableObjectAtIndex(NSArray *array, NSInteger key) { - id result = array[key]; - return (result == [NSNull null]) ? nil : result; -} - -@interface FPIPlatformImageData () -+ (FPIPlatformImageData *)fromList:(NSArray *)list; -+ (nullable FPIPlatformImageData *)nullableFromList:(NSArray *)list; -- (NSArray *)toList; -@end - -@implementation FPIPlatformImageData -+ (instancetype)makeWithData:(FlutterStandardTypedData *)data scale:(NSNumber *)scale { - FPIPlatformImageData *pigeonResult = [[FPIPlatformImageData alloc] init]; - pigeonResult.data = data; - pigeonResult.scale = scale; - return pigeonResult; -} -+ (FPIPlatformImageData *)fromList:(NSArray *)list { - FPIPlatformImageData *pigeonResult = [[FPIPlatformImageData alloc] init]; - pigeonResult.data = GetNullableObjectAtIndex(list, 0); - NSAssert(pigeonResult.data != nil, @""); - pigeonResult.scale = GetNullableObjectAtIndex(list, 1); - NSAssert(pigeonResult.scale != nil, @""); - return pigeonResult; -} -+ (nullable FPIPlatformImageData *)nullableFromList:(NSArray *)list { - return (list) ? [FPIPlatformImageData fromList:list] : nil; -} -- (NSArray *)toList { - return @[ - (self.data ?: [NSNull null]), - (self.scale ?: [NSNull null]), - ]; -} -@end - -@interface FPIPlatformImagesApiCodecReader : FlutterStandardReader -@end -@implementation FPIPlatformImagesApiCodecReader -- (nullable id)readValueOfType:(UInt8)type { - switch (type) { - case 128: - return [FPIPlatformImageData fromList:[self readValue]]; - default: - return [super readValueOfType:type]; - } -} -@end - -@interface FPIPlatformImagesApiCodecWriter : FlutterStandardWriter -@end -@implementation FPIPlatformImagesApiCodecWriter -- (void)writeValue:(id)value { - if ([value isKindOfClass:[FPIPlatformImageData class]]) { - [self writeByte:128]; - [self writeValue:[value toList]]; - } else { - [super writeValue:value]; - } -} -@end - -@interface FPIPlatformImagesApiCodecReaderWriter : FlutterStandardReaderWriter -@end -@implementation FPIPlatformImagesApiCodecReaderWriter -- (FlutterStandardWriter *)writerWithData:(NSMutableData *)data { - return [[FPIPlatformImagesApiCodecWriter alloc] initWithData:data]; -} -- (FlutterStandardReader *)readerWithData:(NSData *)data { - return [[FPIPlatformImagesApiCodecReader alloc] initWithData:data]; -} -@end - -NSObject *FPIPlatformImagesApiGetCodec(void) { - static FlutterStandardMessageCodec *sSharedObject = nil; - static dispatch_once_t sPred = 0; - dispatch_once(&sPred, ^{ - FPIPlatformImagesApiCodecReaderWriter *readerWriter = - [[FPIPlatformImagesApiCodecReaderWriter alloc] init]; - sSharedObject = [FlutterStandardMessageCodec codecWithReaderWriter:readerWriter]; - }); - return sSharedObject; -} - -void FPIPlatformImagesApiSetup(id binaryMessenger, - NSObject *api) { - /// Returns the URL for the given resource, or null if no such resource is - /// found. - { - FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.ios_platform_images.PlatformImagesApi.resolveUrl" - binaryMessenger:binaryMessenger - codec:FPIPlatformImagesApiGetCodec()]; - if (api) { - NSCAssert([api respondsToSelector:@selector(resolveURLForResource:withExtension:error:)], - @"FPIPlatformImagesApi api (%@) doesn't respond to " - @"@selector(resolveURLForResource:withExtension:error:)", - api); - [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { - NSArray *args = message; - NSString *arg_resourceName = GetNullableObjectAtIndex(args, 0); - NSString *arg_extension = GetNullableObjectAtIndex(args, 1); - FlutterError *error; - NSString *output = [api resolveURLForResource:arg_resourceName - withExtension:arg_extension - error:&error]; - callback(wrapResult(output, error)); - }]; - } else { - [channel setMessageHandler:nil]; - } - } - /// Returns the data for the image resource with the given name, or null if - /// no such resource is found. - { - FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] - initWithName:@"dev.flutter.pigeon.ios_platform_images.PlatformImagesApi.loadImage" - binaryMessenger:binaryMessenger - codec:FPIPlatformImagesApiGetCodec()]; - if (api) { - NSCAssert( - [api respondsToSelector:@selector(loadImageWithName:error:)], - @"FPIPlatformImagesApi api (%@) doesn't respond to @selector(loadImageWithName:error:)", - api); - [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { - NSArray *args = message; - NSString *arg_name = GetNullableObjectAtIndex(args, 0); - FlutterError *error; - FPIPlatformImageData *output = [api loadImageWithName:arg_name error:&error]; - callback(wrapResult(output, error)); - }]; - } else { - [channel setMessageHandler:nil]; - } - } -} diff --git a/packages/ios_platform_images/ios/Classes/messages.g.swift b/packages/ios_platform_images/ios/Classes/messages.g.swift new file mode 100644 index 00000000000..30e14c74242 --- /dev/null +++ b/packages/ios_platform_images/ios/Classes/messages.g.swift @@ -0,0 +1,162 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// Autogenerated from Pigeon (v11.0.1), do not edit directly. +// See also: https://pub.dev/packages/pigeon + +import Foundation + +#if os(iOS) + import Flutter +#elseif os(macOS) + import FlutterMacOS +#else + #error("Unsupported platform.") +#endif + +private func isNullish(_ value: Any?) -> Bool { + return value is NSNull || value == nil +} + +private func wrapResult(_ result: Any?) -> [Any?] { + return [result] +} + +private func wrapError(_ error: Any) -> [Any?] { + if let flutterError = error as? FlutterError { + return [ + flutterError.code, + flutterError.message, + flutterError.details, + ] + } + return [ + "\(error)", + "\(type(of: error))", + "Stacktrace: \(Thread.callStackSymbols)", + ] +} + +private func nilOrValue(_ value: Any?) -> T? { + if value is NSNull { return nil } + return value as! T? +} + +/// A serialization of a platform image's data. +/// +/// Generated class from Pigeon that represents data sent in messages. +struct PlatformImageData { + /// The image data. + var data: FlutterStandardTypedData + /// The image's scale factor. + var scale: Double + + static func fromList(_ list: [Any?]) -> PlatformImageData? { + let data = list[0] as! FlutterStandardTypedData + let scale = list[1] as! Double + + return PlatformImageData( + data: data, + scale: scale + ) + } + func toList() -> [Any?] { + return [ + data, + scale, + ] + } +} +private class PlatformImagesApiCodecReader: FlutterStandardReader { + override func readValue(ofType type: UInt8) -> Any? { + switch type { + case 128: + return PlatformImageData.fromList(self.readValue() as! [Any?]) + default: + return super.readValue(ofType: type) + } + } +} + +private class PlatformImagesApiCodecWriter: FlutterStandardWriter { + override func writeValue(_ value: Any) { + if let value = value as? PlatformImageData { + super.writeByte(128) + super.writeValue(value.toList()) + } else { + super.writeValue(value) + } + } +} + +private class PlatformImagesApiCodecReaderWriter: FlutterStandardReaderWriter { + override func reader(with data: Data) -> FlutterStandardReader { + return PlatformImagesApiCodecReader(data: data) + } + + override func writer(with data: NSMutableData) -> FlutterStandardWriter { + return PlatformImagesApiCodecWriter(data: data) + } +} + +class PlatformImagesApiCodec: FlutterStandardMessageCodec { + static let shared = PlatformImagesApiCodec(readerWriter: PlatformImagesApiCodecReaderWriter()) +} + +/// Generated protocol from Pigeon that represents a handler of messages from Flutter. +protocol PlatformImagesApi { + /// Returns the URL for the given resource, or null if no such resource is + /// found. + func resolveUrl(resourceName: String, extension: String?) throws -> String? + /// Returns the data for the image resource with the given name, or null if + /// no such resource is found. + func loadImage(name: String) throws -> PlatformImageData? +} + +/// Generated setup class from Pigeon to handle messages through the `binaryMessenger`. +class PlatformImagesApiSetup { + /// The codec used by PlatformImagesApi. + static var codec: FlutterStandardMessageCodec { PlatformImagesApiCodec.shared } + /// Sets up an instance of `PlatformImagesApi` to handle messages through the `binaryMessenger`. + static func setUp(binaryMessenger: FlutterBinaryMessenger, api: PlatformImagesApi?) { + /// Returns the URL for the given resource, or null if no such resource is + /// found. + let resolveUrlChannel = FlutterBasicMessageChannel( + name: "dev.flutter.pigeon.ios_platform_images.PlatformImagesApi.resolveUrl", + binaryMessenger: binaryMessenger, codec: codec) + if let api = api { + resolveUrlChannel.setMessageHandler { message, reply in + let args = message as! [Any?] + let resourceNameArg = args[0] as! String + let extensionArg: String? = nilOrValue(args[1]) + do { + let result = try api.resolveUrl(resourceName: resourceNameArg, extension: extensionArg) + reply(wrapResult(result)) + } catch { + reply(wrapError(error)) + } + } + } else { + resolveUrlChannel.setMessageHandler(nil) + } + /// Returns the data for the image resource with the given name, or null if + /// no such resource is found. + let loadImageChannel = FlutterBasicMessageChannel( + name: "dev.flutter.pigeon.ios_platform_images.PlatformImagesApi.loadImage", + binaryMessenger: binaryMessenger, codec: codec) + if let api = api { + loadImageChannel.setMessageHandler { message, reply in + let args = message as! [Any?] + let nameArg = args[0] as! String + do { + let result = try api.loadImage(name: nameArg) + reply(wrapResult(result)) + } catch { + reply(wrapError(error)) + } + } + } else { + loadImageChannel.setMessageHandler(nil) + } + } +} diff --git a/packages/ios_platform_images/lib/src/messages.g.dart b/packages/ios_platform_images/lib/src/messages.g.dart index a3a5ab43350..ca7eaa8674a 100644 --- a/packages/ios_platform_images/lib/src/messages.g.dart +++ b/packages/ios_platform_images/lib/src/messages.g.dart @@ -55,7 +55,7 @@ class _PlatformImagesApiCodec extends StandardMessageCodec { @override Object? readValueOfType(int type, ReadBuffer buffer) { switch (type) { - case 128: + case 128: return PlatformImageData.decode(readValue(buffer)!); default: return super.readValueOfType(type, buffer); @@ -75,14 +75,12 @@ class PlatformImagesApi { /// Returns the URL for the given resource, or null if no such resource is /// found. - Future resolveUrl( - String arg_resourceName, String? arg_extension) async { + Future resolveUrl(String arg_resourceName, String? arg_extension) async { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.ios_platform_images.PlatformImagesApi.resolveUrl', - codec, + 'dev.flutter.pigeon.ios_platform_images.PlatformImagesApi.resolveUrl', codec, binaryMessenger: _binaryMessenger); - final List? replyList = await channel - .send([arg_resourceName, arg_extension]) as List?; + final List? replyList = + await channel.send([arg_resourceName, arg_extension]) as List?; if (replyList == null) { throw PlatformException( code: 'channel-error', @@ -103,8 +101,7 @@ class PlatformImagesApi { /// no such resource is found. Future loadImage(String arg_name) async { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.ios_platform_images.PlatformImagesApi.loadImage', - codec, + 'dev.flutter.pigeon.ios_platform_images.PlatformImagesApi.loadImage', codec, binaryMessenger: _binaryMessenger); final List? replyList = await channel.send([arg_name]) as List?; diff --git a/packages/ios_platform_images/pigeons/messages.dart b/packages/ios_platform_images/pigeons/messages.dart index d0a8d347317..36cd9931e5b 100644 --- a/packages/ios_platform_images/pigeons/messages.dart +++ b/packages/ios_platform_images/pigeons/messages.dart @@ -6,9 +6,7 @@ import 'package:pigeon/pigeon.dart'; @ConfigurePigeon(PigeonOptions( dartOut: 'lib/src/messages.g.dart', - objcOptions: ObjcOptions(prefix: 'FPI'), - objcHeaderOut: 'ios/Classes/messages.g.h', - objcSourceOut: 'ios/Classes/messages.g.m', + swiftOut: 'ios/Classes/messages.g.swift', copyrightHeader: 'pigeons/copyright.txt', )) @@ -27,11 +25,9 @@ class PlatformImageData { abstract class PlatformImagesApi { /// Returns the URL for the given resource, or null if no such resource is /// found. - @ObjCSelector('resolveURLForResource:withExtension:') String? resolveUrl(String resourceName, String? extension); /// Returns the data for the image resource with the given name, or null if /// no such resource is found. - @ObjCSelector('loadImageWithName:') PlatformImageData? loadImage(String name); } diff --git a/packages/ios_platform_images/test/ios_platform_images_test.dart b/packages/ios_platform_images/test/ios_platform_images_test.dart index 8715f18c349..04605c1e5cb 100644 --- a/packages/ios_platform_images/test/ios_platform_images_test.dart +++ b/packages/ios_platform_images/test/ios_platform_images_test.dart @@ -2,7 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:ios_platform_images/ios_platform_images.dart'; From 78cbc82f2c5d6074a4f559d76c89e80d91f35c9f Mon Sep 17 00:00:00 2001 From: Mairramer Date: Fri, 13 Oct 2023 10:51:12 -0300 Subject: [PATCH 17/30] format code --- .../ios_platform_images/lib/src/messages.g.dart | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/packages/ios_platform_images/lib/src/messages.g.dart b/packages/ios_platform_images/lib/src/messages.g.dart index ca7eaa8674a..a3a5ab43350 100644 --- a/packages/ios_platform_images/lib/src/messages.g.dart +++ b/packages/ios_platform_images/lib/src/messages.g.dart @@ -55,7 +55,7 @@ class _PlatformImagesApiCodec extends StandardMessageCodec { @override Object? readValueOfType(int type, ReadBuffer buffer) { switch (type) { - case 128: + case 128: return PlatformImageData.decode(readValue(buffer)!); default: return super.readValueOfType(type, buffer); @@ -75,12 +75,14 @@ class PlatformImagesApi { /// Returns the URL for the given resource, or null if no such resource is /// found. - Future resolveUrl(String arg_resourceName, String? arg_extension) async { + Future resolveUrl( + String arg_resourceName, String? arg_extension) async { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.ios_platform_images.PlatformImagesApi.resolveUrl', codec, + 'dev.flutter.pigeon.ios_platform_images.PlatformImagesApi.resolveUrl', + codec, binaryMessenger: _binaryMessenger); - final List? replyList = - await channel.send([arg_resourceName, arg_extension]) as List?; + final List? replyList = await channel + .send([arg_resourceName, arg_extension]) as List?; if (replyList == null) { throw PlatformException( code: 'channel-error', @@ -101,7 +103,8 @@ class PlatformImagesApi { /// no such resource is found. Future loadImage(String arg_name) async { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.ios_platform_images.PlatformImagesApi.loadImage', codec, + 'dev.flutter.pigeon.ios_platform_images.PlatformImagesApi.loadImage', + codec, binaryMessenger: _binaryMessenger); final List? replyList = await channel.send([arg_name]) as List?; From 45d185d57408ee0f78fbecac929d97f1ee46923a Mon Sep 17 00:00:00 2001 From: Mairramer Date: Fri, 13 Oct 2023 10:56:15 -0300 Subject: [PATCH 18/30] fix build script --- .../example/ios/Runner.xcodeproj/project.pbxproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/ios_platform_images/example/ios/Runner.xcodeproj/project.pbxproj b/packages/ios_platform_images/example/ios/Runner.xcodeproj/project.pbxproj index b716b9d8e28..a28a6cc90b8 100644 --- a/packages/ios_platform_images/example/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/ios_platform_images/example/ios/Runner.xcodeproj/project.pbxproj @@ -323,7 +323,7 @@ 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; - buildActionMask = 8; + buildActionMask = 12; files = ( ); inputPaths = ( @@ -331,7 +331,7 @@ name = "Run Script"; outputPaths = ( ); - runOnlyForDeploymentPostprocessing = 1; + runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build\n"; }; From a9a4879cc5408c9d11c70a92c595c9b8d73b95bd Mon Sep 17 00:00:00 2001 From: Mairramer Date: Fri, 13 Oct 2023 17:22:07 -0300 Subject: [PATCH 19/30] improves --- packages/ios_platform_images/README.md | 10 +++--- .../UIImageIosPlatformImagesTests.swift | 34 +++++++++++-------- .../Classes/UIImageIosPlatformImages.swift | 1 - packages/ios_platform_images/pubspec.yaml | 2 +- 4 files changed, 25 insertions(+), 22 deletions(-) diff --git a/packages/ios_platform_images/README.md b/packages/ios_platform_images/README.md index 9265b108595..42d2fedcdbc 100644 --- a/packages/ios_platform_images/README.md +++ b/packages/ios_platform_images/README.md @@ -36,11 +36,11 @@ Widget build(BuildContext context) { ### Flutter->iOS Example -```objc -#import +```swift +import ios_platform_images -static UIImageView* MakeImage() { - UIImage* image = [UIImage flutterImageWithName:@"assets/foo.png"]; - return [[UIImageView alloc] initWithImage:image]; +func makeImage() -> UIImageView { + let image = flutterImageWithName(withName: "assets/foo.png") + return UIImageView(image: image) } ``` diff --git a/packages/ios_platform_images/example/ios/RunnerTests/UIImageIosPlatformImagesTests.swift b/packages/ios_platform_images/example/ios/RunnerTests/UIImageIosPlatformImagesTests.swift index e4a0b5799d9..625a1cf8025 100644 --- a/packages/ios_platform_images/example/ios/RunnerTests/UIImageIosPlatformImagesTests.swift +++ b/packages/ios_platform_images/example/ios/RunnerTests/UIImageIosPlatformImagesTests.swift @@ -10,30 +10,34 @@ import XCTest final class UIImageIosPlatformImagesTests: XCTestCase { func testMultiResolutionImageUsesBest() { - if let image = flutterImageWithName(withName: "assets/multisize.png") { - XCTAssertNotNil(image) - let height1x: Double = 125 // The height of assets/multisize.png. - let height2x: Double = 250 // The height of assets/2.0x/multisize.png. - - // Loading assets should get the best available asset for the screen scale when resolution-aware - // assets are available (and the example app has 1x and 2x for this asset). - if UIScreen.main.scale > 1.0 { - XCTAssertEqual(image.size.height, height2x, accuracy: 0.00001) - } else { - XCTAssertEqual(image.size.height, height1x, accuracy: 0.00001) - } + guard let image = flutterImageWithName(withName: "assets/multisize.png") else { + return XCTFail("Image not found") } + + let height1x: Double = 125 // The height of assets/multisize.png. + let height2x: Double = 250 // The height of assets/2.0x/multisize.png. + + // Loading assets should get the best available asset for the screen scale when resolution-aware + // assets are available (and the example app has 1x and 2x for this asset). + if UIScreen.main.scale > 1.0 { + XCTAssertEqual(image.size.height, height2x, accuracy: 0.00001) + } else { + XCTAssertEqual(image.size.height, height1x, accuracy: 0.00001) + } + } func testSingleResolutionFindsImage() { // When there is no resolution-aware asset, the main asset should be used. - if let image = flutterImageWithName(withName: "assets/monosize.png") { - XCTAssertNotNil(image) + guard let image = flutterImageWithName(withName: "assets/monosize.png") else { + return XCTFail("Image not found") } + + XCTAssertEqual(image.size.height, 125, accuracy: 0.00001) } func testMissingImageReturnsNil() { let image = flutterImageWithName(withName: "assets/no_such_image.png") - XCTAssertNil(image) + return XCTAssertNil(image) } } diff --git a/packages/ios_platform_images/ios/Classes/UIImageIosPlatformImages.swift b/packages/ios_platform_images/ios/Classes/UIImageIosPlatformImages.swift index 477bce5224c..afee7de85f6 100644 --- a/packages/ios_platform_images/ios/Classes/UIImageIosPlatformImages.swift +++ b/packages/ios_platform_images/ios/Classes/UIImageIosPlatformImages.swift @@ -4,7 +4,6 @@ import Flutter import Foundation -import SwiftUI /// Loads a UIImage from the embedded Flutter project's assets. /// diff --git a/packages/ios_platform_images/pubspec.yaml b/packages/ios_platform_images/pubspec.yaml index 4b5745f5908..ac6d7bdb649 100644 --- a/packages/ios_platform_images/pubspec.yaml +++ b/packages/ios_platform_images/pubspec.yaml @@ -2,7 +2,7 @@ name: ios_platform_images description: A plugin to share images between Flutter and iOS in add-to-app setups. repository: https://github.com/flutter/packages/tree/main/packages/ios_platform_images issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+ios_platform_images%22 -version: 0.2.3 +version: 0.2.3 environment: sdk: ">=2.19.0 <4.0.0" From 364be83eeef22a7e0a86bd23721fb88e8c2f780b Mon Sep 17 00:00:00 2001 From: Mairramer Date: Fri, 13 Oct 2023 17:26:13 -0300 Subject: [PATCH 20/30] update readme --- packages/ios_platform_images/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ios_platform_images/README.md b/packages/ios_platform_images/README.md index 42d2fedcdbc..7c98e2ca635 100644 --- a/packages/ios_platform_images/README.md +++ b/packages/ios_platform_images/README.md @@ -32,7 +32,7 @@ Widget build(BuildContext context) { } ``` -`IosPlatformImages.load` functions like [[UIImage imageNamed:]](https://developer.apple.com/documentation/uikit/uiimage/1624146-imagenamed). +`IosPlatformImages.load` works similarly to [`UIImage(named:)`](https://developer.apple.com/documentation/uikit/uiimage/1624146-imagenamed). ### Flutter->iOS Example From aae7a29c84cbe2b3c3c69f114d9e6a36fe38d44c Mon Sep 17 00:00:00 2001 From: Mairramer Date: Tue, 17 Oct 2023 14:29:03 -0300 Subject: [PATCH 21/30] rollback objC test --- .../ios_platform_images/example/ios/Podfile | 3 + .../ios/Runner.xcodeproj/project.pbxproj | 63 +++++++++++++++---- .../UIImage+ios_platform_imagesTests.m | 44 +++++++++++++ .../UIImageIosPlatformImagesTests.swift | 43 ------------- .../Classes/UIImageIosPlatformImages.swift | 55 ++++++++-------- 5 files changed, 127 insertions(+), 81 deletions(-) create mode 100644 packages/ios_platform_images/example/ios/RunnerTests/UIImage+ios_platform_imagesTests.m delete mode 100644 packages/ios_platform_images/example/ios/RunnerTests/UIImageIosPlatformImagesTests.swift diff --git a/packages/ios_platform_images/example/ios/Podfile b/packages/ios_platform_images/example/ios/Podfile index ec43b513b0d..997295f91b5 100644 --- a/packages/ios_platform_images/example/ios/Podfile +++ b/packages/ios_platform_images/example/ios/Podfile @@ -28,6 +28,9 @@ require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelpe flutter_ios_podfile_setup target 'Runner' do + use_frameworks! + use_modular_headers! + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do inherit! :search_paths diff --git a/packages/ios_platform_images/example/ios/Runner.xcodeproj/project.pbxproj b/packages/ios_platform_images/example/ios/Runner.xcodeproj/project.pbxproj index a28a6cc90b8..f4d51c8528c 100644 --- a/packages/ios_platform_images/example/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/ios_platform_images/example/ios/Runner.xcodeproj/project.pbxproj @@ -8,16 +8,16 @@ /* Begin PBXBuildFile section */ 0DE21BF72447752100097E3A /* textfile in Resources */ = {isa = PBXBuildFile; fileRef = 0DE21BF62447752100097E3A /* textfile */; }; - 1249487BECEEB37B66E4BD6E /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 0A79FBC35316559720A400F3 /* libPods-Runner.a */; }; + 101538FD877087FE0BE2EA00 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70ED43CFA0E2E576A8AB8B24 /* Pods_Runner.framework */; }; 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 313C07F72AD964D2006D4D86 /* UIImageIosPlatformImagesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 313C07F62AD964D2006D4D86 /* UIImageIosPlatformImagesTests.swift */; }; + 3131C9A12ADEFA32000703FA /* UIImage+ios_platform_imagesTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 3131C9A02ADEFA32000703FA /* UIImage+ios_platform_imagesTests.m */; }; 31DC4A212AA8CC9300781E88 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 937254B9D43BF2078EE3DE65 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A144F620445D38CD0FEB7B8E /* Pods_RunnerTests.framework */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - F65460B0A71DD10DFBD82C05 /* libPods-RunnerTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B3AED97A07CBBABEE7CAECBB /* libPods-RunnerTests.a */; }; F76AC1C1266713D00040C8BC /* IosPlatformImagesTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F76AC1C0266713D00040C8BC /* IosPlatformImagesTests.swift */; }; /* End PBXBuildFile section */ @@ -45,16 +45,16 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0A79FBC35316559720A400F3 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 0B20D3254D8E1A2B01D83810 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; 0DE21BF62447752100097E3A /* textfile */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = textfile; sourceTree = ""; }; 0EF1CD9A3A3064B5289EF22E /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 313C07F62AD964D2006D4D86 /* UIImageIosPlatformImagesTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIImageIosPlatformImagesTests.swift; sourceTree = ""; }; + 3131C9A02ADEFA32000703FA /* UIImage+ios_platform_imagesTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UIImage+ios_platform_imagesTests.m"; path = "../../../../../../../Desktop/UIImage+ios_platform_imagesTests.m"; sourceTree = ""; }; 3153765C2AAA95AD009694AF /* libios_platform_images.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libios_platform_images.a; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 4B56C310C5932F84CD6C17AC /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 70ED43CFA0E2E576A8AB8B24 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; @@ -66,7 +66,7 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - B3AED97A07CBBABEE7CAECBB /* libPods-RunnerTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-RunnerTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + A144F620445D38CD0FEB7B8E /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D1A761179BC59B1BAEE63036 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; D36FEDC657E1CE88220062D7 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; F76AC1BE266713D00040C8BC /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -79,7 +79,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 1249487BECEEB37B66E4BD6E /* libPods-Runner.a in Frameworks */, + 101538FD877087FE0BE2EA00 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -87,7 +87,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - F65460B0A71DD10DFBD82C05 /* libPods-RunnerTests.a in Frameworks */, + 937254B9D43BF2078EE3DE65 /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -159,8 +159,8 @@ isa = PBXGroup; children = ( 3153765C2AAA95AD009694AF /* libios_platform_images.a */, - 0A79FBC35316559720A400F3 /* libPods-Runner.a */, - B3AED97A07CBBABEE7CAECBB /* libPods-RunnerTests.a */, + 70ED43CFA0E2E576A8AB8B24 /* Pods_Runner.framework */, + A144F620445D38CD0FEB7B8E /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -169,8 +169,8 @@ isa = PBXGroup; children = ( F76AC1C0266713D00040C8BC /* IosPlatformImagesTests.swift */, + 3131C9A02ADEFA32000703FA /* UIImage+ios_platform_imagesTests.m */, F76AC1C2266713D00040C8BC /* Info.plist */, - 313C07F62AD964D2006D4D86 /* UIImageIosPlatformImagesTests.swift */, ); path = RunnerTests; sourceTree = ""; @@ -189,6 +189,7 @@ 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + B747922D12365ABBBA69BEA8 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -234,6 +235,7 @@ F76AC1BD266713D00040C8BC = { CreatedOnToolsVersion = 12.5; DevelopmentTeam = S8QB4VV633; + LastSwiftMigration = 1410; ProvisioningStyle = Automatic; TestTargetID = 97C146ED1CF9000F007C117D; }; @@ -335,6 +337,24 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build\n"; }; + B747922D12365ABBBA69BEA8 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", + "${BUILT_PRODUCTS_DIR}/ios_platform_images/ios_platform_images.framework", + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ios_platform_images.framework", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; C102F13F37851E08F0608EE5 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -373,7 +393,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 313C07F72AD964D2006D4D86 /* UIImageIosPlatformImagesTests.swift in Sources */, + 3131C9A12ADEFA32000703FA /* UIImage+ios_platform_imagesTests.m in Sources */, F76AC1C1266713D00040C8BC /* IosPlatformImagesTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -661,8 +681,14 @@ baseConfigurationReference = 0B20D3254D8E1A2B01D83810 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = S8QB4VV633; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "\"${PODS_CONFIGURATION_BUILD_DIR}/ios_platform_images/ios_platform_images.framework/Headers\"", + $CONFIGURATION_TEMP_DIR/YourProject.build/DerivedSources, + ); INFOPLIST_FILE = RunnerTests/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -671,6 +697,7 @@ ); PRODUCT_BUNDLE_IDENTIFIER = dev.flutter.plugins.RunnerTests; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/Runner"; }; @@ -681,8 +708,14 @@ baseConfigurationReference = D36FEDC657E1CE88220062D7 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = S8QB4VV633; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "\"${PODS_CONFIGURATION_BUILD_DIR}/ios_platform_images/ios_platform_images.framework/Headers\"", + $CONFIGURATION_TEMP_DIR/YourProject.build/DerivedSources, + ); INFOPLIST_FILE = RunnerTests/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", @@ -701,8 +734,14 @@ baseConfigurationReference = 80830F517E3E8B75B2D3AC0A /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = S8QB4VV633; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "\"${PODS_CONFIGURATION_BUILD_DIR}/ios_platform_images/ios_platform_images.framework/Headers\"", + $CONFIGURATION_TEMP_DIR/YourProject.build/DerivedSources, + ); INFOPLIST_FILE = RunnerTests/Info.plist; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", diff --git a/packages/ios_platform_images/example/ios/RunnerTests/UIImage+ios_platform_imagesTests.m b/packages/ios_platform_images/example/ios/RunnerTests/UIImage+ios_platform_imagesTests.m new file mode 100644 index 00000000000..0709996316f --- /dev/null +++ b/packages/ios_platform_images/example/ios/RunnerTests/UIImage+ios_platform_imagesTests.m @@ -0,0 +1,44 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +@import ios_platform_images; +@import XCTest; +#import "IosPlatformImagesPlugin-Swift.h" + +// The tests test the UIImage extension which is a public API intended for use from native code +// outside of the plugin (see package README). Any change that requires changing existing tests +// in this file (unless it's just to reflect changes to the test assets) is a BREAKING CHANGE for +// the package. +@interface UIImageExtensionTests : XCTestCase +@end + +@implementation UIImageExtensionTests + +- (void)testMultiResolutionImageUsesBest { + UIImage *image = [UIImage flutterImageWithName:@"assets/multisize.png"]; + XCTAssertNotNil(image); + const double height1x = 125; // The height of assets/multisize.png. + const double height2x = 250; // The height of assets/2.0x/multisize.png. + // Loading assets should get the best available asset for the screen scale when resolution-aware + // assets are available (and the example app has 1x and 2x for this asset). See + // https://docs.flutter.dev/ui/assets/assets-and-images#resolution-aware + if (UIScreen.mainScreen.scale > 1.0) { + XCTAssertEqualWithAccuracy(image.size.height, height2x, 0.00001); + } else { + XCTAssertEqualWithAccuracy(image.size.height, height1x, 0.00001); + } +} + +- (void)testSingleResolutionFindsImage { + // When there is no resolution-aware asset, the main asset should be used. + UIImage *image = [UIImage flutterImageWithName:@"assets/monosize.png"]; + XCTAssertNotNil(image); +} + +- (void)testMissingImageReturnsNil { + UIImage *image = [UIImage flutterImageWithName:@"assets/no_such_image.png"]; + XCTAssertNil(image); +} + +@end diff --git a/packages/ios_platform_images/example/ios/RunnerTests/UIImageIosPlatformImagesTests.swift b/packages/ios_platform_images/example/ios/RunnerTests/UIImageIosPlatformImagesTests.swift deleted file mode 100644 index 625a1cf8025..00000000000 --- a/packages/ios_platform_images/example/ios/RunnerTests/UIImageIosPlatformImagesTests.swift +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2013 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import Flutter -import XCTest - -@testable import ios_platform_images - -final class UIImageIosPlatformImagesTests: XCTestCase { - - func testMultiResolutionImageUsesBest() { - guard let image = flutterImageWithName(withName: "assets/multisize.png") else { - return XCTFail("Image not found") - } - - let height1x: Double = 125 // The height of assets/multisize.png. - let height2x: Double = 250 // The height of assets/2.0x/multisize.png. - - // Loading assets should get the best available asset for the screen scale when resolution-aware - // assets are available (and the example app has 1x and 2x for this asset). - if UIScreen.main.scale > 1.0 { - XCTAssertEqual(image.size.height, height2x, accuracy: 0.00001) - } else { - XCTAssertEqual(image.size.height, height1x, accuracy: 0.00001) - } - - } - - func testSingleResolutionFindsImage() { - // When there is no resolution-aware asset, the main asset should be used. - guard let image = flutterImageWithName(withName: "assets/monosize.png") else { - return XCTFail("Image not found") - } - - XCTAssertEqual(image.size.height, 125, accuracy: 0.00001) - } - - func testMissingImageReturnsNil() { - let image = flutterImageWithName(withName: "assets/no_such_image.png") - return XCTAssertNil(image) - } -} diff --git a/packages/ios_platform_images/ios/Classes/UIImageIosPlatformImages.swift b/packages/ios_platform_images/ios/Classes/UIImageIosPlatformImages.swift index afee7de85f6..db2b2dec037 100644 --- a/packages/ios_platform_images/ios/Classes/UIImageIosPlatformImages.swift +++ b/packages/ios_platform_images/ios/Classes/UIImageIosPlatformImages.swift @@ -4,35 +4,38 @@ import Flutter import Foundation +import UIKit -/// Loads a UIImage from the embedded Flutter project's assets. -/// -/// This method loads the Flutter asset that is appropriate for the current -/// screen. If you are on a 2x retina device where usually `UIImage` would be -/// loading `@2x` assets, it will attempt to load the `2.0x` variant. It will -/// load the standard image if it can't find the `2.0x` variant. -/// -/// For example, if your Flutter project's `pubspec.yaml` lists "assets/foo.png" -/// and "assets/2.0x/foo.png", calling -/// `[UIImage flutterImageWithName:@"assets/foo.png"]` will load -/// "assets/2.0x/foo.png". -/// -/// See also https://flutter.dev/docs/development/ui/assets-and-images -/// -/// Note: We don't yet support images from package dependencies (ex. -/// `AssetImage('icons/heart.png', package: 'my_icons')`). +@objc extension UIImage { + /// Loads a UIImage from the embedded Flutter project's assets. + /// + /// This method loads the Flutter asset that is appropriate for the current + /// screen. If you are on a 2x retina device where usually `UIImage` would be + /// loading `@2x` assets, it will attempt to load the `2.0x` variant. It will + /// load the standard image if it can't find the `2.0x` variant. + /// + /// For example, if your Flutter project's `pubspec.yaml` lists "assets/foo.png" + /// and "assets/2.0x/foo.png", calling + /// `[UIImage flutterImageWithName:@"assets/foo.png"]` will load + /// "assets/2.0x/foo.png". + /// + /// See also https://flutter.dev/docs/development/ui/assets-and-images + /// + /// Note: We don't yet support images from package dependencies (ex. + /// `AssetImage('icons/heart.png', package: 'my_icons')`). -func flutterImageWithName(withName name: String) -> UIImage? { - let filename = (name as NSString).lastPathComponent - let path = (name as NSString).deletingLastPathComponent + public static func flutterImageWithName(_ name: String) -> UIImage? { + let filename = (name as NSString).lastPathComponent + let path = (name as NSString).deletingLastPathComponent - for screenScale in stride(from: Int(UIScreen.main.scale), to: 1, by: -1) { - let key = FlutterDartProject.lookupKey(forAsset: "\(path)/\(screenScale).0x/\(filename)") - if let image = UIImage(named: key, in: Bundle.main, compatibleWith: nil) { - return image + for screenScale in stride(from: Int(UIScreen.main.scale), to: 1, by: -1) { + let key = FlutterDartProject.lookupKey(forAsset: "\(path)/\(screenScale).0x/\(filename)") + if let image = UIImage(named: key, in: Bundle.main, compatibleWith: nil) { + return image + } } - } - let key = FlutterDartProject.lookupKey(forAsset: name) - return UIImage(named: key, in: Bundle.main, compatibleWith: nil) + let key = FlutterDartProject.lookupKey(forAsset: name) + return UIImage(named: key, in: Bundle.main, compatibleWith: nil) + } } From cbbc20862c17ca4c843df16abd1a1211a4b7dbd7 Mon Sep 17 00:00:00 2001 From: Mairramer Date: Tue, 17 Oct 2023 14:37:08 -0300 Subject: [PATCH 22/30] fix test import --- .../example/ios/Runner.xcodeproj/project.pbxproj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/ios_platform_images/example/ios/Runner.xcodeproj/project.pbxproj b/packages/ios_platform_images/example/ios/Runner.xcodeproj/project.pbxproj index f4d51c8528c..f15f21784cb 100644 --- a/packages/ios_platform_images/example/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/ios_platform_images/example/ios/Runner.xcodeproj/project.pbxproj @@ -10,7 +10,7 @@ 0DE21BF72447752100097E3A /* textfile in Resources */ = {isa = PBXBuildFile; fileRef = 0DE21BF62447752100097E3A /* textfile */; }; 101538FD877087FE0BE2EA00 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 70ED43CFA0E2E576A8AB8B24 /* Pods_Runner.framework */; }; 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 3131C9A12ADEFA32000703FA /* UIImage+ios_platform_imagesTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 3131C9A02ADEFA32000703FA /* UIImage+ios_platform_imagesTests.m */; }; + 3131C9A32ADEFDA9000703FA /* UIImage+ios_platform_imagesTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 3131C9A22ADEFDA8000703FA /* UIImage+ios_platform_imagesTests.m */; }; 31DC4A212AA8CC9300781E88 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; @@ -50,7 +50,7 @@ 0EF1CD9A3A3064B5289EF22E /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 3131C9A02ADEFA32000703FA /* UIImage+ios_platform_imagesTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UIImage+ios_platform_imagesTests.m"; path = "../../../../../../../Desktop/UIImage+ios_platform_imagesTests.m"; sourceTree = ""; }; + 3131C9A22ADEFDA8000703FA /* UIImage+ios_platform_imagesTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UIImage+ios_platform_imagesTests.m"; path = "../../../../../../../Downloads/UIImage+ios_platform_imagesTests.m"; sourceTree = ""; }; 3153765C2AAA95AD009694AF /* libios_platform_images.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libios_platform_images.a; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 4B56C310C5932F84CD6C17AC /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; @@ -168,8 +168,8 @@ F76AC1BF266713D00040C8BC /* RunnerTests */ = { isa = PBXGroup; children = ( + 3131C9A22ADEFDA8000703FA /* UIImage+ios_platform_imagesTests.m */, F76AC1C0266713D00040C8BC /* IosPlatformImagesTests.swift */, - 3131C9A02ADEFA32000703FA /* UIImage+ios_platform_imagesTests.m */, F76AC1C2266713D00040C8BC /* Info.plist */, ); path = RunnerTests; @@ -393,7 +393,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 3131C9A12ADEFA32000703FA /* UIImage+ios_platform_imagesTests.m in Sources */, + 3131C9A32ADEFDA9000703FA /* UIImage+ios_platform_imagesTests.m in Sources */, F76AC1C1266713D00040C8BC /* IosPlatformImagesTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; From ac5459264feb70ca9a4946a43fa02f8b75f6bc65 Mon Sep 17 00:00:00 2001 From: Mairramer Date: Tue, 17 Oct 2023 15:09:05 -0300 Subject: [PATCH 23/30] improves --- .../ios/RunnerTests/IosPlatformImagesTests.swift | 11 ++++------- .../ios/Classes/UIImageIosPlatformImages.swift | 2 +- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/packages/ios_platform_images/example/ios/RunnerTests/IosPlatformImagesTests.swift b/packages/ios_platform_images/example/ios/RunnerTests/IosPlatformImagesTests.swift index e38abe9f760..a09fe6ce194 100644 --- a/packages/ios_platform_images/example/ios/RunnerTests/IosPlatformImagesTests.swift +++ b/packages/ios_platform_images/example/ios/RunnerTests/IosPlatformImagesTests.swift @@ -26,25 +26,22 @@ class IosPlatformImagesTests: XCTestCase { } func testResolveURL() { - let resourceName = "textfile" - let extensionName: String? = nil do { - let url = try plugin.resolveUrl(resourceName: resourceName, extension: extensionName) + let url = try plugin.resolveUrl(resourceName: "textfile", extension: nil) XCTAssertNotNil(url) - XCTAssertTrue(url!.contains(resourceName)) + XCTAssertTrue(url?.contains("textfile") ?? false) } catch { XCTFail("Error while resolving URL: \(error)") } } func testResolveURLNotFound() { - let resourceName = "notFound" - let extensionName: String? = nil do { - let url = try plugin.resolveUrl(resourceName: resourceName, extension: extensionName) + let url = try plugin.resolveUrl(resourceName: "notFound", extension: nil) XCTAssertNil(url) } catch { XCTFail("Error while resolving URL: \(error)") } } + } diff --git a/packages/ios_platform_images/ios/Classes/UIImageIosPlatformImages.swift b/packages/ios_platform_images/ios/Classes/UIImageIosPlatformImages.swift index db2b2dec037..e3fc13a6d67 100644 --- a/packages/ios_platform_images/ios/Classes/UIImageIosPlatformImages.swift +++ b/packages/ios_platform_images/ios/Classes/UIImageIosPlatformImages.swift @@ -23,12 +23,12 @@ import UIKit /// /// Note: We don't yet support images from package dependencies (ex. /// `AssetImage('icons/heart.png', package: 'my_icons')`). - public static func flutterImageWithName(_ name: String) -> UIImage? { let filename = (name as NSString).lastPathComponent let path = (name as NSString).deletingLastPathComponent for screenScale in stride(from: Int(UIScreen.main.scale), to: 1, by: -1) { + //TODO(hellohuanlin): This should be fixed, because it's path uses double slash. let key = FlutterDartProject.lookupKey(forAsset: "\(path)/\(screenScale).0x/\(filename)") if let image = UIImage(named: key, in: Bundle.main, compatibleWith: nil) { return image From 3e66718b217f2d7dd570a27e9a955019894d1aa3 Mon Sep 17 00:00:00 2001 From: Mairramer Date: Tue, 17 Oct 2023 15:21:07 -0300 Subject: [PATCH 24/30] improve test --- .../example/ios/RunnerTests/IosPlatformImagesTests.swift | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/ios_platform_images/example/ios/RunnerTests/IosPlatformImagesTests.swift b/packages/ios_platform_images/example/ios/RunnerTests/IosPlatformImagesTests.swift index a09fe6ce194..618a4cfa59e 100644 --- a/packages/ios_platform_images/example/ios/RunnerTests/IosPlatformImagesTests.swift +++ b/packages/ios_platform_images/example/ios/RunnerTests/IosPlatformImagesTests.swift @@ -26,10 +26,11 @@ class IosPlatformImagesTests: XCTestCase { } func testResolveURL() { + let resourceName = "textfile" do { - let url = try plugin.resolveUrl(resourceName: "textfile", extension: nil) + let url = try plugin.resolveUrl(resourceName: resourceName, extension: nil) XCTAssertNotNil(url) - XCTAssertTrue(url?.contains("textfile") ?? false) + XCTAssertTrue(url?.contains(resourceName) ?? false) } catch { XCTFail("Error while resolving URL: \(error)") } From 71f25891365c105c882d64dc07e106aa49af18fb Mon Sep 17 00:00:00 2001 From: Mairramer Date: Tue, 17 Oct 2023 15:36:04 -0300 Subject: [PATCH 25/30] fix test --- .../example/ios/Runner.xcodeproj/project.pbxproj | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/ios_platform_images/example/ios/Runner.xcodeproj/project.pbxproj b/packages/ios_platform_images/example/ios/Runner.xcodeproj/project.pbxproj index f15f21784cb..40970ecd35f 100644 --- a/packages/ios_platform_images/example/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/ios_platform_images/example/ios/Runner.xcodeproj/project.pbxproj @@ -324,7 +324,6 @@ }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 12; files = ( ); From 3324ccd219459f92c1d9c7038824ee908b9179fd Mon Sep 17 00:00:00 2001 From: Mairramer Date: Tue, 17 Oct 2023 17:48:01 -0300 Subject: [PATCH 26/30] rollback --- .../example/ios/Runner.xcodeproj/project.pbxproj | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/ios_platform_images/example/ios/Runner.xcodeproj/project.pbxproj b/packages/ios_platform_images/example/ios/Runner.xcodeproj/project.pbxproj index 40970ecd35f..0813ac0fc15 100644 --- a/packages/ios_platform_images/example/ios/Runner.xcodeproj/project.pbxproj +++ b/packages/ios_platform_images/example/ios/Runner.xcodeproj/project.pbxproj @@ -50,8 +50,7 @@ 0EF1CD9A3A3064B5289EF22E /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 3131C9A22ADEFDA8000703FA /* UIImage+ios_platform_imagesTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UIImage+ios_platform_imagesTests.m"; path = "../../../../../../../Downloads/UIImage+ios_platform_imagesTests.m"; sourceTree = ""; }; - 3153765C2AAA95AD009694AF /* libios_platform_images.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libios_platform_images.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 33B0E32B2AB348FF0006F0C1 /* UIImage+ios_platform_imagesTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "UIImage+ios_platform_imagesTests.m"; sourceTree = ""; }; 3153765C2AAA95AD009694AF /* libios_platform_images.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libios_platform_images.a; sourceTree = BUILT_PRODUCTS_DIR; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; 4B56C310C5932F84CD6C17AC /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; 70ED43CFA0E2E576A8AB8B24 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; From e370d613315560a6dfaa73e5f84fe89db646b69d Mon Sep 17 00:00:00 2001 From: Mairramer Date: Tue, 17 Oct 2023 18:10:47 -0300 Subject: [PATCH 27/30] update readme --- packages/ios_platform_images/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ios_platform_images/README.md b/packages/ios_platform_images/README.md index 7c98e2ca635..69dc63ace5a 100644 --- a/packages/ios_platform_images/README.md +++ b/packages/ios_platform_images/README.md @@ -40,7 +40,7 @@ Widget build(BuildContext context) { import ios_platform_images func makeImage() -> UIImageView { - let image = flutterImageWithName(withName: "assets/foo.png") + let image = UIImage.flutterImageWithName("assets/foo.png") return UIImageView(image: image) } ``` From b25d5743451436dc3f8a986c34dbe7a351b82b2f Mon Sep 17 00:00:00 2001 From: stuartmorgan Date: Fri, 20 Oct 2023 13:03:51 -0400 Subject: [PATCH 28/30] Revert whitespace change in podfile --- packages/ios_platform_images/example/ios/Podfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ios_platform_images/example/ios/Podfile b/packages/ios_platform_images/example/ios/Podfile index 997295f91b5..fdcc671eb34 100644 --- a/packages/ios_platform_images/example/ios/Podfile +++ b/packages/ios_platform_images/example/ios/Podfile @@ -30,7 +30,7 @@ flutter_ios_podfile_setup target 'Runner' do use_frameworks! use_modular_headers! - + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) target 'RunnerTests' do inherit! :search_paths From 5d03976324ceff57a29f736052389f8420ded898 Mon Sep 17 00:00:00 2001 From: stuartmorgan Date: Fri, 20 Oct 2023 13:06:55 -0400 Subject: [PATCH 29/30] TODO style fix --- .../ios/Classes/UIImageIosPlatformImages.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ios_platform_images/ios/Classes/UIImageIosPlatformImages.swift b/packages/ios_platform_images/ios/Classes/UIImageIosPlatformImages.swift index e3fc13a6d67..2e9cdefe673 100644 --- a/packages/ios_platform_images/ios/Classes/UIImageIosPlatformImages.swift +++ b/packages/ios_platform_images/ios/Classes/UIImageIosPlatformImages.swift @@ -28,7 +28,7 @@ import UIKit let path = (name as NSString).deletingLastPathComponent for screenScale in stride(from: Int(UIScreen.main.scale), to: 1, by: -1) { - //TODO(hellohuanlin): This should be fixed, because it's path uses double slash. + // TODO(hellohuanlin): Fix duplicate slashes in this path construction. let key = FlutterDartProject.lookupKey(forAsset: "\(path)/\(screenScale).0x/\(filename)") if let image = UIImage(named: key, in: Bundle.main, compatibleWith: nil) { return image From eaf7c900fd27baa854c0516f0c1606483aa336a3 Mon Sep 17 00:00:00 2001 From: Stuart Morgan Date: Fri, 20 Oct 2023 13:28:42 -0400 Subject: [PATCH 30/30] Re-add DEFINES_MODULE --- .../example/ios/RunnerTests/UIImage+ios_platform_imagesTests.m | 1 - packages/ios_platform_images/ios/ios_platform_images.podspec | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ios_platform_images/example/ios/RunnerTests/UIImage+ios_platform_imagesTests.m b/packages/ios_platform_images/example/ios/RunnerTests/UIImage+ios_platform_imagesTests.m index 0709996316f..d107ac4bd34 100644 --- a/packages/ios_platform_images/example/ios/RunnerTests/UIImage+ios_platform_imagesTests.m +++ b/packages/ios_platform_images/example/ios/RunnerTests/UIImage+ios_platform_imagesTests.m @@ -4,7 +4,6 @@ @import ios_platform_images; @import XCTest; -#import "IosPlatformImagesPlugin-Swift.h" // The tests test the UIImage extension which is a public API intended for use from native code // outside of the plugin (see package README). Any change that requires changing existing tests diff --git a/packages/ios_platform_images/ios/ios_platform_images.podspec b/packages/ios_platform_images/ios/ios_platform_images.podspec index ea4b1a3d049..d0428215e42 100644 --- a/packages/ios_platform_images/ios/ios_platform_images.podspec +++ b/packages/ios_platform_images/ios/ios_platform_images.podspec @@ -20,6 +20,7 @@ Downloaded by pub (not CocoaPods). s.platform = :ios, '11.0' s.xcconfig = { + 'DEFINES_MODULE' => 'YES', 'LIBRARY_SEARCH_PATHS' => '$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)/ $(SDKROOT)/usr/lib/swift', 'LD_RUNPATH_SEARCH_PATHS' => '/usr/lib/swift', }