From 7d68ed0f6cd7b99f88e826de11634412cb6baf67 Mon Sep 17 00:00:00 2001 From: yangjie <168149434@qq.com> Date: Sun, 17 Nov 2024 16:01:34 +0800 Subject: [PATCH] 1 --- .gitignore | 43 ++ CHANGELOG.md | 187 ++++++ LICENSE | 13 + README.md | 5 + analysis_options.yaml | 7 + android/build.gradle | 70 +++ android/gradle.properties | 4 + android/settings.gradle | 1 + android/src/main/AndroidManifest.xml | 7 + .../core/FluttifyMessageCodec.java | 82 +++ .../FoundationFluttifyPlugin.kt | 157 +++++ .../android/app/ActivityHandler.kt | 17 + .../android/app/ApplicationHandler.kt | 13 + .../android/app/NotificationHandler.kt | 65 +++ .../android/app/PendingIntentHandler.kt | 9 + .../content/BroadcastReceiverHandler.kt | 29 + .../android/content/ContextHandler.kt | 24 + .../android/content/IntentFilterHandler.kt | 18 + .../android/content/IntentHandler.kt | 31 + .../android/graphics/BitmapHandler.kt | 57 ++ .../android/graphics/PointHandler.kt | 29 + .../android/location/LocationHandler.kt | 102 ++++ .../android/os/BundleHandler.kt | 75 +++ .../android/util/PairHandler.kt | 21 + .../android/view/SurfaceHolderHandler.kt | 75 +++ .../android/view/SurfaceViewHandler.kt | 25 + .../android/view/ViewGroupHandler.kt | 28 + .../android/view/ViewHandler.kt | 9 + .../android/widget/ImageViewHandler.kt | 32 + .../me/yohom/foundation_fluttify/core/AnyX.kt | 11 + .../core/PlatformService.kt | 181 ++++++ .../java/io/FileHandler.kt | 17 + .../android_opengl_GLSurfaceViewFactory.kt | 27 + .../android_view_SurfaceViewFactory.kt | 61 ++ .../android_widget_FrameLayoutFactory.kt | 27 + example/.gitignore | 43 ++ example/README.md | 16 + .../.gradle/7.4/checksums/checksums.lock | Bin 0 -> 17 bytes .../dependencies-accessors.lock | Bin 0 -> 17 bytes .../7.4/dependencies-accessors/gc.properties | 0 .../.gradle/7.4/fileChanges/last-build.bin | Bin 0 -> 1 bytes .../.gradle/7.4/fileHashes/fileHashes.lock | Bin 0 -> 17 bytes example/android/.gradle/7.4/gc.properties | 0 .../.gradle/8.7/checksums/checksums.lock | Bin 0 -> 17 bytes .../.gradle/8.7/checksums/md5-checksums.bin | Bin 0 -> 18947 bytes .../.gradle/8.7/checksums/sha1-checksums.bin | Bin 0 -> 19955 bytes .../8.7/dependencies-accessors/gc.properties | 0 .../8.7/executionHistory/executionHistory.bin | Bin 0 -> 1165593 bytes .../executionHistory/executionHistory.lock | Bin 0 -> 17 bytes .../.gradle/8.7/fileChanges/last-build.bin | Bin 0 -> 1 bytes .../.gradle/8.7/fileHashes/fileHashes.bin | Bin 0 -> 150083 bytes .../.gradle/8.7/fileHashes/fileHashes.lock | Bin 0 -> 17 bytes .../8.7/fileHashes/resourceHashesCache.bin | Bin 0 -> 21217 bytes example/android/.gradle/8.7/gc.properties | 0 .../buildOutputCleanup.lock | Bin 0 -> 17 bytes .../buildOutputCleanup/cache.properties | 2 + .../buildOutputCleanup/outputFiles.bin | Bin 0 -> 25013 bytes example/android/.gradle/file-system.probe | Bin 0 -> 8 bytes .../android/.gradle/noVersion/buildLogic.lock | Bin 0 -> 17 bytes example/android/.gradle/vcs-1/gc.properties | 0 example/android/app/build.gradle | 43 ++ .../android/app/src/debug/AndroidManifest.xml | 7 + .../android/app/src/main/AndroidManifest.xml | 35 ++ .../plugins/GeneratedPluginRegistrant.java | 24 + .../MainActivity.kt | 5 + .../main/res/drawable/launch_background.xml | 12 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 544 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 442 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 721 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 1031 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 1443 bytes .../app/src/main/res/values/styles.xml | 8 + .../app/src/profile/AndroidManifest.xml | 7 + example/android/build.gradle | 18 + example/android/gradle.properties | 5 + .../android/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 53636 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + example/android/gradlew | 160 +++++ example/android/gradlew.bat | 90 +++ example/android/local.properties | 3 + example/android/settings.gradle | 25 + example/ios/Flutter/AppFrameworkInfo.plist | 26 + example/ios/Flutter/Debug.xcconfig | 2 + example/ios/Flutter/Generated.xcconfig | 14 + example/ios/Flutter/Release.xcconfig | 2 + .../ios/Flutter/flutter_export_environment.sh | 13 + example/ios/Podfile | 38 ++ example/ios/Podfile.lock | 22 + example/ios/Runner.xcodeproj/project.pbxproj | 548 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 91 +++ .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + example/ios/Runner/AppDelegate.h | 6 + example/ios/Runner/AppDelegate.m | 13 + .../AppIcon.appiconset/Contents.json | 122 ++++ .../Icon-App-1024x1024@1x.png | Bin 0 -> 10932 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 564 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 1588 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 1025 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 1716 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 1920 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 1895 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 3831 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 1888 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 3294 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 3612 bytes .../LaunchImage.imageset/Contents.json | 23 + .../LaunchImage.imageset/LaunchImage.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/README.md | 5 + .../Runner/Base.lproj/LaunchScreen.storyboard | 37 ++ example/ios/Runner/Base.lproj/Main.storyboard | 26 + .../ios/Runner/GeneratedPluginRegistrant.h | 19 + .../ios/Runner/GeneratedPluginRegistrant.m | 21 + example/ios/Runner/Info.plist | 47 ++ example/ios/Runner/main.m | 9 + example/lib/main.dart | 30 + example/pubspec.lock | 204 +++++++ example/pubspec.yaml | 21 + example/test/widget_test.dart | 27 + foundation_fluttify-0.13.0+1.tar.gz | Bin 0 -> 90503 bytes ios/Classes/CGPointHandler.h | 12 + ios/Classes/CGPointHandler.m | 98 ++++ ios/Classes/CGRectHandler.h | 15 + ios/Classes/CGRectHandler.m | 78 +++ ios/Classes/CGSizeHandler.h | 15 + ios/Classes/CGSizeHandler.m | 52 ++ ios/Classes/FluttifyMessageCodec.h | 24 + ios/Classes/FluttifyMessageCodec.m | 230 ++++++++ ios/Classes/FoundationFluttifyPlugin.h | 9 + ios/Classes/FoundationFluttifyPlugin.m | 410 +++++++++++++ ios/Classes/NSDataHandler.h | 12 + ios/Classes/NSDataHandler.m | 36 ++ ios/Classes/NSDateHandler.h | 15 + ios/Classes/NSDateHandler.m | 27 + ios/Classes/NSErrorHandler.h | 15 + ios/Classes/NSErrorHandler.m | 39 ++ ios/Classes/NSObjectHandler.h | 15 + ios/Classes/NSObjectHandler.m | 32 + ios/Classes/PlatformService.h | 15 + ios/Classes/PlatformService.m | 352 +++++++++++ ios/Classes/UIColorHandler.h | 15 + ios/Classes/UIColorHandler.m | 29 + ios/Classes/UIEdgeInsetsHandler.h | 12 + ios/Classes/UIEdgeInsetsHandler.m | 74 +++ ios/Classes/UIImageHandler.h | 13 + ios/Classes/UIImageHandler.m | 69 +++ ios/Classes/UIImageViewHandler.h | 15 + ios/Classes/UIImageViewHandler.m | 24 + ios/Classes/UIViewControllerHandler.h | 15 + ios/Classes/UIViewControllerHandler.m | 21 + ios/Classes/UIViewHandler.h | 12 + ios/Classes/UIViewHandler.m | 210 +++++++ ios/Classes/platform_view/UIViewFactory.h | 29 + ios/Classes/platform_view/UIViewFactory.m | 60 ++ ios/foundation_fluttify.podspec | 24 + lib/foundation_fluttify.dart | 82 +++ lib/src/extension/image_provider.x.dart | 36 ++ lib/src/function/functions.dart | 255 ++++++++ lib/src/object/obejcts.dart | 197 +++++++ lib/src/type/core/array.dart | 5 + .../type/core/broadcast_event_channel.dart | 13 + lib/src/type/core/fluttify_message_codec.dart | 210 +++++++ lib/src/type/core/ref.dart | 195 +++++++ lib/src/type/core/stack.dart | 34 ++ lib/src/type/core/typedefs.dart | 181 ++++++ .../android_type/android/app/activity.dart | 22 + .../android_type/android/app/application.dart | 15 + .../android/app/notification.dart | 35 ++ .../android/app/pending_intent.dart | 11 + .../android/content/broadcast_receiver.dart | 37 ++ .../android/content/content_provider.dart | 9 + .../android_type/android/content/context.dart | 28 + .../android_type/android/content/intent.dart | 23 + .../android/content/intent_filter.dart | 19 + .../android_type/android/graphics/bitmap.dart | 57 ++ .../android/graphics/drawable/drawable.dart | 7 + .../android_type/android/graphics/point.dart | 28 + .../android/graphics/point_f.dart | 7 + .../android/location/location.dart | 88 +++ .../android/opengl/gl_surface_view.dart | 6 + .../android_type/android/os/binder.dart | 7 + .../android_type/android/os/bundle.dart | 59 ++ .../android_type/android/os/parcelable.dart | 14 + .../android_type/android/util/pair.dart | 21 + .../android/view/motion_event.dart | 7 + .../android/view/surface_holder.dart | 71 +++ .../android/view/surface_view.dart | 28 + .../android_type/android/view/view.dart | 42 ++ .../android_type/android/view/view_group.dart | 22 + .../android/widget/frame_layout.dart | 7 + .../android/widget/image_view.dart | 18 + .../android/widget/linear_layout.dart | 7 + .../android/widget/relative_layout.dart | 7 + .../android/widget/text_view.dart | 7 + .../android_type/java/io/closeable.dart | 16 + .../platform/android_type/java/io/file.dart | 13 + .../android_type/java/io/serializable.dart | 17 + .../android_type/java/lang/object.dart | 7 + .../android_type/java/lang/throwable.dart | 7 + .../android_type/org/json/json_object.dart | 7 + .../av_audio_session_category_options.dart | 26 + lib/src/type/platform/ios_type/ca_action.dart | 7 + .../type/platform/ios_type/ca_animation.dart | 9 + .../platform/ios_type/ca_basic_animation.dart | 18 + .../platform/ios_type/ca_media_timing.dart | 52 ++ .../ios_type/ca_property_animation.dart | 7 + lib/src/type/platform/ios_type/cg_point.dart | 54 ++ lib/src/type/platform/ios_type/cg_rect.dart | 39 ++ lib/src/type/platform/ios_type/cg_size.dart | 27 + lib/src/type/platform/ios_type/ns_coding.dart | 12 + .../type/platform/ios_type/ns_copying.dart | 12 + lib/src/type/platform/ios_type/ns_data.dart | 24 + lib/src/type/platform/ios_type/ns_date.dart | 19 + lib/src/type/platform/ios_type/ns_error.dart | 24 + .../platform/ios_type/ns_mutable_copying.dart | 11 + lib/src/type/platform/ios_type/ns_object.dart | 10 + .../type/platform/ios_type/ns_operation.dart | 7 + lib/src/type/platform/ios_type/ns_url.dart | 7 + .../platform/ios_type/ns_user_activity.dart | 7 + lib/src/type/platform/ios_type/ns_value.dart | 7 + .../platform/ios_type/ui_application.dart | 7 + .../ui_application_shortcut_item.dart | 7 + .../type/platform/ios_type/ui_bar_style.dart | 4 + lib/src/type/platform/ios_type/ui_color.dart | 19 + .../type/platform/ios_type/ui_control.dart | 7 + .../platform/ios_type/ui_edge_insets.dart | 45 ++ lib/src/type/platform/ios_type/ui_image.dart | 53 ++ .../type/platform/ios_type/ui_image_view.dart | 19 + .../ios_type/ui_status_bar_style.dart | 5 + .../ui_user_notification_settings.dart | 7 + lib/src/type/platform/ios_type/ui_view.dart | 163 ++++++ .../platform/ios_type/ui_view_controller.dart | 16 + .../android_opengl_GLSurfaceView.widget.dart | 75 +++ .../android_view_SurfaceView.widget.dart | 128 ++++ .../android_widget_FrameLayout.widget.dart | 74 +++ .../widget/scoped_release_pool.widget.dart | 52 ++ lib/src/type/widget/ui_view.widget.dart | 65 +++ pubspec.lock | 189 ++++++ pubspec.yaml | 25 + test/foundation_fluttify_test.dart | 1 + 250 files changed, 8930 insertions(+) create mode 100644 .gitignore create mode 100644 CHANGELOG.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 analysis_options.yaml create mode 100644 android/build.gradle create mode 100644 android/gradle.properties create mode 100644 android/settings.gradle create mode 100644 android/src/main/AndroidManifest.xml create mode 100644 android/src/main/java/me/yohom/foundation_fluttify/core/FluttifyMessageCodec.java create mode 100644 android/src/main/kotlin/me/yohom/foundation_fluttify/FoundationFluttifyPlugin.kt create mode 100644 android/src/main/kotlin/me/yohom/foundation_fluttify/android/app/ActivityHandler.kt create mode 100644 android/src/main/kotlin/me/yohom/foundation_fluttify/android/app/ApplicationHandler.kt create mode 100644 android/src/main/kotlin/me/yohom/foundation_fluttify/android/app/NotificationHandler.kt create mode 100644 android/src/main/kotlin/me/yohom/foundation_fluttify/android/app/PendingIntentHandler.kt create mode 100644 android/src/main/kotlin/me/yohom/foundation_fluttify/android/content/BroadcastReceiverHandler.kt create mode 100644 android/src/main/kotlin/me/yohom/foundation_fluttify/android/content/ContextHandler.kt create mode 100644 android/src/main/kotlin/me/yohom/foundation_fluttify/android/content/IntentFilterHandler.kt create mode 100644 android/src/main/kotlin/me/yohom/foundation_fluttify/android/content/IntentHandler.kt create mode 100644 android/src/main/kotlin/me/yohom/foundation_fluttify/android/graphics/BitmapHandler.kt create mode 100644 android/src/main/kotlin/me/yohom/foundation_fluttify/android/graphics/PointHandler.kt create mode 100644 android/src/main/kotlin/me/yohom/foundation_fluttify/android/location/LocationHandler.kt create mode 100644 android/src/main/kotlin/me/yohom/foundation_fluttify/android/os/BundleHandler.kt create mode 100644 android/src/main/kotlin/me/yohom/foundation_fluttify/android/util/PairHandler.kt create mode 100644 android/src/main/kotlin/me/yohom/foundation_fluttify/android/view/SurfaceHolderHandler.kt create mode 100644 android/src/main/kotlin/me/yohom/foundation_fluttify/android/view/SurfaceViewHandler.kt create mode 100644 android/src/main/kotlin/me/yohom/foundation_fluttify/android/view/ViewGroupHandler.kt create mode 100644 android/src/main/kotlin/me/yohom/foundation_fluttify/android/view/ViewHandler.kt create mode 100644 android/src/main/kotlin/me/yohom/foundation_fluttify/android/widget/ImageViewHandler.kt create mode 100644 android/src/main/kotlin/me/yohom/foundation_fluttify/core/AnyX.kt create mode 100644 android/src/main/kotlin/me/yohom/foundation_fluttify/core/PlatformService.kt create mode 100644 android/src/main/kotlin/me/yohom/foundation_fluttify/java/io/FileHandler.kt create mode 100644 android/src/main/kotlin/me/yohom/foundation_fluttify/platform_view/android_opengl_GLSurfaceViewFactory.kt create mode 100644 android/src/main/kotlin/me/yohom/foundation_fluttify/platform_view/android_view_SurfaceViewFactory.kt create mode 100644 android/src/main/kotlin/me/yohom/foundation_fluttify/platform_view/android_widget_FrameLayoutFactory.kt create mode 100644 example/.gitignore create mode 100644 example/README.md create mode 100644 example/android/.gradle/7.4/checksums/checksums.lock create mode 100644 example/android/.gradle/7.4/dependencies-accessors/dependencies-accessors.lock create mode 100644 example/android/.gradle/7.4/dependencies-accessors/gc.properties create mode 100644 example/android/.gradle/7.4/fileChanges/last-build.bin create mode 100644 example/android/.gradle/7.4/fileHashes/fileHashes.lock create mode 100644 example/android/.gradle/7.4/gc.properties create mode 100644 example/android/.gradle/8.7/checksums/checksums.lock create mode 100644 example/android/.gradle/8.7/checksums/md5-checksums.bin create mode 100644 example/android/.gradle/8.7/checksums/sha1-checksums.bin create mode 100644 example/android/.gradle/8.7/dependencies-accessors/gc.properties create mode 100644 example/android/.gradle/8.7/executionHistory/executionHistory.bin create mode 100644 example/android/.gradle/8.7/executionHistory/executionHistory.lock create mode 100644 example/android/.gradle/8.7/fileChanges/last-build.bin create mode 100644 example/android/.gradle/8.7/fileHashes/fileHashes.bin create mode 100644 example/android/.gradle/8.7/fileHashes/fileHashes.lock create mode 100644 example/android/.gradle/8.7/fileHashes/resourceHashesCache.bin create mode 100644 example/android/.gradle/8.7/gc.properties create mode 100644 example/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock create mode 100644 example/android/.gradle/buildOutputCleanup/cache.properties create mode 100644 example/android/.gradle/buildOutputCleanup/outputFiles.bin create mode 100644 example/android/.gradle/file-system.probe create mode 100644 example/android/.gradle/noVersion/buildLogic.lock create mode 100644 example/android/.gradle/vcs-1/gc.properties create mode 100644 example/android/app/build.gradle create mode 100644 example/android/app/src/debug/AndroidManifest.xml create mode 100644 example/android/app/src/main/AndroidManifest.xml create mode 100644 example/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java create mode 100644 example/android/app/src/main/kotlin/me/yohom/foundation_fluttify_example/MainActivity.kt create mode 100644 example/android/app/src/main/res/drawable/launch_background.xml create mode 100644 example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 example/android/app/src/main/res/values/styles.xml create mode 100644 example/android/app/src/profile/AndroidManifest.xml create mode 100644 example/android/build.gradle create mode 100644 example/android/gradle.properties create mode 100644 example/android/gradle/wrapper/gradle-wrapper.jar create mode 100644 example/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 example/android/gradlew create mode 100644 example/android/gradlew.bat create mode 100644 example/android/local.properties create mode 100644 example/android/settings.gradle create mode 100644 example/ios/Flutter/AppFrameworkInfo.plist create mode 100644 example/ios/Flutter/Debug.xcconfig create mode 100644 example/ios/Flutter/Generated.xcconfig create mode 100644 example/ios/Flutter/Release.xcconfig create mode 100644 example/ios/Flutter/flutter_export_environment.sh create mode 100644 example/ios/Podfile create mode 100644 example/ios/Podfile.lock create mode 100644 example/ios/Runner.xcodeproj/project.pbxproj create mode 100644 example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 example/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 example/ios/Runner/AppDelegate.h create mode 100644 example/ios/Runner/AppDelegate.m create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 example/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 example/ios/Runner/Base.lproj/Main.storyboard create mode 100644 example/ios/Runner/GeneratedPluginRegistrant.h create mode 100644 example/ios/Runner/GeneratedPluginRegistrant.m create mode 100644 example/ios/Runner/Info.plist create mode 100644 example/ios/Runner/main.m create mode 100644 example/lib/main.dart create mode 100644 example/pubspec.lock create mode 100644 example/pubspec.yaml create mode 100644 example/test/widget_test.dart create mode 100644 foundation_fluttify-0.13.0+1.tar.gz create mode 100644 ios/Classes/CGPointHandler.h create mode 100644 ios/Classes/CGPointHandler.m create mode 100644 ios/Classes/CGRectHandler.h create mode 100644 ios/Classes/CGRectHandler.m create mode 100644 ios/Classes/CGSizeHandler.h create mode 100644 ios/Classes/CGSizeHandler.m create mode 100644 ios/Classes/FluttifyMessageCodec.h create mode 100644 ios/Classes/FluttifyMessageCodec.m create mode 100644 ios/Classes/FoundationFluttifyPlugin.h create mode 100644 ios/Classes/FoundationFluttifyPlugin.m create mode 100644 ios/Classes/NSDataHandler.h create mode 100644 ios/Classes/NSDataHandler.m create mode 100644 ios/Classes/NSDateHandler.h create mode 100644 ios/Classes/NSDateHandler.m create mode 100644 ios/Classes/NSErrorHandler.h create mode 100644 ios/Classes/NSErrorHandler.m create mode 100644 ios/Classes/NSObjectHandler.h create mode 100644 ios/Classes/NSObjectHandler.m create mode 100644 ios/Classes/PlatformService.h create mode 100644 ios/Classes/PlatformService.m create mode 100644 ios/Classes/UIColorHandler.h create mode 100644 ios/Classes/UIColorHandler.m create mode 100644 ios/Classes/UIEdgeInsetsHandler.h create mode 100644 ios/Classes/UIEdgeInsetsHandler.m create mode 100644 ios/Classes/UIImageHandler.h create mode 100644 ios/Classes/UIImageHandler.m create mode 100644 ios/Classes/UIImageViewHandler.h create mode 100644 ios/Classes/UIImageViewHandler.m create mode 100644 ios/Classes/UIViewControllerHandler.h create mode 100644 ios/Classes/UIViewControllerHandler.m create mode 100644 ios/Classes/UIViewHandler.h create mode 100644 ios/Classes/UIViewHandler.m create mode 100644 ios/Classes/platform_view/UIViewFactory.h create mode 100644 ios/Classes/platform_view/UIViewFactory.m create mode 100644 ios/foundation_fluttify.podspec create mode 100644 lib/foundation_fluttify.dart create mode 100644 lib/src/extension/image_provider.x.dart create mode 100644 lib/src/function/functions.dart create mode 100644 lib/src/object/obejcts.dart create mode 100644 lib/src/type/core/array.dart create mode 100644 lib/src/type/core/broadcast_event_channel.dart create mode 100644 lib/src/type/core/fluttify_message_codec.dart create mode 100644 lib/src/type/core/ref.dart create mode 100644 lib/src/type/core/stack.dart create mode 100644 lib/src/type/core/typedefs.dart create mode 100644 lib/src/type/platform/android_type/android/app/activity.dart create mode 100644 lib/src/type/platform/android_type/android/app/application.dart create mode 100644 lib/src/type/platform/android_type/android/app/notification.dart create mode 100644 lib/src/type/platform/android_type/android/app/pending_intent.dart create mode 100644 lib/src/type/platform/android_type/android/content/broadcast_receiver.dart create mode 100644 lib/src/type/platform/android_type/android/content/content_provider.dart create mode 100644 lib/src/type/platform/android_type/android/content/context.dart create mode 100644 lib/src/type/platform/android_type/android/content/intent.dart create mode 100644 lib/src/type/platform/android_type/android/content/intent_filter.dart create mode 100644 lib/src/type/platform/android_type/android/graphics/bitmap.dart create mode 100644 lib/src/type/platform/android_type/android/graphics/drawable/drawable.dart create mode 100644 lib/src/type/platform/android_type/android/graphics/point.dart create mode 100644 lib/src/type/platform/android_type/android/graphics/point_f.dart create mode 100644 lib/src/type/platform/android_type/android/location/location.dart create mode 100644 lib/src/type/platform/android_type/android/opengl/gl_surface_view.dart create mode 100644 lib/src/type/platform/android_type/android/os/binder.dart create mode 100644 lib/src/type/platform/android_type/android/os/bundle.dart create mode 100644 lib/src/type/platform/android_type/android/os/parcelable.dart create mode 100644 lib/src/type/platform/android_type/android/util/pair.dart create mode 100644 lib/src/type/platform/android_type/android/view/motion_event.dart create mode 100644 lib/src/type/platform/android_type/android/view/surface_holder.dart create mode 100644 lib/src/type/platform/android_type/android/view/surface_view.dart create mode 100644 lib/src/type/platform/android_type/android/view/view.dart create mode 100644 lib/src/type/platform/android_type/android/view/view_group.dart create mode 100644 lib/src/type/platform/android_type/android/widget/frame_layout.dart create mode 100644 lib/src/type/platform/android_type/android/widget/image_view.dart create mode 100644 lib/src/type/platform/android_type/android/widget/linear_layout.dart create mode 100644 lib/src/type/platform/android_type/android/widget/relative_layout.dart create mode 100644 lib/src/type/platform/android_type/android/widget/text_view.dart create mode 100644 lib/src/type/platform/android_type/java/io/closeable.dart create mode 100644 lib/src/type/platform/android_type/java/io/file.dart create mode 100644 lib/src/type/platform/android_type/java/io/serializable.dart create mode 100644 lib/src/type/platform/android_type/java/lang/object.dart create mode 100644 lib/src/type/platform/android_type/java/lang/throwable.dart create mode 100644 lib/src/type/platform/android_type/org/json/json_object.dart create mode 100644 lib/src/type/platform/ios_type/av_audio_session_category_options.dart create mode 100644 lib/src/type/platform/ios_type/ca_action.dart create mode 100644 lib/src/type/platform/ios_type/ca_animation.dart create mode 100644 lib/src/type/platform/ios_type/ca_basic_animation.dart create mode 100644 lib/src/type/platform/ios_type/ca_media_timing.dart create mode 100644 lib/src/type/platform/ios_type/ca_property_animation.dart create mode 100644 lib/src/type/platform/ios_type/cg_point.dart create mode 100644 lib/src/type/platform/ios_type/cg_rect.dart create mode 100644 lib/src/type/platform/ios_type/cg_size.dart create mode 100644 lib/src/type/platform/ios_type/ns_coding.dart create mode 100644 lib/src/type/platform/ios_type/ns_copying.dart create mode 100644 lib/src/type/platform/ios_type/ns_data.dart create mode 100644 lib/src/type/platform/ios_type/ns_date.dart create mode 100644 lib/src/type/platform/ios_type/ns_error.dart create mode 100644 lib/src/type/platform/ios_type/ns_mutable_copying.dart create mode 100644 lib/src/type/platform/ios_type/ns_object.dart create mode 100644 lib/src/type/platform/ios_type/ns_operation.dart create mode 100644 lib/src/type/platform/ios_type/ns_url.dart create mode 100644 lib/src/type/platform/ios_type/ns_user_activity.dart create mode 100644 lib/src/type/platform/ios_type/ns_value.dart create mode 100644 lib/src/type/platform/ios_type/ui_application.dart create mode 100644 lib/src/type/platform/ios_type/ui_application_shortcut_item.dart create mode 100644 lib/src/type/platform/ios_type/ui_bar_style.dart create mode 100644 lib/src/type/platform/ios_type/ui_color.dart create mode 100644 lib/src/type/platform/ios_type/ui_control.dart create mode 100644 lib/src/type/platform/ios_type/ui_edge_insets.dart create mode 100644 lib/src/type/platform/ios_type/ui_image.dart create mode 100644 lib/src/type/platform/ios_type/ui_image_view.dart create mode 100644 lib/src/type/platform/ios_type/ui_status_bar_style.dart create mode 100644 lib/src/type/platform/ios_type/ui_user_notification_settings.dart create mode 100644 lib/src/type/platform/ios_type/ui_view.dart create mode 100644 lib/src/type/platform/ios_type/ui_view_controller.dart create mode 100644 lib/src/type/widget/android_opengl_GLSurfaceView.widget.dart create mode 100644 lib/src/type/widget/android_view_SurfaceView.widget.dart create mode 100644 lib/src/type/widget/android_widget_FrameLayout.widget.dart create mode 100644 lib/src/type/widget/scoped_release_pool.widget.dart create mode 100644 lib/src/type/widget/ui_view.widget.dart create mode 100644 pubspec.lock create mode 100644 pubspec.yaml create mode 100644 test/foundation_fluttify_test.dart diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..29a3a50 --- /dev/null +++ b/.gitignore @@ -0,0 +1,43 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.pub-cache/ +.pub/ +/build/ + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..38561a6 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,187 @@ +## 0.8.11 +- feat: 增加PlatformService::getAssetPath方法 +- enhance: CGSize增加创建方法 +- enhance: 新增FluttifyBroadcastEventChannel, 一律返回Intent +- enhance: Intent增加获取bundle + +## 0.8.10 +- feat: 增加UIImageView的创建 +- enhance: UIView增加setAnchorPoint +- enhance: CGRect增加属性获取方法 + +## 0.8.9 +- fix: objc application的回调不再传输NSDictionary类型的参数, 防止崩溃 + +## 0.8.8 +- enhance: CGSize增加width和height + +## 0.8.7 +- enhance: 增加ImageProviderX + +## 0.8.6 +- enhance: 增加java_lang_Throwable + +## 0.8.5 +- enhance: 接口类增加sbInstance方法 + +## 0.8.4 +- enhance: 增加android_view_SurfaceHolder_Callback + +## 0.8.3 +- enhance: 增加android_view_SurfaceView + +## 0.8.2 +- feat: android_location_Location增加setter + +## 0.8.1 +- feat: 增加startActivityForResult方法 +- feat: 增加uri2ImageData +- feat: UIViewController::get +- feat: android_location_Location增加创建方法 + +## 0.8.0 +- fix: UIImage scale问题处理 + +## 0.7.3 +- feat: 增加java.io.File + +## 0.7.2 +- feat: 增加java_io_Closeable + +## 0.7.1 +- feat: Bundle增加getString和putString +- enhance: ios使用static_framework +- enhance: 适配1.17 + +## 0.7.0 +- enhance: [breaking change] 去除CoreLocation相关逻辑, 计划分离到core_location_fluttiy插件中去 +- feat: 增加android_view_View_OnTouchListener类; 增加ui_view.widget +- feat: 增加av_audio_session_category_options +- feat: CGRect增加create方法 +- feat: android.graphics.Bitmap和UIImage各自增加从原生素材创建Image的方法 + +## 0.6.1 +- enhance: android: *Handler的args参数使用Any类型, 内部再做转换 +- feat: 增加批处理方法 + +## 0.6.0 +- enhance: [breaking change] Ref类内的方法和属性都加上__后缀, 防止和子类冲突 + +## 0.5.1 +- feat: NSError增加获取code和description的方法 + +## 0.5.0 +- enhance: [breaking change] tag -> tag__ + +## 0.4.18 +- feat: 增加UIViewController + +## 0.4.17 +- feat: 使用System.identityHashCode代替hashCode方法 +- feat: 增加android.view.View.OnClickListener类 +- feat: 增加startActivity/presentViewController方法 + +## 0.4.16 +- feat: 增加NSValue类 + +## 0.4.15 +- enhance: 简化platform方法 +- enhance: 补上漏掉的log开关 +- enhance: 迁移创建方法到对应类的handler里去 +- feat: 增加android.app.Notification类 + +## 0.4.14 +- enhance: CLLocationCoordinate2D增加批量创建方法 + +## 0.4.13 +- enhance: 优化批量释放日志 +- feat: UIView增加hidden和setHidden + +## 0.4.12 +- enhance: 优化platform方法里的释放逻辑 + +## 0.4.11 +- enhance: Ref增加批处理释放对象方法 + +## 0.4.10 +- feat: 增加org_json_JSONObject类 + +## 0.4.9 +- feat: 增加android_view_View_OnApplyWindowInsetsListener类 + +## 0.4.8 +- feat: Bitmap增加批量创建方法 + +## 0.4.7 +- refactor: PlatformFactory统一为PlatformService +- feat: 增加ns_operation类 + +## 0.4.6 +- feat: 增加一些通用的typedef + +## 0.4.5+1 +- fix: onAttachedToEngine中的Plugin对象应该使用this + +## 0.4.5 +- fix: PlatformFactory的activity是可选类型; +- enhance: android_util_Pair获取first和second都返回Object + +## 0.4.4 +- enhance: 适配新版embedding +- refactor: method channel放到objects文件里 + +## 0.4.3 +- feat: 增加为对象动态添加属性的方法(目前仅限ios端, android理论上可以再加全局Map实现,但是目前没有碰到此类需求) + +## 0.4.2 +- feat: 增加java_io_Serializable + +## 0.4.1 +- feat: 增加android_os_Binder + +## 0.4.0 +- refactor: 可以放进类的静态方法替换全局函数 + +## 0.3.0 +- refactor: 函数代替类 +- chore: 提升gradle相关版本 + +## 0.2.7 +- feat: 增加pending_intent类 + +## 0.2.6 +- feat: android端增加BroadcastReceiver统一接收广播 + +## 0.2.5 +- feat: CLHeading实现magneticHeading,trueHeading,headingAccuracy + +## 0.2.4 +- feat: android_location_Location增加bearing, altitude, accuracy, speed + +## 0.2.3 +- feat: 增加android_content_ContentProvider + +## 0.2.2 +- feat: 实现UIEdgeInsets的属性 + +## 0.2.1 +- fix: [objc] 每个.h文件都import + +## 0.2.0 +- [breaking change] 整理工厂方法 + +## 0.1.5 +- feat: 增加cgpoint的创建支持,获取x和y + +## 0.1.4 +- feat: 增加android_graphics_Point的创建, getX, getY的支持 + +## 0.1.3 +feat: 增加NSData + +## 0.1.2 +- 新增android.app.Activity#getIntent() +- feat: android端的Intent处理容器 + +## 0.1.1 +- 增加android.content.Intent diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..8335662 --- /dev/null +++ b/LICENSE @@ -0,0 +1,13 @@ +Copyright 2020 yohom + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..f03bdb5 --- /dev/null +++ b/README.md @@ -0,0 +1,5 @@ +# `Fluttify`基础设施 + +所有基于`Fluttify`的插件公共的部分, 当然不基于`Fluttify`的插件理论上也可以使用. + +主要实现一些基础设施和系统类的实现. \ No newline at end of file diff --git a/analysis_options.yaml b/analysis_options.yaml new file mode 100644 index 0000000..280c88e --- /dev/null +++ b/analysis_options.yaml @@ -0,0 +1,7 @@ +include: package:pedantic/analysis_options.yaml + +linter: + rules: + camel_case_types: false + camel_case_extensions: false + omit_local_variable_types: false \ No newline at end of file diff --git a/android/build.gradle b/android/build.gradle new file mode 100644 index 0000000..bba2693 --- /dev/null +++ b/android/build.gradle @@ -0,0 +1,70 @@ +group 'me.yohom.foundation_fluttify' +version '1.0-SNAPSHOT' + +buildscript { + ext.kotlin_version = "1.8.22" + repositories { + google() + mavenCentral() + } + + dependencies { + classpath("com.android.tools.build:gradle:8.1.0") + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version") + } +} + +rootProject.allprojects { + repositories { + google() + mavenCentral() + } +} + +apply plugin: 'com.android.library' +apply plugin: 'kotlin-android' + +android { + if (project.android.hasProperty("namespace")) { + namespace = "me.yohom.foundation_fluttify" + } + + compileSdk = 34 + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + kotlinOptions { + jvmTarget = JavaVersion.VERSION_1_8 + } + + sourceSets { + main.java.srcDirs += "src/main/kotlin" + test.java.srcDirs += "src/test/kotlin" + } + + defaultConfig { + minSdk = 21 + } + + dependencies { + testImplementation("org.jetbrains.kotlin:kotlin-test") + testImplementation("org.mockito:mockito-core:5.0.0") + } + + testOptions { + unitTests.all { + useJUnitPlatform() + + testLogging { + events "passed", "skipped", "failed", "standardOut", "standardError" + outputs.upToDateWhen {false} + showStandardStreams = true + } + } + } + +} + + diff --git a/android/gradle.properties b/android/gradle.properties new file mode 100644 index 0000000..38c8d45 --- /dev/null +++ b/android/gradle.properties @@ -0,0 +1,4 @@ +org.gradle.jvmargs=-Xmx1536M +android.enableR8=true +android.useAndroidX=true +android.enableJetifier=true diff --git a/android/settings.gradle b/android/settings.gradle new file mode 100644 index 0000000..81365b5 --- /dev/null +++ b/android/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'foundation_fluttify' diff --git a/android/src/main/AndroidManifest.xml b/android/src/main/AndroidManifest.xml new file mode 100644 index 0000000..e248719 --- /dev/null +++ b/android/src/main/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + + + diff --git a/android/src/main/java/me/yohom/foundation_fluttify/core/FluttifyMessageCodec.java b/android/src/main/java/me/yohom/foundation_fluttify/core/FluttifyMessageCodec.java new file mode 100644 index 0000000..d9666fb --- /dev/null +++ b/android/src/main/java/me/yohom/foundation_fluttify/core/FluttifyMessageCodec.java @@ -0,0 +1,82 @@ +package me.yohom.foundation_fluttify.core; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import io.flutter.plugin.common.StandardMessageCodec; +import me.yohom.foundation_fluttify.FoundationFluttifyPluginKt; + +import java.io.ByteArrayOutputStream; +import java.nio.ByteBuffer; +import java.nio.charset.Charset; +import java.util.*; + +public class FluttifyMessageCodec extends StandardMessageCodec { + private static final Charset UTF8 = Charset.forName("UTF8"); + + // 总体逻辑, 先尝试使用标准编解码进行处理, 如果发生异常再使用自定义的编解码处理, 再不行就只能抛异常了 + private static final byte ARRAY = 125; + private static final byte ENUM = 126; + private static final byte REF = 127; + + @Override + protected void writeValue(@NonNull ByteArrayOutputStream stream, @NonNull Object value) { + try { + super.writeValue(stream, value); + } catch (IllegalArgumentException e) { + // 对象数组转换 + if (value instanceof Object[]) { + stream.write(ARRAY); + Object[] array = (Object[]) value; + writeSize(stream, array.length); + for (Object item : array) { + writeValue(stream, item); + } + } + // 枚举值传索引 + else if (value instanceof Enum) { + stream.write(ENUM); + writeInt(stream, ((Enum) value).ordinal()); + } else { + final String refId = value.getClass().getName() + ":" + System.identityHashCode(value); + // 放入HEAP + FoundationFluttifyPluginKt.getHEAP().put(refId, value); + + stream.write(REF); + writeBytes(stream, refId.getBytes(UTF8)); + } + } + } + + @Nullable + protected Object readValueOfType(byte type, @NonNull ByteBuffer buffer) { + Object result; + try { + result = super.readValueOfType(type, buffer); + } catch (IllegalArgumentException e) { + switch (type) { + case ARRAY: + final int size = readSize(buffer); + final List list = new ArrayList<>(size); + int i = 0; + while (i < size) { + list.add(readValue(buffer)); + i++; + } + result = list.toArray(); + break; + case ENUM: + result = buffer.getInt(); + break; + case REF: + final byte[] bytes = readBytes(buffer); + result = FoundationFluttifyPluginKt.getHEAP().get(new String(bytes, UTF8)); + break; + default: + result = null; + } + } + + return result; + + } +} \ No newline at end of file diff --git a/android/src/main/kotlin/me/yohom/foundation_fluttify/FoundationFluttifyPlugin.kt b/android/src/main/kotlin/me/yohom/foundation_fluttify/FoundationFluttifyPlugin.kt new file mode 100644 index 0000000..ced14d7 --- /dev/null +++ b/android/src/main/kotlin/me/yohom/foundation_fluttify/FoundationFluttifyPlugin.kt @@ -0,0 +1,157 @@ +package me.yohom.foundation_fluttify + +import android.app.Activity +import android.content.Context +import io.flutter.embedding.engine.plugins.FlutterPlugin +import io.flutter.embedding.engine.plugins.activity.ActivityAware +import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding +import io.flutter.plugin.common.BinaryMessenger +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel +import io.flutter.plugin.common.MethodChannel.MethodCallHandler +import io.flutter.plugin.common.MethodChannel.Result +import io.flutter.plugin.common.PluginRegistry.Registrar +import io.flutter.plugin.common.StandardMethodCodec +import io.flutter.plugin.platform.PlatformViewRegistry +import me.yohom.foundation_fluttify.android.app.ActivityHandler +import me.yohom.foundation_fluttify.android.app.ApplicationHandler +import me.yohom.foundation_fluttify.android.app.NotificationHandler +import me.yohom.foundation_fluttify.android.app.PendingIntentHandler +import me.yohom.foundation_fluttify.android.content.BroadcastReceiverHandler +import me.yohom.foundation_fluttify.android.content.ContextHandler +import me.yohom.foundation_fluttify.android.content.IntentFilterHandler +import me.yohom.foundation_fluttify.android.content.IntentHandler +import me.yohom.foundation_fluttify.android.graphics.BitmapHandler +import me.yohom.foundation_fluttify.android.graphics.PointHandler +import me.yohom.foundation_fluttify.android.location.LocationHandler +import me.yohom.foundation_fluttify.android.os.BundleHandler +import me.yohom.foundation_fluttify.android.util.PairHandler +import me.yohom.foundation_fluttify.android.view.SurfaceHolderHandler +import me.yohom.foundation_fluttify.android.view.SurfaceViewHandler +import me.yohom.foundation_fluttify.android.view.ViewGroupHandler +import me.yohom.foundation_fluttify.android.view.ViewHandler +import me.yohom.foundation_fluttify.android.widget.ImageViewHandler +import me.yohom.foundation_fluttify.core.FluttifyMessageCodec +import me.yohom.foundation_fluttify.core.PlatformService +import me.yohom.foundation_fluttify.java.io.FileHandler +import me.yohom.foundation_fluttify.platform_view.android_opengl_GLSurfaceViewFactory +import me.yohom.foundation_fluttify.platform_view.android_view_SurfaceViewFactory +import me.yohom.foundation_fluttify.platform_view.android_widget_FrameLayoutFactory + + +// The stack that exists on the Dart side for a method call is enabled only when the MethodChannel passing parameters are limited +val STACK = mutableMapOf() + +// Container for Dart side random access objects +val HEAP = mutableMapOf() + +// whether enable log or not +var enableLog: Boolean = true + +// method channel for foundation +lateinit var gMethodChannel: MethodChannel + +class FoundationFluttifyPlugin : FlutterPlugin, ActivityAware, MethodCallHandler { + private var applicationContext: Context? = null + private var activity: Activity? = null + private var activityBinding: ActivityPluginBinding? = null + private var pluginBinding: FlutterPlugin.FlutterPluginBinding? = null + private var registrar: Registrar? = null + private var platformViewRegistry: PlatformViewRegistry? = null + private var binaryMessenger: BinaryMessenger? = null + + companion object { + @JvmStatic + fun registerWith(registrar: Registrar) { + val plugin = FoundationFluttifyPlugin() + plugin.registrar = registrar + plugin.platformViewRegistry = registrar.platformViewRegistry() + plugin.binaryMessenger = registrar.messenger() + plugin.activity = registrar.activity() + plugin.applicationContext = registrar.activity()?.applicationContext + plugin.platformViewRegistry?.registerViewFactory("me.yohom/foundation_fluttify/android.view.SurfaceView", android_view_SurfaceViewFactory(registrar.messenger())) + plugin.platformViewRegistry?.registerViewFactory("me.yohom/foundation_fluttify/android.widget.FrameLayout", android_widget_FrameLayoutFactory()) + plugin.platformViewRegistry?.registerViewFactory("me.yohom/foundation_fluttify/android.opengl.GLSurfaceView", android_opengl_GLSurfaceViewFactory()) + + gMethodChannel = MethodChannel( + registrar.messenger(), + "com.fluttify/foundation_method", + StandardMethodCodec(FluttifyMessageCodec()) + ) + gMethodChannel.setMethodCallHandler(plugin) + + } + } + + override fun onMethodCall(methodCall: MethodCall, methodResult: Result) { + val rawArgs = methodCall.arguments ?: mapOf() + methodCall.method.run { + when { + startsWith("android.app.Application::") -> ApplicationHandler(methodCall.method, rawArgs, methodResult, applicationContext) + startsWith("android.app.Activity::") -> ActivityHandler(methodCall.method, rawArgs, methodResult, activity) + startsWith("android.app.PendingIntent::") -> PendingIntentHandler(methodCall.method, rawArgs, methodResult) + startsWith("android.app.Notification::") -> NotificationHandler(methodCall.method, rawArgs, methodResult, activity) + startsWith("android.os.Bundle::") -> BundleHandler(methodCall.method, rawArgs, methodResult) + startsWith("android.content.Intent::") -> IntentHandler(methodCall.method, rawArgs, methodResult) + startsWith("android.content.Context::") -> ContextHandler(methodCall.method, rawArgs, methodResult) + startsWith("android.content.BroadcastReceiver::") -> BroadcastReceiverHandler(methodCall.method, rawArgs, registrar?.messenger(), methodResult) + startsWith("android.content.IntentFilter::") -> IntentFilterHandler(methodCall.method, rawArgs, methodResult) + startsWith("android.graphics.Bitmap::") -> BitmapHandler(methodCall.method, rawArgs, methodResult, activity) + startsWith("android.graphics.Point::") -> PointHandler(methodCall.method, rawArgs, methodResult) + startsWith("android.location.Location::") -> LocationHandler(methodCall.method, rawArgs, methodResult) + startsWith("android.util.Pair::") -> PairHandler(methodCall.method, rawArgs, methodResult) + startsWith("android.view.View::") -> ViewHandler(methodCall.method, rawArgs, methodResult) + startsWith("android.view.SurfaceView::") -> SurfaceViewHandler(methodCall.method, rawArgs, methodResult) + startsWith("android.view.SurfaceHolder::") -> SurfaceHolderHandler(binaryMessenger, methodCall.method, rawArgs, methodResult) + startsWith("android.view.ViewGroup::") -> ViewGroupHandler(methodCall.method, rawArgs, methodResult) + startsWith("android.widget.ImageView::") -> ImageViewHandler(methodCall.method, rawArgs, methodResult, activity) + startsWith("java.io.File::") -> FileHandler(methodCall.method, rawArgs, methodResult) + startsWith("PlatformService::") -> PlatformService(methodCall.method, rawArgs as Map, methodResult, activityBinding, pluginBinding, registrar) + else -> methodResult.notImplemented() + } + } + } + + override fun onAttachedToEngine(binding: FlutterPlugin.FlutterPluginBinding) { + applicationContext = binding.applicationContext + pluginBinding = binding + platformViewRegistry = binding.platformViewRegistry + binaryMessenger = binding.binaryMessenger + + gMethodChannel = MethodChannel( + binding.binaryMessenger, + "com.fluttify/foundation_method", + StandardMethodCodec(FluttifyMessageCodec()) + ) + gMethodChannel.setMethodCallHandler(this) + } + + override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) { + pluginBinding = null + activity = null + activityBinding = null + } + + override fun onAttachedToActivity(binding: ActivityPluginBinding) { + activity = binding.activity + activityBinding = binding + platformViewRegistry?.registerViewFactory("me.yohom/foundation_fluttify/android.view.SurfaceView", android_view_SurfaceViewFactory(binaryMessenger)) + platformViewRegistry?.registerViewFactory("me.yohom/foundation_fluttify/android.widget.FrameLayout", android_widget_FrameLayoutFactory()) + platformViewRegistry?.registerViewFactory("me.yohom/foundation_fluttify/android.opengl.GLSurfaceView", android_opengl_GLSurfaceViewFactory()) + } + + override fun onDetachedFromActivity() { + activity = null + activityBinding = null + } + + override fun onReattachedToActivityForConfigChanges(binding: ActivityPluginBinding) { + activity = binding.activity + activityBinding = binding + } + + override fun onDetachedFromActivityForConfigChanges() { + activity = null + activityBinding = null + } +} \ No newline at end of file diff --git a/android/src/main/kotlin/me/yohom/foundation_fluttify/android/app/ActivityHandler.kt b/android/src/main/kotlin/me/yohom/foundation_fluttify/android/app/ActivityHandler.kt new file mode 100644 index 0000000..a0e91c7 --- /dev/null +++ b/android/src/main/kotlin/me/yohom/foundation_fluttify/android/app/ActivityHandler.kt @@ -0,0 +1,17 @@ +package me.yohom.foundation_fluttify.android.app + +import android.app.Activity +import io.flutter.plugin.common.MethodChannel +import me.yohom.foundation_fluttify.core.__this__ + +fun ActivityHandler(method: String, args: Any, methodResult: MethodChannel.Result, context: Activity?) { + when (method) { + "android.app.Activity::getIntent" -> { + methodResult.success(args.__this__().intent) + } + "android.app.Activity::get" -> { + methodResult.success(context) + } + else -> methodResult.notImplemented() + } +} \ No newline at end of file diff --git a/android/src/main/kotlin/me/yohom/foundation_fluttify/android/app/ApplicationHandler.kt b/android/src/main/kotlin/me/yohom/foundation_fluttify/android/app/ApplicationHandler.kt new file mode 100644 index 0000000..dc7ed29 --- /dev/null +++ b/android/src/main/kotlin/me/yohom/foundation_fluttify/android/app/ApplicationHandler.kt @@ -0,0 +1,13 @@ +package me.yohom.foundation_fluttify.android.app + +import android.content.Context +import io.flutter.plugin.common.MethodChannel + +fun ApplicationHandler(method: String, args: Any, methodResult: MethodChannel.Result, context: Context?) { + when (method) { + "android.app.Application::get" -> { + methodResult.success(context) + } + else -> methodResult.notImplemented() + } +} \ No newline at end of file diff --git a/android/src/main/kotlin/me/yohom/foundation_fluttify/android/app/NotificationHandler.kt b/android/src/main/kotlin/me/yohom/foundation_fluttify/android/app/NotificationHandler.kt new file mode 100644 index 0000000..4cb89f3 --- /dev/null +++ b/android/src/main/kotlin/me/yohom/foundation_fluttify/android/app/NotificationHandler.kt @@ -0,0 +1,65 @@ +package me.yohom.foundation_fluttify.android.app + +import android.app.Activity +import android.app.Notification +import android.app.NotificationChannel +import android.app.NotificationManager +import android.content.Context +import android.graphics.Color +import android.os.Build +import io.flutter.plugin.common.MethodChannel +import me.yohom.foundation_fluttify.HEAP +import me.yohom.foundation_fluttify.enableLog + +fun NotificationHandler(method: String, rawArgs: Any, methodResult: MethodChannel.Result, activity: Activity?) { + when (method) { + "android.app.Notification::create" -> { + val args = rawArgs as Map + if (activity == null) { + methodResult.error("activity cannot be null", "activity cannot be null", "activity cannot be null") + } else { + val contentTitle = args["contentTitle"] as String + val contentText = args["contentText"] as String + val `when` = args["when"] as Long + val channelId = args["channelId"] as String + val channelName = args["channelName"] as String + val enableLights = args["enableLights"] as Boolean + val showBadge = args["showBadge"] as Boolean + + if (enableLog) { + android.util.Log.d("Notification create: ", "contentTitle: $contentTitle, contentText: $contentText, when: $`when`, channelId: $channelId, channelName: $channelName, enableLights: $enableLights, showBadge: $showBadge") + } + + val notificationManager: NotificationManager = activity.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager + + // Android O上对Notification进行了修改,如果设置的targetSDKVersion>=26建议使用此种方式创建通知栏 + val builder: Notification.Builder = if (Build.VERSION.SDK_INT >= 26) { + val notificationChannel = NotificationChannel(channelId, channelName, NotificationManager.IMPORTANCE_DEFAULT) + .apply { + enableLights(enableLights) //是否在桌面icon右上角展示小圆点 + lightColor = Color.BLUE //小圆点颜色 + setShowBadge(showBadge) //是否在久按桌面图标时显示此渠道的通知 + } + + notificationManager.createNotificationChannel(notificationChannel) + + Notification.Builder(activity.applicationContext, channelId) + } else { + Notification.Builder(activity.applicationContext) + } + + // TODO: 从flutter传icon数据过来? + val iconId = activity.resources.getIdentifier("ic_launcher", "mipmap", activity.packageName) + + builder.setSmallIcon(iconId) + .setContentTitle(contentTitle) + .setContentText(contentText) + .setWhen(`when`) + val notification = builder.build() + + methodResult.success(notification) + } + } + else -> methodResult.notImplemented() + } +} \ No newline at end of file diff --git a/android/src/main/kotlin/me/yohom/foundation_fluttify/android/app/PendingIntentHandler.kt b/android/src/main/kotlin/me/yohom/foundation_fluttify/android/app/PendingIntentHandler.kt new file mode 100644 index 0000000..75289bd --- /dev/null +++ b/android/src/main/kotlin/me/yohom/foundation_fluttify/android/app/PendingIntentHandler.kt @@ -0,0 +1,9 @@ +package me.yohom.foundation_fluttify.android.app + +import io.flutter.plugin.common.MethodChannel + +fun PendingIntentHandler(method: String, args: Any, methodResult: MethodChannel.Result) { + when (method) { + else -> methodResult.notImplemented() + } +} \ No newline at end of file diff --git a/android/src/main/kotlin/me/yohom/foundation_fluttify/android/content/BroadcastReceiverHandler.kt b/android/src/main/kotlin/me/yohom/foundation_fluttify/android/content/BroadcastReceiverHandler.kt new file mode 100644 index 0000000..01acefa --- /dev/null +++ b/android/src/main/kotlin/me/yohom/foundation_fluttify/android/content/BroadcastReceiverHandler.kt @@ -0,0 +1,29 @@ +package me.yohom.foundation_fluttify.android.content + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import io.flutter.plugin.common.BinaryMessenger +import io.flutter.plugin.common.MethodChannel +import me.yohom.foundation_fluttify.HEAP + +fun BroadcastReceiverHandler(method: String, rawArgs: Any, binaryMessenger: BinaryMessenger?, methodResult: MethodChannel.Result) { + when (method) { + "android.content.BroadcastReceiver::create" -> { + val receiver = object : BroadcastReceiver() { + override fun onReceive(context: Context?, intent: Intent?) { + if (binaryMessenger != null) { + MethodChannel(binaryMessenger, "android.content.BroadcastReceiver::create::Callback") + .invokeMethod( + "Callback::android.content.BroadcastReceiver::onReceive", + mapOf("intent" to intent) + ) + } + } + } + + methodResult.success(receiver) + } + else -> methodResult.notImplemented() + } +} \ No newline at end of file diff --git a/android/src/main/kotlin/me/yohom/foundation_fluttify/android/content/ContextHandler.kt b/android/src/main/kotlin/me/yohom/foundation_fluttify/android/content/ContextHandler.kt new file mode 100644 index 0000000..c61742b --- /dev/null +++ b/android/src/main/kotlin/me/yohom/foundation_fluttify/android/content/ContextHandler.kt @@ -0,0 +1,24 @@ +package me.yohom.foundation_fluttify.android.content + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.IntentFilter +import io.flutter.plugin.common.MethodChannel +import me.yohom.foundation_fluttify.core.__this__ +import me.yohom.foundation_fluttify.core.get + +fun ContextHandler(method: String, rawArgs: Any, methodResult: MethodChannel.Result) { + when (method) { + "android.content.Context::registerReceiver" -> { + val broadcastReceiver = rawArgs["broadcastReceiver"] as BroadcastReceiver + val intentFilter = rawArgs["intentFilter"] as IntentFilter + + val context: Context = rawArgs.__this__() + + val intent = context.registerReceiver(broadcastReceiver, intentFilter) + + methodResult.success(intent) + } + else -> methodResult.notImplemented() + } +} \ No newline at end of file diff --git a/android/src/main/kotlin/me/yohom/foundation_fluttify/android/content/IntentFilterHandler.kt b/android/src/main/kotlin/me/yohom/foundation_fluttify/android/content/IntentFilterHandler.kt new file mode 100644 index 0000000..06ec82f --- /dev/null +++ b/android/src/main/kotlin/me/yohom/foundation_fluttify/android/content/IntentFilterHandler.kt @@ -0,0 +1,18 @@ +package me.yohom.foundation_fluttify.android.content + +import android.content.IntentFilter +import io.flutter.plugin.common.MethodChannel +import me.yohom.foundation_fluttify.core.get + +fun IntentFilterHandler(method: String, rawArgs: Any, methodResult: MethodChannel.Result) { + when (method) { + "android.content.IntentFilter::create" -> { + val action = rawArgs["action"] as String + + val intentFilter = IntentFilter(action) + + methodResult.success(intentFilter) + } + else -> methodResult.notImplemented() + } +} \ No newline at end of file diff --git a/android/src/main/kotlin/me/yohom/foundation_fluttify/android/content/IntentHandler.kt b/android/src/main/kotlin/me/yohom/foundation_fluttify/android/content/IntentHandler.kt new file mode 100644 index 0000000..6fb9cbc --- /dev/null +++ b/android/src/main/kotlin/me/yohom/foundation_fluttify/android/content/IntentHandler.kt @@ -0,0 +1,31 @@ +package me.yohom.foundation_fluttify.android.content + +import android.content.Intent +import android.os.Bundle +import io.flutter.plugin.common.MethodChannel +import me.yohom.foundation_fluttify.core.__this__ + +fun IntentHandler(method: String, args: Any, methodResult: MethodChannel.Result) { + when (method) { + "android.content.Intent::getBundle" -> { + val intent: Intent = args.__this__() + + val bundle = intent.extras ?: Bundle.EMPTY + + val result: MutableMap = mutableMapOf() + for (key in bundle.keySet()) { + result[key] = bundle.getSerializable(key) + } + + methodResult.success(result) + } + "android.content.Intent::getAction" -> { + val intent: Intent = args.__this__() + + val action = intent.action + + methodResult.success(action) + } + else -> methodResult.notImplemented() + } +} \ No newline at end of file diff --git a/android/src/main/kotlin/me/yohom/foundation_fluttify/android/graphics/BitmapHandler.kt b/android/src/main/kotlin/me/yohom/foundation_fluttify/android/graphics/BitmapHandler.kt new file mode 100644 index 0000000..4dcd5a8 --- /dev/null +++ b/android/src/main/kotlin/me/yohom/foundation_fluttify/android/graphics/BitmapHandler.kt @@ -0,0 +1,57 @@ +package me.yohom.foundation_fluttify.android.graphics + +import android.app.Activity +import android.graphics.Bitmap +import android.graphics.BitmapFactory +import io.flutter.plugin.common.MethodChannel +import me.yohom.foundation_fluttify.core.__this__ +import me.yohom.foundation_fluttify.core.get +import java.io.ByteArrayOutputStream + +fun BitmapHandler(method: String, rawArgs: Any, methodResult: MethodChannel.Result, activity: Activity?) { + when (method) { + "android.graphics.Bitmap::create" -> { + val bitmapBytes = rawArgs["bitmapBytes"] as ByteArray + val bitmap = BitmapFactory.decodeByteArray(bitmapBytes, 0, bitmapBytes.size) + + methodResult.success(bitmap) + } + "android.graphics.Bitmap::createWithDrawable" -> { + val drawableId = rawArgs["drawableId"] as Int + if (activity != null) { + val bitmap = BitmapFactory.decodeResource(activity.resources, drawableId) + methodResult.success(bitmap) + } else { + methodResult.error("Activity不能为null", "Activity不能为null", "Activity不能为null") + } + } + "android.graphics.Bitmap::create_batch" -> { + val typedArgs = rawArgs as List> + val bitmapBytesBatch = typedArgs.map { it["bitmapBytes"] as ByteArray } + + val resultBatch = bitmapBytesBatch + .map { BitmapFactory.decodeByteArray(it, 0, it.size) } + + methodResult.success(resultBatch) + } + "android.graphics.Bitmap::getData" -> { + val bitmap = rawArgs["__this__"] as Bitmap + + val outputStream = ByteArrayOutputStream() + bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream) + methodResult.success(outputStream.toByteArray()) + } + "android.graphics.Bitmap::recycle" -> { + val bitmap: Bitmap = rawArgs.__this__() + + bitmap.recycle() + methodResult.success("success") + } + "android.graphics.Bitmap::isRecycled" -> { + val bitmap: Bitmap = rawArgs.__this__() + + methodResult.success(bitmap.isRecycled) + } + else -> methodResult.notImplemented() + } +} \ No newline at end of file diff --git a/android/src/main/kotlin/me/yohom/foundation_fluttify/android/graphics/PointHandler.kt b/android/src/main/kotlin/me/yohom/foundation_fluttify/android/graphics/PointHandler.kt new file mode 100644 index 0000000..8d2d54e --- /dev/null +++ b/android/src/main/kotlin/me/yohom/foundation_fluttify/android/graphics/PointHandler.kt @@ -0,0 +1,29 @@ +package me.yohom.foundation_fluttify.android.graphics + +import android.graphics.Point +import io.flutter.plugin.common.MethodChannel +import me.yohom.foundation_fluttify.core.__this__ +import me.yohom.foundation_fluttify.core.get + +fun PointHandler(method: String, rawArgs: Any, methodResult: MethodChannel.Result) { + when (method) { + "android.graphics.Point::create" -> { + val x = rawArgs["x"] as Int + val y = rawArgs["y"] as Int + val point = Point(x, y) + + methodResult.success(point) + } + "android.graphics.Point::getX" -> { + val point: Point = rawArgs.__this__() + + methodResult.success(point.x) + } + "android.graphics.Point::getY" -> { + val point: Point = rawArgs.__this__() + + methodResult.success(point.y) + } + else -> methodResult.notImplemented() + } +} \ No newline at end of file diff --git a/android/src/main/kotlin/me/yohom/foundation_fluttify/android/location/LocationHandler.kt b/android/src/main/kotlin/me/yohom/foundation_fluttify/android/location/LocationHandler.kt new file mode 100644 index 0000000..fb8f8a4 --- /dev/null +++ b/android/src/main/kotlin/me/yohom/foundation_fluttify/android/location/LocationHandler.kt @@ -0,0 +1,102 @@ +package me.yohom.foundation_fluttify.android.location + +import android.location.Location +import io.flutter.plugin.common.MethodChannel +import me.yohom.foundation_fluttify.core.__this__ +import me.yohom.foundation_fluttify.core.get + +fun LocationHandler(method: String, rawArgs: Any, methodResult: MethodChannel.Result) { + when (method) { + "android.location.Location::create" -> { + val provider = rawArgs["provider"] as String + + val location = Location(provider) + + methodResult.success(location) + } + "android.location.Location::getLatitude" -> { + val location: Location = rawArgs.__this__() + + methodResult.success(location.latitude) + } + "android.location.Location::getLongitude" -> { + val location: Location = rawArgs.__this__() + + methodResult.success(location.longitude) + } + "android.location.Location::getBearing" -> { + val location: Location = rawArgs.__this__() + + methodResult.success(location.bearing) + } + "android.location.Location::getAltitude" -> { + val location: Location = rawArgs.__this__() + + methodResult.success(location.altitude) + } + "android.location.Location::getAccuracy" -> { + val location: Location = rawArgs.__this__() + + methodResult.success(location.accuracy) + } + "android.location.Location::getSpeed" -> { + val location: Location = rawArgs.__this__() + + methodResult.success(location.speed) + } + "android.location.Location::setLatitude" -> { + val latitude = rawArgs["latitude"] as Double + + val location: Location = rawArgs.__this__() + location.latitude = latitude + + methodResult.success("success") + } + "android.location.Location::setLongitude" -> { + val longitude = rawArgs["longitude"] as Double + + val location: Location = rawArgs.__this__() + + location.longitude = longitude + + methodResult.success("success") + } + "android.location.Location::setBearing" -> { + val bearing = rawArgs["bearing"] as Double + + val location: Location = rawArgs.__this__() + + location.bearing = bearing.toFloat() + + methodResult.success("success") + } + "android.location.Location::setAltitude" -> { + val altitude = rawArgs["altitude"] as Double + + val location: Location = rawArgs.__this__() + + location.altitude = altitude + + methodResult.success("success") + } + "android.location.Location::setAccuracy" -> { + val accuracy = rawArgs["accuracy"] as Double + + val location: Location = rawArgs.__this__() + + location.accuracy = accuracy.toFloat() + + methodResult.success("success") + } + "android.location.Location::setSpeed" -> { + val speed = rawArgs["speed"] as Double + + val location: Location = rawArgs.__this__() + + location.speed = speed.toFloat() + + methodResult.success("success") + } + else -> methodResult.notImplemented() + } +} \ No newline at end of file diff --git a/android/src/main/kotlin/me/yohom/foundation_fluttify/android/os/BundleHandler.kt b/android/src/main/kotlin/me/yohom/foundation_fluttify/android/os/BundleHandler.kt new file mode 100644 index 0000000..fe557fa --- /dev/null +++ b/android/src/main/kotlin/me/yohom/foundation_fluttify/android/os/BundleHandler.kt @@ -0,0 +1,75 @@ +package me.yohom.foundation_fluttify.android.os + +import android.os.Bundle +import io.flutter.plugin.common.MethodChannel +import me.yohom.foundation_fluttify.core.__this__ +import me.yohom.foundation_fluttify.core.get + +fun BundleHandler(method: String, rawArgs: Any, methodResult: MethodChannel.Result) { + when (method) { + "android.os.Bundle::create" -> { + val target = Bundle() + methodResult.success(target) + } + "android.os.Bundle::putString" -> { + val key = rawArgs["key"] as String + val value = rawArgs["value"] as String + + val bundle: Bundle = rawArgs.__this__() + + bundle.putString(key, value) + + methodResult.success("success") + } + "android.os.Bundle::putInt" -> { + val key = rawArgs["key"] as String + val value = rawArgs["value"] as Int + + val bundle: Bundle = rawArgs.__this__() + + bundle.putInt(key, value) + + methodResult.success("success") + } + "android.os.Bundle::getString" -> { + val key = rawArgs["key"] as String + + val bundle: Bundle = rawArgs.__this__() + + methodResult.success(bundle.getString(key)) + } + "android.os.Bundle::getInt" -> { + val key = rawArgs["key"] as String + + val bundle: Bundle = rawArgs.__this__() + + methodResult.success(bundle.getInt(key)) + } + "android.os.Bundle::getFloat" -> { + val key = rawArgs["key"] as String + + val bundle: Bundle = rawArgs.__this__() + + methodResult.success(bundle.getFloat(key)) + } + "android.os.Bundle::getDouble" -> { + val key = rawArgs["key"] as String + + val bundle: Bundle = rawArgs.__this__() + + methodResult.success(bundle.getDouble(key)) + } + "android.os.Bundle::getAll" -> { + val bundle: Bundle = rawArgs.__this__() + + val result: MutableMap = mutableMapOf() + + for (item in bundle.keySet()) { + result[item] = bundle.get(item) + } + + methodResult.success(result) + } + else -> methodResult.notImplemented() + } +} \ No newline at end of file diff --git a/android/src/main/kotlin/me/yohom/foundation_fluttify/android/util/PairHandler.kt b/android/src/main/kotlin/me/yohom/foundation_fluttify/android/util/PairHandler.kt new file mode 100644 index 0000000..65ae9a8 --- /dev/null +++ b/android/src/main/kotlin/me/yohom/foundation_fluttify/android/util/PairHandler.kt @@ -0,0 +1,21 @@ +package me.yohom.foundation_fluttify.android.util + +import android.util.Pair +import io.flutter.plugin.common.MethodChannel +import me.yohom.foundation_fluttify.core.__this__ + +fun PairHandler(method: String, rawArgs: Any, methodResult: MethodChannel.Result) { + when (method) { + "android.util.Pair::getFirst" -> { + val pair: Pair<*, *> = rawArgs.__this__() + + methodResult.success(pair.first) + } + "android.util.Pair::getSecond" -> { + val pair: Pair<*, *> = rawArgs.__this__() + + methodResult.success(pair.second) + } + else -> methodResult.notImplemented() + } +} \ No newline at end of file diff --git a/android/src/main/kotlin/me/yohom/foundation_fluttify/android/view/SurfaceHolderHandler.kt b/android/src/main/kotlin/me/yohom/foundation_fluttify/android/view/SurfaceHolderHandler.kt new file mode 100644 index 0000000..a786a78 --- /dev/null +++ b/android/src/main/kotlin/me/yohom/foundation_fluttify/android/view/SurfaceHolderHandler.kt @@ -0,0 +1,75 @@ +package me.yohom.foundation_fluttify.android.view + +import android.view.SurfaceHolder +import io.flutter.plugin.common.BinaryMessenger +import io.flutter.plugin.common.MethodChannel +import me.yohom.foundation_fluttify.core.get + +fun SurfaceHolderHandler( + messenger: BinaryMessenger?, + method: String, + rawArgs: Any, + methodResult: MethodChannel.Result +) { + when (method) { + "android.view.SurfaceHolder::addCallback" -> { + val __this__ = rawArgs["__this__"] as SurfaceHolder + + __this__.addCallback(object : SurfaceHolder.Callback { + private val channel = + MethodChannel(messenger!!, "android.view.SurfaceHolder::addCallback::Callback") + + override fun surfaceCreated(p0: SurfaceHolder) { + print("kotlin: onSurfaceCreated") + channel.invokeMethod( + "Callback::android.view.SurfaceHolder.Callback::surfaceCreated", + mapOf("var1" to p0) + ) + } + + override fun surfaceChanged(p0: SurfaceHolder, p1: Int, p2: Int, p3: Int) { + print("kotlin: surfaceChanged") + channel.invokeMethod( + "Callback::android.view.SurfaceHolder.Callback::surfaceChanged", + mapOf("var1" to p0, "var2" to p1, "var3" to p2, "var4" to p3) + ) + } + + override fun surfaceDestroyed(p0: SurfaceHolder) { + print("kotlin: surfaceDestroyed") + channel.invokeMethod( + "Callback::android.view.SurfaceHolder.Callback::surfaceDestroyed", + mapOf("var1" to p0) + ) + } + +// override fun surfaceCreated(p0: SurfaceHolder) { +// print("kotlin: onSurfaceCreated") +// channel.invokeMethod( +// "Callback::android.view.SurfaceHolder.Callback::surfaceCreated", +// mapOf("var1" to p0) +// ) +// } +// +// override fun surfaceChanged(p0: SurfaceHolder, p1: Int, p2: Int, p3: Int) { +// print("kotlin: surfaceChanged") +// channel.invokeMethod( +// "Callback::android.view.SurfaceHolder.Callback::surfaceChanged", +// mapOf("var1" to p0, "var2" to p1, "var3" to p2, "var4" to p3) +// ) +// } +// +// override fun surfaceDestroyed(p0: SurfaceHolder) { +// print("kotlin: surfaceDestroyed") +// channel.invokeMethod( +// "Callback::android.view.SurfaceHolder.Callback::surfaceDestroyed", +// mapOf("var1" to p0) +// ) +// } + }) + + methodResult.success("success") + } + else -> methodResult.notImplemented() + } +} \ No newline at end of file diff --git a/android/src/main/kotlin/me/yohom/foundation_fluttify/android/view/SurfaceViewHandler.kt b/android/src/main/kotlin/me/yohom/foundation_fluttify/android/view/SurfaceViewHandler.kt new file mode 100644 index 0000000..59c97ba --- /dev/null +++ b/android/src/main/kotlin/me/yohom/foundation_fluttify/android/view/SurfaceViewHandler.kt @@ -0,0 +1,25 @@ +package me.yohom.foundation_fluttify.android.view + +import android.view.SurfaceView +import io.flutter.plugin.common.MethodChannel +import me.yohom.foundation_fluttify.core.get + +fun SurfaceViewHandler(method: String, rawArgs: Any, methodResult: MethodChannel.Result) { + when (method) { + "android.view.SurfaceView::getHolder" -> { + val __this__ = rawArgs["__this__"] as SurfaceView + methodResult.success(__this__.holder) + } + "android.view.SurfaceView::setZOrderOnTop" -> { + val __this__ = rawArgs["__this__"] as SurfaceView + __this__.setZOrderOnTop(rawArgs["onTop"] as Boolean) + methodResult.success("success") + } + "android.view.SurfaceView::setZOrderMediaOverlay" -> { + val __this__ = rawArgs["__this__"] as SurfaceView + __this__.setZOrderMediaOverlay(rawArgs["isMediaOverlay"] as Boolean) + methodResult.success("success") + } + else -> methodResult.notImplemented() + } +} \ No newline at end of file diff --git a/android/src/main/kotlin/me/yohom/foundation_fluttify/android/view/ViewGroupHandler.kt b/android/src/main/kotlin/me/yohom/foundation_fluttify/android/view/ViewGroupHandler.kt new file mode 100644 index 0000000..045d0a8 --- /dev/null +++ b/android/src/main/kotlin/me/yohom/foundation_fluttify/android/view/ViewGroupHandler.kt @@ -0,0 +1,28 @@ +package me.yohom.foundation_fluttify.android.view + +import android.view.View +import android.view.ViewGroup +import io.flutter.plugin.common.MethodChannel +import me.yohom.foundation_fluttify.core.__this__ +import me.yohom.foundation_fluttify.core.get + +fun ViewGroupHandler(method: String, rawArgs: Any, methodResult: MethodChannel.Result) { + when (method) { + "android.view.ViewGroup::addView" -> { + val viewGroup: ViewGroup = rawArgs.__this__() + val child: View = rawArgs["child"] as View + + viewGroup.addView(child) + + methodResult.success("success") + } + "android.view.ViewGroup::removeAllViews" -> { + val viewGroup: ViewGroup = rawArgs.__this__() + + viewGroup.removeAllViews() + + methodResult.success("success") + } + else -> methodResult.notImplemented() + } +} \ No newline at end of file diff --git a/android/src/main/kotlin/me/yohom/foundation_fluttify/android/view/ViewHandler.kt b/android/src/main/kotlin/me/yohom/foundation_fluttify/android/view/ViewHandler.kt new file mode 100644 index 0000000..2fe105d --- /dev/null +++ b/android/src/main/kotlin/me/yohom/foundation_fluttify/android/view/ViewHandler.kt @@ -0,0 +1,9 @@ +package me.yohom.foundation_fluttify.android.view + +import io.flutter.plugin.common.MethodChannel + +fun ViewHandler(method: String, rawArgs: Any, methodResult: MethodChannel.Result) { + when (method) { + else -> methodResult.notImplemented() + } +} \ No newline at end of file diff --git a/android/src/main/kotlin/me/yohom/foundation_fluttify/android/widget/ImageViewHandler.kt b/android/src/main/kotlin/me/yohom/foundation_fluttify/android/widget/ImageViewHandler.kt new file mode 100644 index 0000000..f9087c6 --- /dev/null +++ b/android/src/main/kotlin/me/yohom/foundation_fluttify/android/widget/ImageViewHandler.kt @@ -0,0 +1,32 @@ +package me.yohom.foundation_fluttify.android.widget + +import android.app.Activity +import android.graphics.Bitmap +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import io.flutter.plugin.common.MethodChannel +import me.yohom.foundation_fluttify.core.__this__ +import me.yohom.foundation_fluttify.core.get + +fun ImageViewHandler( + method: String, + rawArgs: Any, + methodResult: MethodChannel.Result, + context: Activity? +) { + when (method) { + "android.widget.ImageView::createWithBitmap" -> { + if (context == null) { + methodResult.error("activity cannot be null", "activity cannot be null", "activity cannot be null") + } else { + val bitmap = rawArgs["bitmap"] as Bitmap + val imageView = ImageView(context) + imageView.setImageBitmap(bitmap) + + methodResult.success(imageView) + } + } + else -> methodResult.notImplemented() + } +} \ No newline at end of file diff --git a/android/src/main/kotlin/me/yohom/foundation_fluttify/core/AnyX.kt b/android/src/main/kotlin/me/yohom/foundation_fluttify/core/AnyX.kt new file mode 100644 index 0000000..a3ebbd8 --- /dev/null +++ b/android/src/main/kotlin/me/yohom/foundation_fluttify/core/AnyX.kt @@ -0,0 +1,11 @@ +@file:Suppress("ObjectPropertyName", "FunctionName") + +package me.yohom.foundation_fluttify.core + +fun Any.__this__(): T { + return (this as Map)["__this__"] as T +} + +operator fun Any.get(key: String): Any? { + return (this as Map)[key] +} diff --git a/android/src/main/kotlin/me/yohom/foundation_fluttify/core/PlatformService.kt b/android/src/main/kotlin/me/yohom/foundation_fluttify/core/PlatformService.kt new file mode 100644 index 0000000..8b88f5b --- /dev/null +++ b/android/src/main/kotlin/me/yohom/foundation_fluttify/core/PlatformService.kt @@ -0,0 +1,181 @@ +@file:Suppress("LocalVariableName", "FunctionName") + +package me.yohom.foundation_fluttify.core + +import android.app.Activity +import android.content.Intent +import android.util.Log +import io.flutter.embedding.engine.plugins.FlutterPlugin +import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding +import io.flutter.plugin.common.MethodChannel +import io.flutter.plugin.common.PluginRegistry +import me.yohom.foundation_fluttify.HEAP +import me.yohom.foundation_fluttify.STACK +import me.yohom.foundation_fluttify.enableLog + +fun PlatformService( + method: String, + args: Map, + methodResult: MethodChannel.Result, + activityBinding: ActivityPluginBinding?, + pluginBinding: FlutterPlugin.FlutterPluginBinding?, + registrar: PluginRegistry.Registrar? +) { + when (method) { + "PlatformService::enableLog" -> { + enableLog = args["enable"] as Boolean + methodResult.success("success") + } + "PlatformService::release" -> { + if (enableLog) Log.d("PlatformService", "size: ${HEAP.size}, 释放对象: ${args["__this__"]}") + + HEAP.remove(args["__this__"]) + + methodResult.success("success") + + // print current HEAP + if (enableLog) Log.d("PlatformService", "size: ${HEAP.size}, HEAP: $HEAP") + } + "PlatformService::isNull" -> { + methodResult.success(args["__this__"] == null) + } + "PlatformService::release_batch" -> { + if (enableLog) Log.d("PlatformService", "size: ${HEAP.size}, 批量释放对象: __this_batch__: ${args["__this_batch__"]}") + + (args["__this_batch__"] as List<*>).forEach { HEAP.remove(it) } + + methodResult.success("success") + + // print current HEAP + if (enableLog) Log.d("PlatformService", "size: ${HEAP.size}, HEAP: $HEAP") + } + "PlatformService::clearHeap" -> { + if (enableLog) Log.d("PlatformService", "size: ${HEAP.size}, CLEAR HEAP") + + HEAP.clear() + methodResult.success("success") + + // print current HEAP + if (enableLog) Log.d("PlatformService", "size: ${HEAP.size}, HEAP: $HEAP") + } + "PlatformService::pushStack" -> { + val name = args["name"] as String + val __this__ = args["__this__"] as Any + + if (enableLog) Log.d("PlatformService", "PUSH OBJECT: $__this__") + + STACK[name] = __this__ + + methodResult.success("success") + + // print current STACK + if (enableLog) Log.d("PlatformService", "size: ${STACK.size}, STACK: $STACK") + } + "PlatformService::pushStackJsonable" -> { + val name = args["name"] as String + val data = args["data"] + + if (enableLog) Log.d("PlatformService", "压入jsonable: ${data?.javaClass}@${data}") + + STACK[name] = data!! + + methodResult.success("success") + + // 打印当前STACK + if (enableLog) Log.d("PlatformService", "size: ${STACK.size}, STACK: $STACK") + } + "PlatformService::clearStack" -> { + STACK.clear() + + methodResult.success("success") + + // print current STACK + if (enableLog) Log.d("PlatformService", "size: ${STACK.size}, STACK: $STACK") + + } + "PlatformService::startActivity" -> { + val activity = activityBinding?.activity + + if (activity != null) { + val activityClass = args["activityClass"] as String + val extras = args["extras"] as Map + + val intent = Intent(activity, Class.forName(activityClass)) + extras.forEach { + when (it.value) { + is String -> intent.putExtra(it.key, it.value as String) + is Int -> intent.putExtra(it.key, it.value as Int) + is Long -> intent.putExtra(it.key, it.value as Long) + is Double -> intent.putExtra(it.key, it.value as Double) + } + } + activity.startActivity(intent) + + methodResult.success("success") + } else { + methodResult.error("当前Activity为null", "当前Activity为null", "当前Activity为null") + } + } + "PlatformService::startActivityForResult" -> { + val activity = activityBinding?.activity + + if (activity != null) { + val activityClass = args["activityClass"] as String + val requestCode = args["requestCode"] as Int + val extras = args["extras"] as Map + + val intent = Intent(activity, Class.forName(activityClass)) + extras.forEach { + when (it.value) { + is String -> intent.putExtra(it.key, it.value as String) + is Int -> intent.putExtra(it.key, it.value as Int) + is Long -> intent.putExtra(it.key, it.value as Long) + is Double -> intent.putExtra(it.key, it.value as Double) + } + } + activity.startActivityForResult(intent, requestCode) + activityBinding.addActivityResultListener { reqCode, resultCode, data -> + if (reqCode == requestCode) { + if (resultCode == Activity.RESULT_OK) { + methodResult.success(data) + } else { + methodResult.error("获取Activity结果失败", "获取Activity结果失败", "获取Activity结果失败") + } + } else { + methodResult.error("非当前请求的响应", "非当前请求的响应", "非当前请求的响应") + } + true + } + + methodResult.success("success") + } else { + methodResult.error("当前Activity为null", "当前Activity为null", "当前Activity为null") + } + } + "PlatformService::getAssetPath" -> { + val activity = activityBinding?.activity + + val flutterAssetPath = args["flutterAssetPath"] as String + + if (activity != null) { + val path = registrar?.lookupKeyForAsset(flutterAssetPath) + ?: pluginBinding?.flutterAssets?.getAssetFilePathByName(flutterAssetPath) + methodResult.success(path) + } else { + methodResult.error("非当前请求的响应", "非当前请求的响应", "非当前请求的响应") + } + } + "PlatformService::viewId2RefId" -> { + val viewId = args["viewId"] as String + + if (HEAP.containsKey(viewId)) { + methodResult.success(System.identityHashCode(HEAP[viewId]).toString()) + // 转换后删除viewId + HEAP.remove(viewId) + } else { + methodResult.error("viewId无对应对象", "viewId无对应对象", "viewId无对应对象") + } + } + else -> methodResult.notImplemented() + } +} \ No newline at end of file diff --git a/android/src/main/kotlin/me/yohom/foundation_fluttify/java/io/FileHandler.kt b/android/src/main/kotlin/me/yohom/foundation_fluttify/java/io/FileHandler.kt new file mode 100644 index 0000000..56dbac7 --- /dev/null +++ b/android/src/main/kotlin/me/yohom/foundation_fluttify/java/io/FileHandler.kt @@ -0,0 +1,17 @@ +package me.yohom.foundation_fluttify.java.io + +import io.flutter.plugin.common.MethodChannel +import me.yohom.foundation_fluttify.core.get +import java.io.File + +fun FileHandler(method: String, rawArgs: Any, methodResult: MethodChannel.Result) { + when (method) { + "java.io.File::create" -> { + val path = rawArgs["path"] as String + val file = File(path) + + methodResult.success(file) + } + else -> methodResult.notImplemented() + } +} \ No newline at end of file diff --git a/android/src/main/kotlin/me/yohom/foundation_fluttify/platform_view/android_opengl_GLSurfaceViewFactory.kt b/android/src/main/kotlin/me/yohom/foundation_fluttify/platform_view/android_opengl_GLSurfaceViewFactory.kt new file mode 100644 index 0000000..f014571 --- /dev/null +++ b/android/src/main/kotlin/me/yohom/foundation_fluttify/platform_view/android_opengl_GLSurfaceViewFactory.kt @@ -0,0 +1,27 @@ +package me.yohom.foundation_fluttify.platform_view + +import android.content.Context +import android.opengl.GLSurfaceView +import android.view.View +import io.flutter.plugin.common.StandardMessageCodec +import io.flutter.plugin.platform.PlatformView +import io.flutter.plugin.platform.PlatformViewFactory +import me.yohom.foundation_fluttify.HEAP + +@Suppress("ClassName") +class android_opengl_GLSurfaceViewFactory : PlatformViewFactory(StandardMessageCodec.INSTANCE) { + override fun create(context: Context?, id: Int, params: Any?): PlatformView { + val view = GLSurfaceView(context) + + // 同时存放viewId和refId的对象, 供后续viewId转refId使用 + HEAP[(Int.MAX_VALUE - id).toString()] = view + HEAP["android.opengl.GLSurfaceView:${System.identityHashCode(view)}"] = view + return object : PlatformView { + override fun getView(): View { + return view + } + + override fun dispose() {} + } + } +} diff --git a/android/src/main/kotlin/me/yohom/foundation_fluttify/platform_view/android_view_SurfaceViewFactory.kt b/android/src/main/kotlin/me/yohom/foundation_fluttify/platform_view/android_view_SurfaceViewFactory.kt new file mode 100644 index 0000000..1468892 --- /dev/null +++ b/android/src/main/kotlin/me/yohom/foundation_fluttify/platform_view/android_view_SurfaceViewFactory.kt @@ -0,0 +1,61 @@ +package me.yohom.foundation_fluttify.platform_view + +import android.content.Context +import android.view.SurfaceHolder +import android.view.SurfaceView +import android.view.View +import io.flutter.plugin.common.BinaryMessenger +import io.flutter.plugin.common.MethodChannel +import io.flutter.plugin.common.StandardMethodCodec +import io.flutter.plugin.platform.PlatformView +import io.flutter.plugin.platform.PlatformViewFactory +import me.yohom.foundation_fluttify.HEAP +import me.yohom.foundation_fluttify.core.FluttifyMessageCodec + +@Suppress("ClassName") +class android_view_SurfaceViewFactory(private val binaryMessenger: BinaryMessenger?) + : PlatformViewFactory(FluttifyMessageCodec()) { + override fun create(context: Context?, id: Int, params: Any?): PlatformView { + val view = SurfaceView(context) + + view.holder.addCallback(object : SurfaceHolder.Callback { + private val channel = MethodChannel( + binaryMessenger!!, + "android.view.SurfaceHolder::addCallback::Callback", + StandardMethodCodec(FluttifyMessageCodec()) + ) + + override fun surfaceCreated(holder: SurfaceHolder) { + channel.invokeMethod( + "Callback::android.view.SurfaceHolder.Callback::surfaceCreated", + mapOf("holder" to holder) + ) + } + + override fun surfaceChanged(holder: SurfaceHolder, format: Int, width: Int, height: Int) { + channel.invokeMethod( + "Callback::android.view.SurfaceHolder.Callback::surfaceChanged", + mapOf("holder" to holder, "format" to format, "width" to width, "height" to height) + ) + } + + override fun surfaceDestroyed(holder: SurfaceHolder) { + channel.invokeMethod( + "Callback::android.view.SurfaceHolder.Callback::surfaceDestroyed", + mapOf("holder" to holder) + ) + } + }) + + // 同时存放viewId和refId的对象, 供后续viewId转refId使用 + HEAP[(Int.MAX_VALUE - id).toString()] = view + HEAP["android.view.SurfaceView:${System.identityHashCode(view)}"] = view + return object : PlatformView { + override fun getView(): View { + return view + } + + override fun dispose() {} + } + } +} diff --git a/android/src/main/kotlin/me/yohom/foundation_fluttify/platform_view/android_widget_FrameLayoutFactory.kt b/android/src/main/kotlin/me/yohom/foundation_fluttify/platform_view/android_widget_FrameLayoutFactory.kt new file mode 100644 index 0000000..31f3115 --- /dev/null +++ b/android/src/main/kotlin/me/yohom/foundation_fluttify/platform_view/android_widget_FrameLayoutFactory.kt @@ -0,0 +1,27 @@ +package me.yohom.foundation_fluttify.platform_view + +import android.content.Context +import android.view.View +import android.widget.FrameLayout +import io.flutter.plugin.platform.PlatformView +import io.flutter.plugin.platform.PlatformViewFactory +import me.yohom.foundation_fluttify.HEAP +import me.yohom.foundation_fluttify.core.FluttifyMessageCodec + +@Suppress("ClassName") +class android_widget_FrameLayoutFactory : PlatformViewFactory(FluttifyMessageCodec()) { + override fun create(context: Context?, id: Int, params: Any?): PlatformView { + val view = FrameLayout(context!!) + + // 同时存放viewId和refId的对象, 供后续viewId转refId使用 + HEAP[(Int.MAX_VALUE - id).toString()] = view + HEAP["android.widget.FrameLayout:${System.identityHashCode(view)}"] = view + return object : PlatformView { + override fun getView(): View { + return view + } + + override fun dispose() {} + } + } +} diff --git a/example/.gitignore b/example/.gitignore new file mode 100644 index 0000000..29a3a50 --- /dev/null +++ b/example/.gitignore @@ -0,0 +1,43 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +**/ios/Flutter/.last_build_id +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.pub-cache/ +.pub/ +/build/ + +# Symbolication related +app.*.symbols + +# Obfuscation related +app.*.map.json + +# Android Studio will place build artifacts here +/android/app/debug +/android/app/profile +/android/app/release diff --git a/example/README.md b/example/README.md new file mode 100644 index 0000000..50d36c8 --- /dev/null +++ b/example/README.md @@ -0,0 +1,16 @@ +# foundation_fluttify_example + +Demonstrates how to use the foundation_fluttify plugin. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook) + +For help getting started with Flutter, view our +[online documentation](https://flutter.dev/docs), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/example/android/.gradle/7.4/checksums/checksums.lock b/example/android/.gradle/7.4/checksums/checksums.lock new file mode 100644 index 0000000000000000000000000000000000000000..a70ae1441c1cf0ba7f18fdcb3d33d77412c85787 GIT binary patch literal 17 TcmZRcb3pg!p(O<`8K3|FK@lvc9`8It+yVPax|y~Nf)1a&I)Am}Ou^<2+6ir)V~z6b6-hwt5Yhx2*8T!SFQ ziU({6CnM%$i4_DO009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV==S84|97IbG6Pp|= zFLV|`NR1#1jV+;VWZoSSppWyi`1^y2?a|)w3 zsgB?5_x(KIf82b{<=)I>x#l>x*`oe*OCFY+c%I={*AL`HhO__A;d%AF8Gp;?@!Kqa z$MYvOLH+%L)hd?%^% zq0Ut{_-$`pqK!uRg9S3e+Q{w99_b&Kr2d|1V_CGiwn+VJmNm+c3W6xlXBrz7ndaA? zx1C>FinZA3rZ~~c9 z3PS-c40(0p7J(u20m68QTlNU3V@yPf1DOb{3`E(zoO?9mhJTu6e=NU~^xl)tx!?Oc z=hNH%)1F-fv6?+cH{xY8c-e&>7ytuc01SWuFaQR?02lxRU;qq&0WbgtzyKHk17H9Q zfB`V@e=!h1E@T;6%xW7os-q($h)v7Mj!~MqsHU@S`4AfR2*$r3}lUsXT&{SUht+HRk8(krJ^+@ z+qy<*o`Jdf^YS{mlkh&`9umwgrc;Ke9Q{rs?pcGm<;7>Stg;$wny6wVRy@;1O?W(a6UC)P$N<;jl#vxU=2ftFt44v91|Cv(HXQuwkS|RQ2 zQ?+|1Jr32cKdYOyV|eFpTC?N~bEdxidMR30&=KYg7fF#%RMcOKr#e1gD#|GJzc7B% zm($zQn{+NlYaOx?9f?vpz06vwr8bE5gDf{VT3tSx9+7LC)p0v6-iWSs3f0n1W7bkF z)qJWyX~M+2;&`#iN9Kn)t|sN7`+tb^n7=%#^82eIRjKC+E=Xh533#0fGaOHg{1f NF`h~hNtG-r^*5tH^B({J literal 0 HcmV?d00001 diff --git a/example/android/.gradle/8.7/dependencies-accessors/gc.properties b/example/android/.gradle/8.7/dependencies-accessors/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/example/android/.gradle/8.7/executionHistory/executionHistory.bin b/example/android/.gradle/8.7/executionHistory/executionHistory.bin new file mode 100644 index 0000000000000000000000000000000000000000..e80b0beff5ceac05a1b2e5efd7d415ca9e5db314 GIT binary patch literal 1165593 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%0D_Ezy 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
~ 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 O+qiR-fCiR}N&0__IsE?s literal 0 HcmV?d00001 diff --git a/example/android/.gradle/8.7/executionHistory/executionHistory.lock b/example/android/.gradle/8.7/executionHistory/executionHistory.lock new file mode 100644 index 0000000000000000000000000000000000000000..9989be461b486b52e28dfe35252be976ea757d6b GIT binary patch literal 17 UcmZR+tN%Pntl>f|0|aCO05r!0g#Z8m literal 0 HcmV?d00001 diff --git a/example/android/.gradle/8.7/fileChanges/last-build.bin b/example/android/.gradle/8.7/fileChanges/last-build.bin new file mode 100644 index 0000000000000000000000000000000000000000..f76dd238ade08917e6712764a16a22005a50573d GIT binary patch literal 1 IcmZPo000310RR91 literal 0 HcmV?d00001 diff --git a/example/android/.gradle/8.7/fileHashes/fileHashes.bin b/example/android/.gradle/8.7/fileHashes/fileHashes.bin new file mode 100644 index 0000000000000000000000000000000000000000..fc035f28b46b1d8db76f569100414bc6af832dfe GIT binary patch literal 150083 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 literal 0 HcmV?d00001 diff --git a/example/android/.gradle/8.7/fileHashes/fileHashes.lock b/example/android/.gradle/8.7/fileHashes/fileHashes.lock new file mode 100644 index 0000000000000000000000000000000000000000..9896ed7a7be332735c5414fa737935d2a12bf063 GIT binary patch literal 17 VcmZS1lSZvB0l0Swqa0stZT1MmO< literal 0 HcmV?d00001 diff --git a/example/android/.gradle/8.7/fileHashes/resourceHashesCache.bin b/example/android/.gradle/8.7/fileHashes/resourceHashesCache.bin new file mode 100644 index 0000000000000000000000000000000000000000..401bdfd1825d81dc39d6883b9e0dad7c90dba447 GIT binary patch literal 21217 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 SCMu*6`a2pguD<^7Fd_+ox0SuVT0Vf{=LjV8( literal 0 HcmV?d00001 diff --git a/example/android/.gradle/buildOutputCleanup/cache.properties b/example/android/.gradle/buildOutputCleanup/cache.properties new file mode 100644 index 0000000..c3cbf35 --- /dev/null +++ b/example/android/.gradle/buildOutputCleanup/cache.properties @@ -0,0 +1,2 @@ +#Sun Nov 17 00:00:14 CST 2024 +gradle.version=8.7 diff --git a/example/android/.gradle/buildOutputCleanup/outputFiles.bin b/example/android/.gradle/buildOutputCleanup/outputFiles.bin new file mode 100644 index 0000000000000000000000000000000000000000..59c8e6293d505458d295ae5775fb821f9533a9bc GIT binary patch literal 25013 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 KqcZ=)5&jFwFNLB2 literal 0 HcmV?d00001 diff --git a/example/android/.gradle/file-system.probe b/example/android/.gradle/file-system.probe new file mode 100644 index 0000000000000000000000000000000000000000..802ed69251123725a564fb75bc2ed85369089ccb GIT binary patch literal 8 PcmZQzV4Q5a#c2)z2K@qD literal 0 HcmV?d00001 diff --git a/example/android/.gradle/noVersion/buildLogic.lock b/example/android/.gradle/noVersion/buildLogic.lock new file mode 100644 index 0000000000000000000000000000000000000000..4d320144044ea954b9c83a4dc0a75435a7c554fb GIT binary patch literal 17 ScmZQx5Ffj^+^H>*0SW*vK?9=z literal 0 HcmV?d00001 diff --git a/example/android/.gradle/vcs-1/gc.properties b/example/android/.gradle/vcs-1/gc.properties new file mode 100644 index 0000000..e69de29 diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle new file mode 100644 index 0000000..5b1c29e --- /dev/null +++ b/example/android/app/build.gradle @@ -0,0 +1,43 @@ +plugins { + id "com.android.application" + id "kotlin-android" + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id "dev.flutter.flutter-gradle-plugin" +} + +android { + namespace = "me.yohom.foundation_fluttify_example" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_1_8 + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "me.yohom.foundation_fluttify_example" + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig signingConfigs.debug + } + } +} + +flutter { + source = "../.." +} + diff --git a/example/android/app/src/debug/AndroidManifest.xml b/example/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 0000000..cf477bf --- /dev/null +++ b/example/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/example/android/app/src/main/AndroidManifest.xml b/example/android/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..abae935 --- /dev/null +++ b/example/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + diff --git a/example/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java b/example/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java new file mode 100644 index 0000000..7cdcd3c --- /dev/null +++ b/example/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java @@ -0,0 +1,24 @@ +package io.flutter.plugins; + +import androidx.annotation.Keep; +import androidx.annotation.NonNull; +import io.flutter.Log; + +import io.flutter.embedding.engine.FlutterEngine; + +/** + * Generated file. Do not edit. + * This file is generated by the Flutter tool based on the + * plugins that support the Android platform. + */ +@Keep +public final class GeneratedPluginRegistrant { + private static final String TAG = "GeneratedPluginRegistrant"; + public static void registerWith(@NonNull FlutterEngine flutterEngine) { + try { + flutterEngine.getPlugins().add(new me.yohom.foundation_fluttify.FoundationFluttifyPlugin()); + } catch (Exception e) { + Log.e(TAG, "Error registering plugin foundation_fluttify, me.yohom.foundation_fluttify.FoundationFluttifyPlugin", e); + } + } +} diff --git a/example/android/app/src/main/kotlin/me/yohom/foundation_fluttify_example/MainActivity.kt b/example/android/app/src/main/kotlin/me/yohom/foundation_fluttify_example/MainActivity.kt new file mode 100644 index 0000000..a71f092 --- /dev/null +++ b/example/android/app/src/main/kotlin/me/yohom/foundation_fluttify_example/MainActivity.kt @@ -0,0 +1,5 @@ +package me.yohom.foundation_fluttify_example + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity: FlutterActivity() diff --git a/example/android/app/src/main/res/drawable/launch_background.xml b/example/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 0000000..304732f --- /dev/null +++ b/example/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..db77bb4b7b0906d62b1847e87f15cdcacf6a4f29 GIT binary patch literal 544 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8bpbvhu0Wd6uZuB!w&u2PAxD2eNXD>P5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ literal 0 HcmV?d00001 diff --git a/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..17987b79bb8a35cc66c3c1fd44f5a5526c1b78be GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xx&nMcT!A!W`0S9QKQy;}1Cl^CgaH=;G9cpY;r$Q>i*pfB zP2drbID<_#qf;rPZx^FqH)F_D#*k@@q03KywUtLX8Ua?`H+NMzkczFPK3lFz@i_kW%1NOn0|D2I9n9wzH8m|-tHjsw|9>@K=iMBhxvkv6m8Y-l zytQ?X=U+MF$@3 zt`~i=@j|6y)RWMK--}M|=T`o&^Ni>IoWKHEbBXz7?A@mgWoL>!*SXo`SZH-*HSdS+ yn*9;$7;m`l>wYBC5bq;=U}IMqLzqbYCidGC!)_gkIk_C@Uy!y&wkt5C($~2D>~)O*cj@FGjOCM)M>_ixfudOh)?xMu#Fs z#}Y=@YDTwOM)x{K_j*Q;dPdJ?Mz0n|pLRx{4n|)f>SXlmV)XB04CrSJn#dS5nK2lM zrZ9#~WelCp7&e13Y$jvaEXHskn$2V!!DN-nWS__6T*l;H&Fopn?A6HZ-6WRLFP=R` zqG+CE#d4|IbyAI+rJJ`&x9*T`+a=p|0O(+s{UBcyZdkhj=yS1>AirP+0R;mf2uMgM zC}@~JfByORAh4SyRgi&!(cja>F(l*O+nd+@4m$|6K6KDn_&uvCpV23&>G9HJp{xgg zoq1^2_p9@|WEo z*X_Uko@K)qYYv~>43eQGMdbiGbo>E~Q& zrYBH{QP^@Sti!`2)uG{irBBq@y*$B zi#&(U-*=fp74j)RyIw49+0MRPMRU)+a2r*PJ$L5roHt2$UjExCTZSbq%V!HeS7J$N zdG@vOZB4v_lF7Plrx+hxo7(fCV&}fHq)$ literal 0 HcmV?d00001 diff --git a/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d5f1c8d34e7a88e3f88bea192c3a370d44689c3c GIT binary patch literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof literal 0 HcmV?d00001 diff --git a/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..4d6372eebdb28e45604e46eeda8dd24651419bc0 GIT binary patch literal 1443 zcmb`G{WsKk6vsdJTdFg%tJav9_E4vzrOaqkWF|A724Nly!y+?N9`YV6wZ}5(X(D_N(?!*n3`|_r0Hc?=PQw&*vnU?QTFY zB_MsH|!j$PP;I}?dppoE_gA(4uc!jV&0!l7_;&p2^pxNo>PEcNJv za5_RT$o2Mf!<+r?&EbHH6nMoTsDOa;mN(wv8RNsHpG)`^ymG-S5By8=l9iVXzN_eG%Xg2@Xeq76tTZ*dGh~Lo9vl;Zfs+W#BydUw zCkZ$o1LqWQO$FC9aKlLl*7x9^0q%0}$OMlp@Kk_jHXOjofdePND+j!A{q!8~Jn+s3 z?~~w@4?egS02}8NuulUA=L~QQfm;MzCGd)XhiftT;+zFO&JVyp2mBww?;QByS_1w! zrQlx%{^cMj0|Bo1FjwY@Q8?Hx0cIPF*@-ZRFpPc#bBw{5@tD(5%sClzIfl8WU~V#u zm5Q;_F!wa$BSpqhN>W@2De?TKWR*!ujY;Yylk_X5#~V!L*Gw~;$%4Q8~Mad z@`-kG?yb$a9cHIApZDVZ^U6Xkp<*4rU82O7%}0jjHlK{id@?-wpN*fCHXyXh(bLt* zPc}H-x0e4E&nQ>y%B-(EL=9}RyC%MyX=upHuFhAk&MLbsF0LP-q`XnH78@fT+pKPW zu72MW`|?8ht^tz$iC}ZwLp4tB;Q49K!QCF3@!iB1qOI=?w z7In!}F~ij(18UYUjnbmC!qKhPo%24?8U1x{7o(+?^Zu0Hx81|FuS?bJ0jgBhEMzf< zCgUq7r2OCB(`XkKcN-TL>u5y#dD6D!)5W?`O5)V^>jb)P)GBdy%t$uUMpf$SNV31$ zb||OojAbvMP?T@$h_ZiFLFVHDmbyMhJF|-_)HX3%m=CDI+ID$0^C>kzxprBW)hw(v zr!Gmda);ICoQyhV_oP5+C%?jcG8v+D@9f?Dk*!BxY}dazmrT@64UrP3hlslANK)bq z$67n83eh}OeW&SV@HG95P|bjfqJ7gw$e+`Hxo!4cx`jdK1bJ>YDSpGKLPZ^1cv$ek zIB?0S<#tX?SJCLWdMd{-ME?$hc7A$zBOdIJ)4!KcAwb=VMov)nK;9z>x~rfT1>dS+ zZ6#`2v@`jgbqq)P22H)Tx2CpmM^o1$B+xT6`(v%5xJ(?j#>Q$+rx_R|7TzDZe{J6q zG1*EcU%tE?!kO%^M;3aM6JN*LAKUVb^xz8-Pxo#jR5(-KBeLJvA@-gxNHx0M-ZJLl z;#JwQoh~9V?`UVo#}{6ka@II>++D@%KqGpMdlQ}?9E*wFcf5(#XQnP$Dk5~%iX^>f z%$y;?M0BLp{O3a(-4A?ewryHrrD%cx#Q^%KY1H zNre$ve+vceSLZcNY4U(RBX&)oZn*Py()h)XkE?PL$!bNb{N5FVI2Y%LKEm%yvpyTP z(1P?z~7YxD~Rf<(a@_y` literal 0 HcmV?d00001 diff --git a/example/android/app/src/main/res/values/styles.xml b/example/android/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..00fa441 --- /dev/null +++ b/example/android/app/src/main/res/values/styles.xml @@ -0,0 +1,8 @@ + + + + diff --git a/example/android/app/src/profile/AndroidManifest.xml b/example/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 0000000..cf477bf --- /dev/null +++ b/example/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/example/android/build.gradle b/example/android/build.gradle new file mode 100644 index 0000000..8e9de9d --- /dev/null +++ b/example/android/build.gradle @@ -0,0 +1,18 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +rootProject.buildDir = "../build" +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean", Delete) { + delete rootProject.buildDir +} \ No newline at end of file diff --git a/example/android/gradle.properties b/example/android/gradle.properties new file mode 100644 index 0000000..2324ab5 --- /dev/null +++ b/example/android/gradle.properties @@ -0,0 +1,5 @@ +org.gradle.jvmargs=-Xmx1536M + +android.enableR8=true +android.useAndroidX=true +android.enableJetifier=true diff --git a/example/android/gradle/wrapper/gradle-wrapper.jar b/example/android/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..13372aef5e24af05341d49695ee84e5f9b594659 GIT binary patch literal 53636 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ⅅ8zCNKueM5c!$)^mKpZNR!eIlFST57ePGQcqCqedAQ3UaUEzpjM--5V4YO zY22VxQm%$2NDnwfK+jkz=i2>NjAM6&P1DdcO<*Xs1-lzdXWn#LGSxwhPH7N%D8-zCgpFWt@`LgNYI+Fh^~nSiQmwH0^>E>*O$47MqfQza@Ce z1wBw;igLc#V2@y-*~Hp?jA1)+MYYyAt|DV_8RQCrRY@sAviO}wv;3gFdO>TE(=9o? z=S(r=0oT`w24=ihA=~iFV5z$ZG74?rmYn#eanx(!Hkxcr$*^KRFJKYYB&l6$WVsJ^ z-Iz#HYmE)Da@&seqG1fXsTER#adA&OrD2-T(z}Cwby|mQf{0v*v3hq~pzF`U`jenT z=XHXeB|fa?Ws$+9ADO0rco{#~+`VM?IXg7N>M0w1fyW1iiKTA@p$y zSiAJ%-Mg{m>&S4r#Tw@?@7ck}#oFo-iZJCWc`hw_J$=rw?omE{^tc59ftd`xq?jzf zo0bFUI=$>O!45{!c4?0KsJmZ#$vuYpZLo_O^oHTmmLMm0J_a{Nn`q5tG1m=0ecv$T z5H7r0DZGl6be@aJ+;26EGw9JENj0oJ5K0=^f-yBW2I0jqVIU};NBp*gF7_KlQnhB6 z##d$H({^HXj@il`*4^kC42&3)(A|tuhs;LygA-EWFSqpe+%#?6HG6}mE215Z4mjO2 zY2^?5$<8&k`O~#~sSc5Fy`5hg5#e{kG>SAbTxCh{y32fHkNryU_c0_6h&$zbWc63T z7|r?X7_H!9XK!HfZ+r?FvBQ$x{HTGS=1VN<>Ss-7M3z|vQG|N}Frv{h-q623@Jz*@ ziXlZIpAuY^RPlu&=nO)pFhML5=ut~&zWDSsn%>mv)!P1|^M!d5AwmSPIckoY|0u9I zTDAzG*U&5SPf+@c_tE_I!~Npfi$?gX(kn=zZd|tUZ_ez(xP+)xS!8=k(<{9@<+EUx zYQgZhjn(0qA#?~Q+EA9oh_Jx5PMfE3#KIh#*cFIFQGi)-40NHbJO&%ZvL|LAqU=Rw zf?Vr4qkUcKtLr^g-6*N-tfk+v8@#Lpl~SgKyH!+m9?T8B>WDWK22;!i5&_N=%f{__ z-LHb`v-LvKqTJZCx~z|Yg;U_f)VZu~q7trb%C6fOKs#eJosw&b$nmwGwP;Bz`=zK4 z>U3;}T_ptP)w=vJaL8EhW;J#SHA;fr13f=r#{o)`dRMOs-T;lp&Toi@u^oB_^pw=P zp#8Geo2?@!h2EYHY?L;ayT}-Df0?TeUCe8Cto{W0_a>!7Gxmi5G-nIIS;X{flm2De z{SjFG%knZoVa;mtHR_`*6)KEf=dvOT3OgT7C7&-4P#4X^B%VI&_57cBbli()(%zZC?Y0b;?5!f22UleQ=9h4_LkcA!Xsqx@q{ko&tvP_V@7epFs}AIpM{g??PA>U(sk$Gum>2Eu zD{Oy{$OF%~?B6>ixQeK9I}!$O0!T3#Ir8MW)j2V*qyJ z8Bg17L`rg^B_#rkny-=<3fr}Y42+x0@q6POk$H^*p3~Dc@5uYTQ$pfaRnIT}Wxb;- zl!@kkZkS=l)&=y|21veY8yz$t-&7ecA)TR|=51BKh(@n|d$EN>18)9kSQ|GqP?aeM ztXd9C&Md$PPF*FVs*GhoHM2L@D$(Qf%%x zwQBUt!jM~GgwluBcwkgwQ!249uPkNz3u@LSYZgmpHgX|P#8!iKk^vSKZ;?)KE$92d z2U>y}VWJ0&zjrIqddM3dz-nU%>bL&KU%SA|LiiUU7Ka|c=jF|vQ1V)Jz`JZe*j<5U6~RVuBEVJoY~ z&GE+F$f>4lN=X4-|9v*5O*Os>>r87u z!_1NSV?_X&HeFR1fOFb8_P)4lybJ6?1BWK`Tv2;4t|x1<#@17UO|hLGnrB%nu)fDk zfstJ4{X4^Y<8Lj<}g2^kksSefQTMuTo?tJLCh zC~>CR#a0hADw!_Vg*5fJwV{~S(j8)~sn>Oyt(ud2$1YfGck77}xN@3U_#T`q)f9!2 zf>Ia;Gwp2_C>WokU%(z2ec8z94pZyhaK+e>3a9sj^-&*V494;p9-xk+u1Jn#N_&xs z59OI2w=PuTErv|aNcK*>3l^W*p3}fjXJjJAXtBA#%B(-0--s;1U#f8gFYW!JL+iVG zV0SSx5w8eVgE?3Sg@eQv)=x<+-JgpVixZQNaZr}3b8sVyVs$@ndkF5FYKka@b+YAh z#nq_gzlIDKEs_i}H4f)(VQ!FSB}j>5znkVD&W0bOA{UZ7h!(FXrBbtdGA|PE1db>s z$!X)WY)u#7P8>^7Pjjj-kXNBuJX3(pJVetTZRNOnR5|RT5D>xmwxhAn)9KF3J05J; z-Mfb~dc?LUGqozC2p!1VjRqUwwDBnJhOua3vCCB-%ykW_ohSe?$R#dz%@Gym-8-RA zjMa_SJSzIl8{9dV+&63e9$4;{=1}w2=l+_j_Dtt@<(SYMbV-18&%F@Zl7F_5! z@xwJ0wiDdO%{}j9PW1(t+8P7Ud79yjY>x>aZYWJL_NI?bI6Y02`;@?qPz_PRqz(7v``20`- z033Dy|4;y6di|>cz|P-z|6c&3f&g^OAt8aN0Zd&0yZ>dq2aFCsE<~Ucf$v{sL=*++ zBxFSa2lfA+Y%U@B&3D=&CBO&u`#*nNc|PCY7XO<}MnG0VR764XrHtrb5zwC*2F!Lp zE<~Vj0;z!S-|3M4DFxuQ=`ShTf28<9p!81(0hFbGNqF%0gg*orez9!qt8e%o@Yfl@ zhvY}{@3&f??}7<`p>FyU;7?VkKbh8_=csozU=|fH&szgZ{=NDCylQ>EH^x5!K3~-V z)_2Y>0uJ`Z0Pb58y`RL+&n@m9tJ)O<%q#&u#DAIt+-rRt0eSe1MTtMl@W)H$b3D)@ z*A-1bUgZI)>HdcI4&W>P4W5{-j=s5p5`cbQ+{(g0+RDnz!TR^mxSLu_y#SDVKrj8i zA^hi6>jMGM;`$9Vfb-Yf!47b)Ow`2OKtNB=z|Kxa$5O}WPo;(Dc^`q(7X8kkeFyO8 z{XOq^07=u|7*P2`m;>PIFf=i80MKUxsN{d2cX0M+REsE*20+WQ79T9&cqT>=I_U% z{=8~^Isg(Nzo~`4iQfIb_#CVCD>#5h>=-Z#5dH}WxYzn%0)GAm6L2WdUdP=0_h>7f z(jh&7%1i(ZOn+}D8$iGK4Vs{pmHl_w4Qm-46H9>4^{3dz^DZDh+dw)6Xd@CpQNK$j z{CU;-cmpK=egplZ3y3%y=sEnCJ^eYVKXzV8H2_r*fJ*%*B;a1_lOpt6)IT1IAK2eB z{rie|uDJUrbgfUE>~C>@RO|m5ex55F{=~Bb4Cucp{ok7Yf9V}QuZ`#Gc|WaqsQlK- zKaV)iMRR__&Ak2Z=IM9R9g5$WM4u{a^C-7uX*!myEym z#_#p^T!P~#Dx$%^K>Y_nj_3J*E_LwJ60-5Xu=LkJAwcP@|0;a&+|+ZX`Jbj9P5;T% z|KOc}4*#4o{U?09`9Hz`Xo-I!P=9XfIrr*MQ}y=$!qgv?_J38^bNb4kM&_OVg^_=Eu-qG5U(fw0KMgH){C8pazq~51rN97hf#20-7=aK0)N|UM H-+%o-(+5aQ literal 0 HcmV?d00001 diff --git a/example/android/gradle/wrapper/gradle-wrapper.properties b/example/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..c2a7878 --- /dev/null +++ b/example/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Mon Nov 04 23:28:03 CST 2024 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/example/android/gradlew b/example/android/gradlew new file mode 100644 index 0000000..9d82f78 --- /dev/null +++ b/example/android/gradlew @@ -0,0 +1,160 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; +esac + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/example/android/gradlew.bat b/example/android/gradlew.bat new file mode 100644 index 0000000..8a0b282 --- /dev/null +++ b/example/android/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/example/android/local.properties b/example/android/local.properties new file mode 100644 index 0000000..de0dd04 --- /dev/null +++ b/example/android/local.properties @@ -0,0 +1,3 @@ +sdk.dir=C:\\Users\\Administrator\\AppData\\Local\\Android\\sdk +flutter.sdk=D:\\futter\\flutter +flutter.buildMode=debug \ No newline at end of file diff --git a/example/android/settings.gradle b/example/android/settings.gradle new file mode 100644 index 0000000..c4278ea --- /dev/null +++ b/example/android/settings.gradle @@ -0,0 +1,25 @@ +pluginManagement { + def flutterSdkPath = { + def properties = new Properties() + file("local.properties").withInputStream { properties.load(it) } + def flutterSdkPath = properties.getProperty("flutter.sdk") + assert flutterSdkPath != null, "flutter.sdk not set in local.properties" + return flutterSdkPath + }() + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id "dev.flutter.flutter-plugin-loader" version "1.0.0" + id "com.android.application" version '8.6.1' apply false + id "org.jetbrains.kotlin.android" version "1.8.22" apply false +} + +include ":app" diff --git a/example/ios/Flutter/AppFrameworkInfo.plist b/example/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 0000000..f2872cf --- /dev/null +++ b/example/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 9.0 + + diff --git a/example/ios/Flutter/Debug.xcconfig b/example/ios/Flutter/Debug.xcconfig new file mode 100644 index 0000000..e8efba1 --- /dev/null +++ b/example/ios/Flutter/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "Generated.xcconfig" diff --git a/example/ios/Flutter/Generated.xcconfig b/example/ios/Flutter/Generated.xcconfig new file mode 100644 index 0000000..7854552 --- /dev/null +++ b/example/ios/Flutter/Generated.xcconfig @@ -0,0 +1,14 @@ +// This is a generated file; do not edit or check into version control. +FLUTTER_ROOT=D:\futter\flutter +FLUTTER_APPLICATION_PATH=D:\FlutterProjects\foundation_fluttify\example +COCOAPODS_PARALLEL_CODE_SIGN=true +FLUTTER_TARGET=lib\main.dart +FLUTTER_BUILD_DIR=build +FLUTTER_BUILD_NAME=1.0.0 +FLUTTER_BUILD_NUMBER=1 +EXCLUDED_ARCHS[sdk=iphonesimulator*]=i386 +EXCLUDED_ARCHS[sdk=iphoneos*]=armv7 +DART_OBFUSCATION=false +TRACK_WIDGET_CREATION=true +TREE_SHAKE_ICONS=false +PACKAGE_CONFIG=.dart_tool/package_config.json diff --git a/example/ios/Flutter/Release.xcconfig b/example/ios/Flutter/Release.xcconfig new file mode 100644 index 0000000..399e934 --- /dev/null +++ b/example/ios/Flutter/Release.xcconfig @@ -0,0 +1,2 @@ +#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "Generated.xcconfig" diff --git a/example/ios/Flutter/flutter_export_environment.sh b/example/ios/Flutter/flutter_export_environment.sh new file mode 100644 index 0000000..9b490f8 --- /dev/null +++ b/example/ios/Flutter/flutter_export_environment.sh @@ -0,0 +1,13 @@ +#!/bin/sh +# This is a generated file; do not edit or check into version control. +export "FLUTTER_ROOT=D:\futter\flutter" +export "FLUTTER_APPLICATION_PATH=D:\FlutterProjects\foundation_fluttify\example" +export "COCOAPODS_PARALLEL_CODE_SIGN=true" +export "FLUTTER_TARGET=lib\main.dart" +export "FLUTTER_BUILD_DIR=build" +export "FLUTTER_BUILD_NAME=1.0.0" +export "FLUTTER_BUILD_NUMBER=1" +export "DART_OBFUSCATION=false" +export "TRACK_WIDGET_CREATION=true" +export "TREE_SHAKE_ICONS=false" +export "PACKAGE_CONFIG=.dart_tool/package_config.json" diff --git a/example/ios/Podfile b/example/ios/Podfile new file mode 100644 index 0000000..a4af0a9 --- /dev/null +++ b/example/ios/Podfile @@ -0,0 +1,38 @@ +# Uncomment this line to define a global platform for your project +platform :ios, '9.0' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_ios_podfile_setup + +target 'Runner' do + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_ios_build_settings(target) + end +end diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock new file mode 100644 index 0000000..13d573c --- /dev/null +++ b/example/ios/Podfile.lock @@ -0,0 +1,22 @@ +PODS: + - Flutter (1.0.0) + - foundation_fluttify (0.0.1): + - Flutter + +DEPENDENCIES: + - Flutter (from `Flutter`) + - foundation_fluttify (from `.symlinks/plugins/foundation_fluttify/ios`) + +EXTERNAL SOURCES: + Flutter: + :path: Flutter + foundation_fluttify: + :path: ".symlinks/plugins/foundation_fluttify/ios" + +SPEC CHECKSUMS: + Flutter: 50d75fe2f02b26cc09d224853bb45737f8b3214a + foundation_fluttify: 0c45145e3fad1fb99188e4979daed5b24cd9b278 + +PODFILE CHECKSUM: b1f7a399522c118a74b177b13c01eca692aa7e6d + +COCOAPODS: 1.11.3 diff --git a/example/ios/Runner.xcodeproj/project.pbxproj b/example/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 0000000..d2d875a --- /dev/null +++ b/example/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,548 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 83F82D8B4BC87070FC6F6086 /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 04A2AE97B31701B40C7E2282 /* libPods-Runner.a */; }; + 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; + 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; }; + 97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; }; + 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 */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 04A2AE97B31701B40C7E2282 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 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 = ""; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + 82B765490BCE9380D3436B41 /* 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 = ""; }; + 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; }; + 97C146F21CF9000F007C117D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 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 = ""; }; + E4E500B2ACB8A3E22A041874 /* 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 = ""; }; + FB55EDC5E0BAFFD80DB75218 /* 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 = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 83F82D8B4BC87070FC6F6086 /* libPods-Runner.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 8AAC1AA9A447384D56FB12A0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 04A2AE97B31701B40C7E2282 /* libPods-Runner.a */, + ); + name = Frameworks; + sourceTree = ""; + }; + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + D0DD03BDC642C8B12B3EBAC4 /* Pods */, + 8AAC1AA9A447384D56FB12A0 /* Frameworks */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */, + 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */, + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 97C146F11CF9000F007C117D /* Supporting Files */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + ); + path = Runner; + sourceTree = ""; + }; + 97C146F11CF9000F007C117D /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 97C146F21CF9000F007C117D /* main.m */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + D0DD03BDC642C8B12B3EBAC4 /* Pods */ = { + isa = PBXGroup; + children = ( + 82B765490BCE9380D3436B41 /* Pods-Runner.debug.xcconfig */, + E4E500B2ACB8A3E22A041874 /* Pods-Runner.release.xcconfig */, + FB55EDC5E0BAFFD80DB75218 /* Pods-Runner.profile.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 497EC7AEF0CDF08A93D3B46C /* [CP] Check Pods Manifest.lock */, + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Runner; + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1300; + ORGANIZATIONNAME = "The Chromium Authors"; + TargetAttributes = { + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + DevelopmentTeam = X5P24RK5QW; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + }; + 497EC7AEF0CDF08A93D3B46C /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */, + 97C146F31CF9000F007C117D /* main.m in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = X5P24RK5QW; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = me.yohom.foundationFluttifyExample; + PRODUCT_NAME = "$(TARGET_NAME)"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = X5P24RK5QW; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = me.yohom.foundationFluttifyExample; + PRODUCT_NAME = "$(TARGET_NAME)"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = X5P24RK5QW; + ENABLE_BITCODE = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Flutter", + ); + PRODUCT_BUNDLE_IDENTIFIER = me.yohom.foundationFluttifyExample; + PRODUCT_NAME = "$(TARGET_NAME)"; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 0000000..3db53b6 --- /dev/null +++ b/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/example/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..21a3cc1 --- /dev/null +++ b/example/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 0000000..f9b0d7c --- /dev/null +++ b/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/example/ios/Runner/AppDelegate.h b/example/ios/Runner/AppDelegate.h new file mode 100644 index 0000000..36e21bb --- /dev/null +++ b/example/ios/Runner/AppDelegate.h @@ -0,0 +1,6 @@ +#import +#import + +@interface AppDelegate : FlutterAppDelegate + +@end diff --git a/example/ios/Runner/AppDelegate.m b/example/ios/Runner/AppDelegate.m new file mode 100644 index 0000000..59a72e9 --- /dev/null +++ b/example/ios/Runner/AppDelegate.m @@ -0,0 +1,13 @@ +#include "AppDelegate.h" +#include "GeneratedPluginRegistrant.h" + +@implementation AppDelegate + +- (BOOL)application:(UIApplication *)application + didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + [GeneratedPluginRegistrant registerWithRegistry:self]; + // Override point for customization after application launch. + return [super application:application didFinishLaunchingWithOptions:launchOptions]; +} + +@end diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..d36b1fa --- /dev/null +++ b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-App-83.5x83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "Icon-App-1024x1024@1x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..dc9ada4725e9b0ddb1deab583e5b5102493aa332 GIT binary patch literal 10932 zcmeHN2~<R zh`|8`A_PQ1nSu(UMFx?8j8PC!!VDphaL#`F42fd#7Vlc`zIE4n%Y~eiz4y1j|NDpi z?<@|pSJ-HM`qifhf@m%MamgwK83`XpBA<+azdF#2QsT{X@z0A9Bq>~TVErigKH1~P zRX-!h-f0NJ4Mh++{D}J+K>~~rq}d%o%+4dogzXp7RxX4C>Km5XEI|PAFDmo;DFm6G zzjVoB`@qW98Yl0Kvc-9w09^PrsobmG*Eju^=3f?0o-t$U)TL1B3;sZ^!++3&bGZ!o-*6w?;oOhf z=A+Qb$scV5!RbG+&2S}BQ6YH!FKb0``VVX~T$dzzeSZ$&9=X$3)_7Z{SspSYJ!lGE z7yig_41zpQ)%5dr4ff0rh$@ky3-JLRk&DK)NEIHecf9c*?Z1bUB4%pZjQ7hD!A0r-@NF(^WKdr(LXj|=UE7?gBYGgGQV zidf2`ZT@pzXf7}!NH4q(0IMcxsUGDih(0{kRSez&z?CFA0RVXsVFw3^u=^KMtt95q z43q$b*6#uQDLoiCAF_{RFc{!H^moH_cmll#Fc^KXi{9GDl{>%+3qyfOE5;Zq|6#Hb zp^#1G+z^AXfRKaa9HK;%b3Ux~U@q?xg<2DXP%6k!3E)PA<#4$ui8eDy5|9hA5&{?v z(-;*1%(1~-NTQ`Is1_MGdQ{+i*ccd96ab$R$T3=% zw_KuNF@vI!A>>Y_2pl9L{9h1-C6H8<)J4gKI6{WzGBi<@u3P6hNsXG=bRq5c+z;Gc3VUCe;LIIFDmQAGy+=mRyF++u=drBWV8-^>0yE9N&*05XHZpPlE zxu@?8(ZNy7rm?|<+UNe0Vs6&o?l`Pt>P&WaL~M&#Eh%`rg@Mbb)J&@DA-wheQ>hRV z<(XhigZAT z>=M;URcdCaiO3d^?H<^EiEMDV+7HsTiOhoaMX%P65E<(5xMPJKxf!0u>U~uVqnPN7T!X!o@_gs3Ct1 zlZ_$5QXP4{Aj645wG_SNT&6m|O6~Tsl$q?nK*)(`{J4b=(yb^nOATtF1_aS978$x3 zx>Q@s4i3~IT*+l{@dx~Hst21fR*+5}S1@cf>&8*uLw-0^zK(+OpW?cS-YG1QBZ5q! zgTAgivzoF#`cSz&HL>Ti!!v#?36I1*l^mkrx7Y|K6L#n!-~5=d3;K<;Zqi|gpNUn_ z_^GaQDEQ*jfzh;`j&KXb66fWEk1K7vxQIMQ_#Wu_%3 z4Oeb7FJ`8I>Px;^S?)}2+4D_83gHEq>8qSQY0PVP?o)zAv3K~;R$fnwTmI-=ZLK`= zTm+0h*e+Yfr(IlH3i7gUclNH^!MU>id$Jw>O?2i0Cila#v|twub21@e{S2v}8Z13( zNDrTXZVgris|qYm<0NU(tAPouG!QF4ZNpZPkX~{tVf8xY690JqY1NVdiTtW+NqyRP zZ&;T0ikb8V{wxmFhlLTQ&?OP7 z;(z*<+?J2~z*6asSe7h`$8~Se(@t(#%?BGLVs$p``;CyvcT?7Y!{tIPva$LxCQ&4W z6v#F*);|RXvI%qnoOY&i4S*EL&h%hP3O zLsrFZhv&Hu5tF$Lx!8(hs&?!Kx5&L(fdu}UI5d*wn~A`nPUhG&Rv z2#ixiJdhSF-K2tpVL=)5UkXRuPAFrEW}7mW=uAmtVQ&pGE-&az6@#-(Te^n*lrH^m@X-ftVcwO_#7{WI)5v(?>uC9GG{lcGXYJ~Q8q zbMFl7;t+kV;|;KkBW2!P_o%Czhw&Q(nXlxK9ak&6r5t_KH8#1Mr-*0}2h8R9XNkr zto5-b7P_auqTJb(TJlmJ9xreA=6d=d)CVbYP-r4$hDn5|TIhB>SReMfh&OVLkMk-T zYf%$taLF0OqYF?V{+6Xkn>iX@TuqQ?&cN6UjC9YF&%q{Ut3zv{U2)~$>-3;Dp)*(? zg*$mu8^i=-e#acaj*T$pNowo{xiGEk$%DusaQiS!KjJH96XZ-hXv+jk%ard#fu=@Q z$AM)YWvE^{%tDfK%nD49=PI|wYu}lYVbB#a7wtN^Nml@CE@{Gv7+jo{_V?I*jkdLD zJE|jfdrmVbkfS>rN*+`#l%ZUi5_bMS<>=MBDNlpiSb_tAF|Zy`K7kcp@|d?yaTmB^ zo?(vg;B$vxS|SszusORgDg-*Uitzdi{dUV+glA~R8V(?`3GZIl^egW{a919!j#>f` znL1o_^-b`}xnU0+~KIFLQ)$Q6#ym%)(GYC`^XM*{g zv3AM5$+TtDRs%`2TyR^$(hqE7Y1b&`Jd6dS6B#hDVbJlUXcG3y*439D8MrK!2D~6gn>UD4Imctb z+IvAt0iaW73Iq$K?4}H`7wq6YkTMm`tcktXgK0lKPmh=>h+l}Y+pDtvHnG>uqBA)l zAH6BV4F}v$(o$8Gfo*PB>IuaY1*^*`OTx4|hM8jZ?B6HY;F6p4{`OcZZ(us-RVwDx zUzJrCQlp@mz1ZFiSZ*$yX3c_#h9J;yBE$2g%xjmGF4ca z&yL`nGVs!Zxsh^j6i%$a*I3ZD2SoNT`{D%mU=LKaEwbN(_J5%i-6Va?@*>=3(dQy` zOv%$_9lcy9+(t>qohkuU4r_P=R^6ME+wFu&LA9tw9RA?azGhjrVJKy&8=*qZT5Dr8g--d+S8zAyJ$1HlW3Olryt`yE zFIph~Z6oF&o64rw{>lgZISC6p^CBer9C5G6yq%?8tC+)7*d+ib^?fU!JRFxynRLEZ zj;?PwtS}Ao#9whV@KEmwQgM0TVP{hs>dg(1*DiMUOKHdQGIqa0`yZnHk9mtbPfoLx zo;^V6pKUJ!5#n`w2D&381#5#_t}AlTGEgDz$^;u;-vxDN?^#5!zN9ngytY@oTv!nc zp1Xn8uR$1Z;7vY`-<*?DfPHB;x|GUi_fI9@I9SVRv1)qETbNU_8{5U|(>Du84qP#7 z*l9Y$SgA&wGbj>R1YeT9vYjZuC@|{rajTL0f%N@>3$DFU=`lSPl=Iv;EjuGjBa$Gw zHD-;%YOE@<-!7-Mn`0WuO3oWuL6tB2cpPw~Nvuj|KM@))ixuDK`9;jGMe2d)7gHin zS<>k@!x;!TJEc#HdL#RF(`|4W+H88d4V%zlh(7#{q2d0OQX9*FW^`^_<3r$kabWAB z$9BONo5}*(%kx zOXi-yM_cmB3>inPpI~)duvZykJ@^^aWzQ=eQ&STUa}2uT@lV&WoRzkUoE`rR0)`=l zFT%f|LA9fCw>`enm$p7W^E@U7RNBtsh{_-7vVz3DtB*y#*~(L9+x9*wn8VjWw|Q~q zKFsj1Yl>;}%MG3=PY`$g$_mnyhuV&~O~u~)968$0b2!Jkd;2MtAP#ZDYw9hmK_+M$ zb3pxyYC&|CuAbtiG8HZjj?MZJBFbt`ryf+c1dXFuC z0*ZQhBzNBd*}s6K_G}(|Z_9NDV162#y%WSNe|FTDDhx)K!c(mMJh@h87@8(^YdK$&d*^WQe8Z53 z(|@MRJ$Lk-&ii74MPIs80WsOFZ(NX23oR-?As+*aq6b?~62@fSVmM-_*cb1RzZ)`5$agEiL`-E9s7{GM2?(KNPgK1(+c*|-FKoy}X(D_b#etO|YR z(BGZ)0Ntfv-7R4GHoXp?l5g#*={S1{u-QzxCGng*oWr~@X-5f~RA14b8~B+pLKvr4 zfgL|7I>jlak9>D4=(i(cqYf7#318!OSR=^`xxvI!bBlS??`xxWeg?+|>MxaIdH1U~#1tHu zB{QMR?EGRmQ_l4p6YXJ{o(hh-7Tdm>TAX380TZZZyVkqHNzjUn*_|cb?T? zt;d2s-?B#Mc>T-gvBmQZx(y_cfkXZO~{N zT6rP7SD6g~n9QJ)8F*8uHxTLCAZ{l1Y&?6v)BOJZ)=R-pY=Y=&1}jE7fQ>USS}xP#exo57uND0i*rEk@$;nLvRB@u~s^dwRf?G?_enN@$t* zbL%JO=rV(3Ju8#GqUpeE3l_Wu1lN9Y{D4uaUe`g>zlj$1ER$6S6@{m1!~V|bYkhZA z%CvrDRTkHuajMU8;&RZ&itnC~iYLW4DVkP<$}>#&(`UO>!n)Po;Mt(SY8Yb`AS9lt znbX^i?Oe9r_o=?})IHKHoQGKXsps_SE{hwrg?6dMI|^+$CeC&z@*LuF+P`7LfZ*yr+KN8B4{Nzv<`A(wyR@!|gw{zB6Ha ziwPAYh)oJ(nlqSknu(8g9N&1hu0$vFK$W#mp%>X~AU1ay+EKWcFdif{% z#4!4aoVVJ;ULmkQf!ke2}3hqxLK>eq|-d7Ly7-J9zMpT`?dxo6HdfJA|t)?qPEVBDv z{y_b?4^|YA4%WW0VZd8C(ZgQzRI5(I^)=Ub`Y#MHc@nv0w-DaJAqsbEHDWG8Ia6ju zo-iyr*sq((gEwCC&^TYBWt4_@|81?=B-?#P6NMff(*^re zYqvDuO`K@`mjm_Jd;mW_tP`3$cS?R$jR1ZN09$YO%_iBqh5ftzSpMQQtxKFU=FYmP zeY^jph+g<4>YO;U^O>-NFLn~-RqlHvnZl2yd2A{Yc1G@Ga$d+Q&(f^tnPf+Z7serIU};17+2DU_f4Z z@GaPFut27d?!YiD+QP@)T=77cR9~MK@bd~pY%X(h%L={{OIb8IQmf-!xmZkm8A0Ga zQSWONI17_ru5wpHg3jI@i9D+_Y|pCqVuHJNdHUauTD=R$JcD2K_liQisqG$(sm=k9;L* z!L?*4B~ql7uioSX$zWJ?;q-SWXRFhz2Jt4%fOHA=Bwf|RzhwqdXGr78y$J)LR7&3T zE1WWz*>GPWKZ0%|@%6=fyx)5rzUpI;bCj>3RKzNG_1w$fIFCZ&UR0(7S?g}`&Pg$M zf`SLsz8wK82Vyj7;RyKmY{a8G{2BHG%w!^T|Njr!h9TO2LaP^_f22Q1=l$QiU84ao zHe_#{S6;qrC6w~7{y(hs-?-j?lbOfgH^E=XcSgnwW*eEz{_Z<_Px$?ny*JR5%f>l)FnDQ543{x%ZCiu33$Wg!pQFfT_}?5Q|_VSlIbLC`dpoMXL}9 zHfd9&47Mo(7D231gb+kjFxZHS4-m~7WurTH&doVX2KI5sU4v(sJ1@T9eCIKPjsqSr z)C01LsCxk=72-vXmX}CQD#BD;Cthymh&~=f$Q8nn0J<}ZrusBy4PvRNE}+1ceuj8u z0mW5k8fmgeLnTbWHGwfKA3@PdZxhn|PypR&^p?weGftrtCbjF#+zk_5BJh7;0`#Wr zgDpM_;Ax{jO##IrT`Oz;MvfwGfV$zD#c2xckpcXC6oou4ML~ezCc2EtnsQTB4tWNg z?4bkf;hG7IMfhgNI(FV5Gs4|*GyMTIY0$B=_*mso9Ityq$m^S>15>-?0(zQ<8Qy<_TjHE33(?_M8oaM zyc;NxzRVK@DL6RJnX%U^xW0Gpg(lXp(!uK1v0YgHjs^ZXSQ|m#lV7ip7{`C_J2TxPmfw%h$|%acrYHt)Re^PB%O&&=~a zhS(%I#+V>J-vjIib^<+s%ludY7y^C(P8nmqn9fp!i+?vr`bziDE=bx`%2W#Xyrj|i z!XQ4v1%L`m{7KT7q+LZNB^h8Ha2e=`Wp65^0;J00)_^G=au=8Yo;1b`CV&@#=jIBo zjN^JNVfYSs)+kDdGe7`1&8!?MQYKS?DuHZf3iogk_%#9E|5S zWeHrmAo>P;ejX7mwq#*}W25m^ZI+{(Z8fI?4jM_fffY0nok=+88^|*_DwcW>mR#e+ zX$F_KMdb6sRz!~7KkyN0G(3XQ+;z3X%PZ4gh;n-%62U<*VUKNv(D&Q->Na@Xb&u5Q3`3DGf+a8O5x7c#7+R+EAYl@R5us)CIw z7sT@_y~Ao@uL#&^LIh&QceqiT^+lb0YbFZt_SHOtWA%mgPEKVNvVgCsXy{5+zl*X8 zCJe)Q@y>wH^>l4;h1l^Y*9%-23TSmE>q5nI@?mt%n;Sj4Qq`Z+ib)a*a^cJc%E9^J zB;4s+K@rARbcBLT5P=@r;IVnBMKvT*)ew*R;&8vu%?Z&S>s?8?)3*YawM0P4!q$Kv zMmKh3lgE~&w&v%wVzH3Oe=jeNT=n@Y6J6TdHWTjXfX~-=1A1Bw`EW8rn}MqeI34nh zexFeA?&C3B2(E?0{drE@DA2pu(A#ElY&6el60Rn|Qpn-FkfQ8M93AfWIr)drgDFEU zghdWK)^71EWCP(@(=c4kfH1Y(4iugD4fve6;nSUpLT%!)MUHs1!zJYy4y||C+SwQ! z)KM&$7_tyM`sljP2fz6&Z;jxRn{Wup8IOUx8D4uh&(=O zx-7$a;U><*5L^!%xRlw)vAbh;sdlR||& ze}8_8%)c2Fwy=F&H|LM+p{pZB5DKTx>Y?F1N%BlZkXf!}JeGuMZk~LPi7{cidvUGB zAJ4LVeNV%XO>LTrklB#^-;8nb;}6l;1oW&WS=Mz*Az!4cqqQzbOSFq`$Q%PfD7srM zpKgP-D_0XPTRX*hAqeq0TDkJ;5HB1%$3Np)99#16c{ zJImlNL(npL!W|Gr_kxl1GVmF5&^$^YherS7+~q$p zt}{a=*RiD2Ikv6o=IM1kgc7zqpaZ;OB)P!1zz*i3{U()Dq#jG)egvK}@uFLa`oyWZ zf~=MV)|yJn`M^$N%ul5);JuQvaU1r2wt(}J_Qgyy`qWQI`hEeRX0uC@c1(dQ2}=U$ tNIIaX+dr)NRWXcxoR{>fqI{SF_dm1Ylv~=3YHI)h002ovPDHLkV1g(pWS;;4 literal 0 HcmV?d00001 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f091b6b0bca859a3f474b03065bef75ba58a9e4c GIT binary patch literal 1588 zcmV-42Fv-0P)C1SqPt}wig>|5Crh^=oyX$BK<}M8eLU3e2hGT;=G|!_SP)7zNI6fqUMB=)y zRAZ>eDe#*r`yDAVgB_R*LB*MAc)8(b{g{9McCXW!lq7r(btRoB9!8B-#AI6JMb~YFBEvdsV)`mEQO^&#eRKx@b&x- z5lZm*!WfD8oCLzfHGz#u7sT0^VLMI1MqGxF^v+`4YYnVYgk*=kU?HsSz{v({E3lb9 z>+xILjBN)t6`=g~IBOelGQ(O990@BfXf(DRI5I$qN$0Gkz-FSc$3a+2fX$AedL4u{ z4V+5Ong(9LiGcIKW?_352sR;LtDPmPJXI{YtT=O8=76o9;*n%_m|xo!i>7$IrZ-{l z-x3`7M}qzHsPV@$v#>H-TpjDh2UE$9g6sysUREDy_R(a)>=eHw-WAyfIN z*qb!_hW>G)Tu8nSw9yn#3wFMiLcfc4pY0ek1}8(NqkBR@t4{~oC>ryc-h_ByH(Cg5 z>ao-}771+xE3um9lWAY1FeQFxowa1(!J(;Jg*wrg!=6FdRX+t_<%z&d&?|Bn){>zm zZQj(aA_HeBY&OC^jj*)N`8fa^ePOU72VpInJoI1?`ty#lvlNzs(&MZX+R%2xS~5Kh zX*|AU4QE#~SgPzOXe9>tRj>hjU@c1k5Y_mW*Jp3fI;)1&g3j|zDgC+}2Q_v%YfDax z!?umcN^n}KYQ|a$Lr+51Nf9dkkYFSjZZjkma$0KOj+;aQ&721~t7QUKx61J3(P4P1 zstI~7-wOACnWP4=8oGOwz%vNDqD8w&Q`qcNGGrbbf&0s9L0De{4{mRS?o0MU+nR_! zrvshUau0G^DeMhM_v{5BuLjb#Hh@r23lDAk8oF(C+P0rsBpv85EP>4CVMx#04MOfG z;P%vktHcXwTj~+IE(~px)3*MY77e}p#|c>TD?sMatC0Tu4iKKJ0(X8jxQY*gYtxsC z(zYC$g|@+I+kY;dg_dE>scBf&bP1Nc@Hz<3R)V`=AGkc;8CXqdi=B4l2k|g;2%#m& z*jfX^%b!A8#bI!j9-0Fi0bOXl(-c^AB9|nQaE`*)Hw+o&jS9@7&Gov#HbD~#d{twV zXd^Tr^mWLfFh$@Dr$e;PBEz4(-2q1FF0}c;~B5sA}+Q>TOoP+t>wf)V9Iy=5ruQa;z)y zI9C9*oUga6=hxw6QasLPnee@3^Rr*M{CdaL5=R41nLs(AHk_=Y+A9$2&H(B7!_pURs&8aNw7?`&Z&xY_Ye z)~D5Bog^td-^QbUtkTirdyK^mTHAOuptDflut!#^lnKqU md>ggs(5nOWAqO?umG&QVYK#ibz}*4>0000U6E9hRK9^#O7(mu>ETqrXGsduA8$)?`v2seloOCza43C{NQ$$gAOH**MCn0Q?+L7dl7qnbRdqZ8LSVp1ItDxhxD?t@5_yHg6A8yI zC*%Wgg22K|8E#!~cTNYR~@Y9KepMPrrB8cABapAFa=`H+UGhkXUZV1GnwR1*lPyZ;*K(i~2gp|@bzp8}og7e*#% zEnr|^CWdVV!-4*Y_7rFvlww2Ze+>j*!Z!pQ?2l->4q#nqRu9`ELo6RMS5=br47g_X zRw}P9a7RRYQ%2Vsd0Me{_(EggTnuN6j=-?uFS6j^u69elMypu?t>op*wBx<=Wx8?( ztpe^(fwM6jJX7M-l*k3kEpWOl_Vk3@(_w4oc}4YF4|Rt=2V^XU?#Yz`8(e?aZ@#li0n*=g^qOcVpd-Wbok=@b#Yw zqn8u9a)z>l(1kEaPYZ6hwubN6i<8QHgsu0oE) ziJ(p;Wxm>sf!K+cw>R-(^Y2_bahB+&KI9y^);#0qt}t-$C|Bo71lHi{_+lg#f%RFy z0um=e3$K3i6K{U_4K!EX?F&rExl^W|G8Z8;`5z-k}OGNZ0#WVb$WCpQu-_YsiqKP?BB# vzVHS-CTUF4Ozn5G+mq_~Qqto~ahA+K`|lyv3(-e}00000NkvXXu0mjfd`9t{ literal 0 HcmV?d00001 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d0ef06e7edb86cdfe0d15b4b0d98334a86163658 GIT binary patch literal 1716 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 literal 0 HcmV?d00001 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f9ed8f5cee1c98386d13b17e89f719e83555b2 GIT binary patch literal 1895 zcmV-t2blPYP)FQtfgmafE#=YDCq`qUBt#QpG%*H6QHY765~R=q zZ6iudfM}q!Pz#~9JgOi8QJ|DSu?1-*(kSi1K4#~5?#|rh?sS)(-JQqX*}ciXJ56_H zdw=^s_srbAdqxlvGyrgGet#6T7_|j;95sL%MtM;q86vOxKM$f#puR)Bjv9Zvz9-di zXOTSsZkM83)E9PYBXC<$6(|>lNLVBb&&6y{NByFCp%6+^ALR@NCTse_wqvNmSWI-m z!$%KlHFH2omF!>#%1l3LTZg(s7eof$7*xB)ZQ0h?ejh?Ta9fDv59+u#MokW+1t8Zb zgHv%K(u9G^Lv`lh#f3<6!JVTL3(dCpxHbnbA;kKqQyd1~^Xe0VIaYBSWm6nsr;dFj z4;G-RyL?cYgsN1{L4ZFFNa;8)Rv0fM0C(~Tkit94 zz#~A)59?QjD&pAPSEQ)p8gP|DS{ng)j=2ux)_EzzJ773GmQ_Cic%3JJhC0t2cx>|v zJcVusIB!%F90{+}8hG3QU4KNeKmK%T>mN57NnCZ^56=0?&3@!j>a>B43pi{!u z7JyDj7`6d)qVp^R=%j>UIY6f+3`+qzIc!Y_=+uN^3BYV|o+$vGo-j-Wm<10%A=(Yk^beI{t%ld@yhKjq0iNjqN4XMGgQtbKubPM$JWBz}YA65k%dm*awtC^+f;a-x4+ddbH^7iDWGg&N0n#MW{kA|=8iMUiFYvMoDY@sPC#t$55gn6ykUTPAr`a@!(;np824>2xJthS z*ZdmT`g5-`BuJs`0LVhz+D9NNa3<=6m;cQLaF?tCv8)zcRSh66*Z|vXhG@$I%U~2l z?`Q zykI#*+rQ=z6Jm=Bui-SfpDYLA=|vzGE(dYm=OC8XM&MDo7ux4UF1~0J1+i%aCUpRe zt3L_uNyQ*cE(38Uy03H%I*)*Bh=Lb^Xj3?I^Hnbeq72(EOK^Y93CNp*uAA{5Lc=ky zx=~RKa4{iTm{_>_vSCm?$Ej=i6@=m%@VvAITnigVg{&@!7CDgs908761meDK5azA} z4?=NOH|PdvabgJ&fW2{Mo$Q0CcD8Qc84%{JPYt5EiG{MdLIAeX%T=D7NIP4%Hw}p9 zg)==!2Lbp#j{u_}hMiao9=!VSyx0gHbeCS`;q&vzeq|fs`y&^X-lso(Ls@-706qmA z7u*T5PMo_w3{se1t2`zWeO^hOvTsohG_;>J0wVqVe+n)AbQCx)yh9;w+J6?NF5Lmo zecS@ieAKL8%bVd@+-KT{yI|S}O>pYckUFs;ry9Ow$CD@ztz5K-*D$^{i(_1llhSh^ zEkL$}tsQt5>QA^;QgjgIfBDmcOgi5YDyu?t6vSnbp=1+@6D& z5MJ}B8q;bRlVoxasyhcUF1+)o`&3r0colr}QJ3hcSdLu;9;td>kf@Tcn<@9sIx&=m z;AD;SCh95=&p;$r{Xz3iWCO^MX83AGJ(yH&eTXgv|0=34#-&WAmw{)U7OU9!Wz^!7 zZ%jZFi@JR;>Mhi7S>V7wQ176|FdW2m?&`qa(ScO^CFPR80HucLHOTy%5s*HR0^8)i h0WYBP*#0Ks^FNSabJA*5${_#%002ovPDHLkV1oKhTl@e3 literal 0 HcmV?d00001 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..75b2d164a5a98e212cca15ea7bf2ab5de5108680 GIT binary patch literal 3831 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 literal 0 HcmV?d00001 diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..c4df70d39da7941ef3f6dcb7f06a192d8dcb308d GIT binary patch literal 1888 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 iW8Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 0000000..89c2725 --- /dev/null +++ b/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# Launch Screen Assets + +You can customize the launch screen with your own desired assets by replacing the image files in this directory. + +You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/example/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..f2e259c --- /dev/null +++ b/example/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/example/ios/Runner/Base.lproj/Main.storyboard b/example/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 0000000..f3c2851 --- /dev/null +++ b/example/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/example/ios/Runner/GeneratedPluginRegistrant.h b/example/ios/Runner/GeneratedPluginRegistrant.h new file mode 100644 index 0000000..7a89092 --- /dev/null +++ b/example/ios/Runner/GeneratedPluginRegistrant.h @@ -0,0 +1,19 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GeneratedPluginRegistrant_h +#define GeneratedPluginRegistrant_h + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface GeneratedPluginRegistrant : NSObject ++ (void)registerWithRegistry:(NSObject*)registry; +@end + +NS_ASSUME_NONNULL_END +#endif /* GeneratedPluginRegistrant_h */ diff --git a/example/ios/Runner/GeneratedPluginRegistrant.m b/example/ios/Runner/GeneratedPluginRegistrant.m new file mode 100644 index 0000000..a8aac52 --- /dev/null +++ b/example/ios/Runner/GeneratedPluginRegistrant.m @@ -0,0 +1,21 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#import "GeneratedPluginRegistrant.h" + +#if __has_include() +#import +#else +@import foundation_fluttify; +#endif + +@implementation GeneratedPluginRegistrant + ++ (void)registerWithRegistry:(NSObject*)registry { + [FoundationFluttifyPlugin registerWithRegistrar:[registry registrarForPlugin:@"FoundationFluttifyPlugin"]]; +} + +@end diff --git a/example/ios/Runner/Info.plist b/example/ios/Runner/Info.plist new file mode 100644 index 0000000..318e43f --- /dev/null +++ b/example/ios/Runner/Info.plist @@ -0,0 +1,47 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + foundation_fluttify_example + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + CADisableMinimumFrameDurationOnPhone + + + diff --git a/example/ios/Runner/main.m b/example/ios/Runner/main.m new file mode 100644 index 0000000..dff6597 --- /dev/null +++ b/example/ios/Runner/main.m @@ -0,0 +1,9 @@ +#import +#import +#import "AppDelegate.h" + +int main(int argc, char* argv[]) { + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} diff --git a/example/lib/main.dart b/example/lib/main.dart new file mode 100644 index 0000000..70a6e09 --- /dev/null +++ b/example/lib/main.dart @@ -0,0 +1,30 @@ +import 'package:flutter/material.dart'; +import 'package:foundation_fluttify/foundation_fluttify.dart'; + +void main() => runApp(MyApp()); + +class MyApp extends StatefulWidget { + @override + _MyAppState createState() => _MyAppState(); +} + +class _MyAppState extends State { + @override + Widget build(BuildContext context) { + return MaterialApp( + home: Scaffold( + appBar: AppBar(title: const Text('Plugin example app')), + ), + ); + } + + Future _testAddProperty() async { + final target = await CGPoint.create(225, 556); + final target1 = await CGPoint.create(112, 556); + await target.addProperty__(1, target1); + + final result = await target.getProperty__(1); + final target1Result = CGPoint()..refId = result.refId; + debugPrint('结果: ${await target1Result.x}'); + } +} diff --git a/example/pubspec.lock b/example/pubspec.lock new file mode 100644 index 0000000..6a64c63 --- /dev/null +++ b/example/pubspec.lock @@ -0,0 +1,204 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + async: + dependency: transitive + description: + name: async + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + url: "https://pub.dev" + source: hosted + version: "2.11.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + characters: + dependency: transitive + description: + name: characters + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + url: "https://pub.dev" + source: hosted + version: "1.3.0" + clock: + dependency: transitive + description: + name: clock + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev" + source: hosted + version: "1.1.1" + collection: + dependency: transitive + description: + name: collection + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a + url: "https://pub.dev" + source: hosted + version: "1.18.0" + cupertino_icons: + dependency: "direct main" + description: + name: cupertino_icons + sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 + url: "https://pub.dev" + source: hosted + version: "1.0.8" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.dev" + source: hosted + version: "1.3.1" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + foundation_fluttify: + dependency: "direct dev" + description: + path: ".." + relative: true + source: path + version: "0.13.0+1" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" + url: "https://pub.dev" + source: hosted + version: "10.0.5" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" + url: "https://pub.dev" + source: hosted + version: "3.0.5" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + url: "https://pub.dev" + source: hosted + version: "3.0.1" + matcher: + dependency: transitive + description: + name: matcher + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb + url: "https://pub.dev" + source: hosted + version: "0.12.16+1" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + url: "https://pub.dev" + source: hosted + version: "0.11.1" + meta: + dependency: transitive + description: + name: meta + sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 + url: "https://pub.dev" + source: hosted + version: "1.15.0" + path: + dependency: transitive + description: + name: path + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" + url: "https://pub.dev" + source: hosted + version: "1.9.0" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.99" + source_span: + dependency: transitive + description: + name: source_span + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + url: "https://pub.dev" + source: hosted + version: "1.10.0" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" + url: "https://pub.dev" + source: hosted + version: "1.11.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + url: "https://pub.dev" + source: hosted + version: "2.1.2" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" + source: hosted + version: "1.2.1" + test_api: + dependency: transitive + description: + name: test_api + sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" + url: "https://pub.dev" + source: hosted + version: "0.7.2" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" + url: "https://pub.dev" + source: hosted + version: "14.2.5" +sdks: + dart: ">=3.5.3 <4.0.0" + flutter: ">=3.18.0-18.0.pre.54" diff --git a/example/pubspec.yaml b/example/pubspec.yaml new file mode 100644 index 0000000..c93b222 --- /dev/null +++ b/example/pubspec.yaml @@ -0,0 +1,21 @@ +name: foundation_fluttify_example +description: Demonstrates how to use the foundation_fluttify plugin. +publish_to: 'none' + +environment: + sdk: ^3.5.3 + +dependencies: + flutter: + sdk: flutter + cupertino_icons: ^1.0.8 + +dev_dependencies: + flutter_test: + sdk: flutter + + foundation_fluttify: + path: ../ + +flutter: + uses-material-design: true \ No newline at end of file diff --git a/example/test/widget_test.dart b/example/test/widget_test.dart new file mode 100644 index 0000000..a4a99ae --- /dev/null +++ b/example/test/widget_test.dart @@ -0,0 +1,27 @@ +// This is a basic Flutter widget test. +// +// To perform an interaction with a widget in your test, use the WidgetTester +// utility that Flutter provides. For example, you can send tap and scroll +// gestures. You can also use WidgetTester to find child widgets in the widget +// tree, read text, and verify that the values of widget properties are correct. + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; + +import 'package:foundation_fluttify_example/main.dart'; + +void main() { + testWidgets('Verify Platform version', (WidgetTester tester) async { + // Build our app and trigger a frame. + await tester.pumpWidget(MyApp()); + + // Verify that platform version is retrieved. + expect( + find.byWidgetPredicate( + (Widget widget) => widget is Text && + widget.data!.startsWith('Running on:'), + ), + findsOneWidget, + ); + }); +} diff --git a/foundation_fluttify-0.13.0+1.tar.gz b/foundation_fluttify-0.13.0+1.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..2567f92d2c21062978cdbee6c6cd1d2a39c731e7 GIT binary patch literal 90503 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

af)^E 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 literal 0 HcmV?d00001 diff --git a/ios/Classes/CGPointHandler.h b/ios/Classes/CGPointHandler.h new file mode 100644 index 0000000..523582b --- /dev/null +++ b/ios/Classes/CGPointHandler.h @@ -0,0 +1,12 @@ +// +// Created by Yohom Bao on 2019/11/29. +// + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +void CGPointHandler(NSString* method, id args, FlutterResult methodResult); + +NS_ASSUME_NONNULL_END diff --git a/ios/Classes/CGPointHandler.m b/ios/Classes/CGPointHandler.m new file mode 100644 index 0000000..db494db --- /dev/null +++ b/ios/Classes/CGPointHandler.m @@ -0,0 +1,98 @@ +// +// Created by Yohom Bao on 2019/11/29. +// + +#import +#import "CGPointHandler.h" + +extern BOOL enableLog; + +void CGPointHandler(NSString* method, id rawArgs, FlutterResult methodResult) { + if ([@"CGPoint::getX" isEqualToString:method]) { + NSDictionary* args = (NSDictionary*) rawArgs; + + NSValue *value = (NSValue *) args[@"__this__"]; + if (value != nil && (NSNull*) value != [NSNull null]) { + CGPoint cgPoint = value.CGPointValue; + methodResult(@(cgPoint.x)); + } else { + methodResult([FlutterError errorWithCode:@"目标对象为nul" + message:@"目标对象为nul" + details:@"目标对象为nul"]); + } + } else if ([@"CGPoint::getY" isEqualToString:method]) { + NSDictionary* args = (NSDictionary*) rawArgs; + + NSValue *value = (NSValue *) args[@"__this__"]; + if (value != nil && (NSNull*) value != [NSNull null]) { + CGPoint cgPoint = value.CGPointValue; + methodResult(@(cgPoint.y)); + } else { + methodResult([FlutterError errorWithCode:@"目标对象为nul" + message:@"目标对象为nul" + details:@"目标对象为nul"]); + } + } else if ([@"CGPoint::getX_batch" isEqualToString:method]) { + NSDictionary* args = (NSDictionary*) rawArgs; + + NSArray* value = (NSArray*) args[@"__this__"]; + if (value != nil && (NSNull*) value != [NSNull null]) { + NSMutableArray* result = [NSMutableArray arrayWithCapacity:value.count]; + + for (NSValue* pointValue in value) { + [result addObject:@(pointValue.CGPointValue.x)]; + } + + methodResult(result); + } else { + methodResult([FlutterError errorWithCode:@"目标对象为nul" + message:@"目标对象为nul" + details:@"目标对象为nul"]); + } + } else if ([@"CGPoint::getY_batch" isEqualToString:method]) { + NSDictionary* args = (NSDictionary*) rawArgs; + + NSArray* value = (NSArray*) args[@"__this__"]; + if (value != nil && (NSNull*) value != [NSNull null]) { + NSMutableArray* result = [NSMutableArray arrayWithCapacity:value.count]; + + for (NSValue* pointValue in value) { + [result addObject:@(pointValue.CGPointValue.y)]; + } + + methodResult(result); + } else { + methodResult([FlutterError errorWithCode:@"目标对象为nul" + message:@"目标对象为nul" + details:@"目标对象为nul"]); + } + } else if ([@"CGPoint::create" isEqualToString:method]) { + NSDictionary* args = (NSDictionary*) rawArgs; + + NSNumber *x = (NSNumber *) args[@"x"]; + NSNumber *y = (NSNumber *) args[@"y"]; + + CGPoint cgPoint = CGPointMake([x floatValue], [y floatValue]); + NSValue *valuePoint = [NSValue valueWithCGPoint:cgPoint]; + + methodResult(valuePoint); + } else if ([@"CGPoint::create_batch" isEqualToString:method]) { + NSDictionary* args = (NSDictionary*) rawArgs; + + NSArray* x = (NSArray*) args[@"x"]; + NSArray* y = (NSArray*) args[@"y"]; + + NSMutableArray* result = [NSMutableArray arrayWithCapacity:x.count]; + + for (NSUInteger i = 0; i < x.count; i++) { + CGPoint cgPoint = CGPointMake([x[i] floatValue], [y[i] floatValue]); + NSValue *valuePoint = [NSValue valueWithCGPoint:cgPoint]; + + [result addObject:valuePoint]; + } + + methodResult(result); + } else { + methodResult(FlutterMethodNotImplemented); + } +} diff --git a/ios/Classes/CGRectHandler.h b/ios/Classes/CGRectHandler.h new file mode 100644 index 0000000..3fed4eb --- /dev/null +++ b/ios/Classes/CGRectHandler.h @@ -0,0 +1,15 @@ +// +// CGRectHandler.h +// foundation_fluttify +// +// Created by Yohom Bao on 2020/4/20. +// + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +void CGRectHandler(NSString* method, id args, FlutterResult methodResult); + +NS_ASSUME_NONNULL_END diff --git a/ios/Classes/CGRectHandler.m b/ios/Classes/CGRectHandler.m new file mode 100644 index 0000000..b2b7b0c --- /dev/null +++ b/ios/Classes/CGRectHandler.m @@ -0,0 +1,78 @@ +// +// CGRectHandler.m +// foundation_fluttify +// +// Created by Yohom Bao on 2020/4/20. +// + +#import "CGRectHandler.h" + +extern BOOL enableLog; + +void CGRectHandler(NSString* method, id rawArgs, FlutterResult methodResult) { + if ([@"CGRect::create" isEqualToString:method]) { + NSDictionary* args = (NSDictionary*) rawArgs; + + CGFloat x = [(NSNumber*) args[@"x"] floatValue]; + CGFloat y = [(NSNumber*) args[@"y"] floatValue]; + CGFloat width = [(NSNumber*) args[@"width"] floatValue]; + CGFloat height = [(NSNumber*) args[@"height"] floatValue]; + + CGRect rect = CGRectMake(x, y, width, height); + + NSValue* result = [NSValue valueWithCGRect:rect]; + + methodResult(result); + } else if ([@"CGRect::getX" isEqualToString:method]) { + NSDictionary* args = (NSDictionary*) rawArgs; + + NSValue *value = (NSValue *) args[@"__this__"]; + if (value != nil && (NSNull*) value != [NSNull null]) { + CGRect cgRect = value.CGRectValue; + methodResult(@(cgRect.origin.x)); + } else { + methodResult([FlutterError errorWithCode:@"目标对象为nul" + message:@"目标对象为nul" + details:@"目标对象为nul"]); + } + } else if ([@"CGRect::getY" isEqualToString:method]) { + NSDictionary* args = (NSDictionary*) rawArgs; + + NSValue *value = (NSValue *) args[@"__this__"]; + if (value != nil && (NSNull*) value != [NSNull null]) { + CGRect cgRect = value.CGRectValue; + methodResult(@(cgRect.origin.y)); + } else { + methodResult([FlutterError errorWithCode:@"目标对象为nul" + message:@"目标对象为nul" + details:@"目标对象为nul"]); + } + } else if ([@"CGRect::getWidth" isEqualToString:method]) { + NSDictionary* args = (NSDictionary*) rawArgs; + + NSValue *value = (NSValue *) args[@"__this__"]; + if (value != nil && (NSNull*) value != [NSNull null]) { + CGRect cgRect = value.CGRectValue; + methodResult(@(cgRect.size.width)); + } else { + methodResult([FlutterError errorWithCode:@"目标对象为nul" + message:@"目标对象为nul" + details:@"目标对象为nul"]); + } + } else if ([@"CGRect::getHeight" isEqualToString:method]) { + NSDictionary* args = (NSDictionary*) rawArgs; + + NSValue *value = (NSValue *) args[@"__this__"]; + if (value != nil && (NSNull*) value != [NSNull null]) { + CGRect cgRect = value.CGRectValue; + methodResult(@(cgRect.size.height)); + } else { + methodResult([FlutterError errorWithCode:@"目标对象为nul" + message:@"目标对象为nul" + details:@"目标对象为nul"]); + } + } else { + methodResult(FlutterMethodNotImplemented); + } +} + diff --git a/ios/Classes/CGSizeHandler.h b/ios/Classes/CGSizeHandler.h new file mode 100644 index 0000000..cc6203f --- /dev/null +++ b/ios/Classes/CGSizeHandler.h @@ -0,0 +1,15 @@ +// +// CGSizeHandler.h +// foundation_fluttify +// +// Created by Yohom Bao on 2020/6/22. +// + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +void CGSizeHandler(NSString* method, id args, FlutterResult methodResult); + +NS_ASSUME_NONNULL_END diff --git a/ios/Classes/CGSizeHandler.m b/ios/Classes/CGSizeHandler.m new file mode 100644 index 0000000..3709a39 --- /dev/null +++ b/ios/Classes/CGSizeHandler.m @@ -0,0 +1,52 @@ +// +// CGSizeHandler.m +// foundation_fluttify +// +// Created by Yohom Bao on 2020/6/22. +// + +#import "CGSizeHandler.h" + +extern BOOL enableLog; + +void CGSizeHandler(NSString* method, id rawArgs, FlutterResult methodResult) { + if ([@"CGSize::create" isEqualToString:method]) { + NSDictionary* args = (NSDictionary*) rawArgs; + + CGFloat width = [(NSNumber*) args[@"width"] floatValue]; + CGFloat height = [(NSNumber*) args[@"height"] floatValue]; + + CGSize rect = CGSizeMake(width, height); + + NSValue* result = [NSValue valueWithCGSize:rect]; + + methodResult(result); + } else if ([@"CGSize::getWidth" isEqualToString:method]) { + NSDictionary* args = (NSDictionary*) rawArgs; + + NSValue *__this__ = (NSValue *) args[@"__this__"]; + if (__this__ != nil && (NSNull*) __this__ != [NSNull null]) { + CGSize cgSize = __this__.CGSizeValue; + methodResult(@(cgSize.width)); + } else { + methodResult([FlutterError errorWithCode:@"目标对象为nul" + message:@"目标对象为nul" + details:@"目标对象为nul"]); + } + } else if ([@"CGSize::getHeight" isEqualToString:method]) { + NSDictionary* args = (NSDictionary*) rawArgs; + + NSValue *__this__ = (NSValue *) args[@"__this__"]; + if (__this__ != nil && (NSNull*) __this__ != [NSNull null]) { + CGSize cgSize = __this__.CGSizeValue; + methodResult(@(cgSize.height)); + } else { + methodResult([FlutterError errorWithCode:@"目标对象为nul" + message:@"目标对象为nul" + details:@"目标对象为nul"]); + } + } else { + methodResult(FlutterMethodNotImplemented); + } +} + diff --git a/ios/Classes/FluttifyMessageCodec.h b/ios/Classes/FluttifyMessageCodec.h new file mode 100644 index 0000000..e40d88f --- /dev/null +++ b/ios/Classes/FluttifyMessageCodec.h @@ -0,0 +1,24 @@ +// +// FluttifyMessageCodec.h +// FMDB +// +// Created by Yohom Bao on 2020/8/31. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface FluttifyReaderWriter : FlutterStandardReaderWriter + +@end + +@interface FluttifyWriter : FlutterStandardWriter + +@end + +@interface FluttifyReader : FlutterStandardReader + +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/Classes/FluttifyMessageCodec.m b/ios/Classes/FluttifyMessageCodec.m new file mode 100644 index 0000000..9a85766 --- /dev/null +++ b/ios/Classes/FluttifyMessageCodec.m @@ -0,0 +1,230 @@ +// +// FluttifyMessageCodec.m +// FMDB +// +// Created by Yohom Bao on 2020/8/31. +// + +#import "FluttifyMessageCodec.h" + +extern NSMutableDictionary *HEAP; + +typedef NS_ENUM(NSInteger, FluttifyField) { + FluttifyFieldNil, + FluttifyFieldTrue, + FluttifyFieldFalse, + FluttifyFieldInt32, + FluttifyFieldInt64, + FluttifyFieldIntHex, + FluttifyFieldFloat64, + FluttifyFieldString, + // The following must match the corresponding order from `FlutterStandardDataType`. + FluttifyFieldUInt8Data, + FluttifyFieldInt32Data, + FluttifyFieldInt64Data, + FluttifyFieldFloat64Data, + FluttifyFieldList, + FluttifyFieldMap, + FluttifyFieldEnum = 126, + FluttifyFieldRef = 127, +}; + +UInt8 elementSizeForFlutterStandardDataType(FlutterStandardDataType type) { + switch (type) { + case FlutterStandardDataTypeUInt8: + return 1; + case FlutterStandardDataTypeInt32: + return 4; + case FlutterStandardDataTypeInt64: + return 8; + case FlutterStandardDataTypeFloat64: + return 8; + default: + return 0; + } +} + +@implementation FluttifyReaderWriter +- (FlutterStandardWriter *)writerWithData:(NSMutableData *)data { + return [[FluttifyWriter alloc] initWithData:data]; +} + +- (FlutterStandardReader *)readerWithData:(NSData *)data { + return [[FluttifyReader alloc] initWithData:data]; +} +@end + +@implementation FluttifyWriter + +- (void)writeValue:(id)value { + if (value == nil || value == [NSNull null]) { + [self writeByte:FluttifyFieldNil]; + } else if ([value isKindOfClass:[NSNumber class]]) { + CFNumberRef number = (__bridge CFNumberRef) value; + BOOL success = NO; + if (CFGetTypeID(number) == CFBooleanGetTypeID()) { + BOOL b = CFBooleanGetValue((CFBooleanRef) number); + [self writeByte:(b ? FluttifyFieldTrue : FluttifyFieldFalse)]; + success = YES; + } else if (CFNumberIsFloatType(number)) { + Float64 f; + success = CFNumberGetValue(number, kCFNumberFloat64Type, &f); + if (success) { + [self writeByte:FluttifyFieldFloat64]; + [self writeAlignment:8]; + [self writeBytes:(UInt8 *) &f length:8]; + } + } else if (CFNumberGetByteSize(number) <= 4) { + SInt32 n; + success = CFNumberGetValue(number, kCFNumberSInt32Type, &n); + if (success) { + [self writeByte:FluttifyFieldInt32]; + [self writeBytes:(UInt8 *) &n length:4]; + } + } else if (CFNumberGetByteSize(number) <= 8) { + SInt64 n; + success = CFNumberGetValue(number, kCFNumberSInt64Type, &n); + if (success) { + [self writeByte:FluttifyFieldInt64]; + [self writeBytes:(UInt8 *) &n length:8]; + } + } + if (!success) { + NSLog(@"Unsupported value: %@ of number type %d", value, CFNumberGetType(number)); + NSAssert(NO, @"Unsupported value for standard codec"); + } + } else if ([value isKindOfClass:[NSString class]]) { + NSString *string = value; + [self writeByte:FluttifyFieldString]; + [self writeUTF8:string]; + } else if ([value isKindOfClass:[FlutterStandardTypedData class]]) { + FlutterStandardTypedData *typedData = value; + [self writeByte:(FluttifyField) (typedData.type + FluttifyFieldUInt8Data)]; + [self writeSize:typedData.elementCount]; + [self writeAlignment:typedData.elementSize]; + [self writeData:typedData.data]; + } + // 官方给NSData也自动转换了, 但是fluttify需要的是NSData对象, 所以这里去掉NSData的自动转换 + /*else if ([value isKindOfClass:[NSData class]]) { + [self writeValue:[FlutterStandardTypedData typedDataWithBytes:value]]; + } */ + else if ([value isKindOfClass:[NSArray class]]) { + NSArray *array = value; + [self writeByte:FluttifyFieldList]; + [self writeSize:array.count]; + for (id object in array) { + [self writeValue:object]; + } + } else if ([value isKindOfClass:[NSDictionary class]]) { + NSDictionary *dict = value; + [self writeByte:FluttifyFieldMap]; + [self writeSize:dict.count]; + for (id key in dict) { + [self writeValue:key]; + [self writeValue:dict[key]]; + } + } + // 传递NSObject类型 + else if ([value isKindOfClass:[NSObject class]]) { + NSUInteger hash = [value hash]; + NSString* refId = [NSString stringWithFormat:@"%@:%@", NSStringFromClass([value class]), @(hash)]; + [self writeByte:FluttifyFieldRef]; + [self writeUTF8:refId]; + HEAP[refId] = value; + } else { + NSLog(@"Unsupported value: %@ of type %@", value, [value class]); + NSAssert(NO, @"Unsupported value for standard codec"); + } +} +@end + +@implementation FluttifyReader + +- (FlutterStandardTypedData *)readTypedDataOfType:(FlutterStandardDataType)type { + UInt32 elementCount = [self readSize]; + UInt8 elementSize = elementSizeForFlutterStandardDataType(type); + [self readAlignment:elementSize]; + NSData *data = [self readData:elementCount * elementSize]; + + switch (type) { + case FlutterStandardDataTypeUInt8: + return [FlutterStandardTypedData typedDataWithBytes:data]; + case FlutterStandardDataTypeInt32: + return [FlutterStandardTypedData typedDataWithInt32:data]; + case FlutterStandardDataTypeInt64: + return [FlutterStandardTypedData typedDataWithInt64:data]; + case FlutterStandardDataTypeFloat64: + return [FlutterStandardTypedData typedDataWithFloat64:data]; + default: + return nil; + } +} + +- (nullable id)readValueOfType:(UInt8)type { + FluttifyField field = (FluttifyField) type; + switch (field) { + case FluttifyFieldNil: + return nil; + case FluttifyFieldTrue: + return @YES; + case FluttifyFieldFalse: + return @NO; + case FluttifyFieldInt32: { + SInt32 value; + [self readBytes:&value length:4]; + return @(value); + } + case FluttifyFieldInt64: { + SInt64 value; + [self readBytes:&value length:8]; + return @(value); + } + case FluttifyFieldFloat64: { + Float64 value; + [self readAlignment:8]; + [self readBytes:&value length:8]; + return @(value); + } + case FluttifyFieldIntHex: + case FluttifyFieldString: + return [self readUTF8]; + case FluttifyFieldUInt8Data: + case FluttifyFieldInt32Data: + case FluttifyFieldInt64Data: + case FluttifyFieldFloat64Data: + return [self readTypedDataOfType:(FlutterStandardDataType) (field - FluttifyFieldUInt8Data)]; + case FluttifyFieldList: { + UInt32 length = [self readSize]; + NSMutableArray *array = [NSMutableArray arrayWithCapacity:length]; + for (UInt32 i = 0; i < length; i++) { + id value = [self readValue]; + [array addObject:(value == nil ? [NSNull null] : value)]; + } + return array; + } + case FluttifyFieldMap: { + UInt32 size = [self readSize]; + NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:size]; + for (UInt32 i = 0; i < size; i++) { + id key = [self readValue]; + id val = [self readValue]; + dict[key == nil ? [NSNull null] : key] = val == nil ? [NSNull null] : val; + } + return dict; + } + // 枚举类型直接使用int值 + case FluttifyFieldEnum: { + SInt32 value; + [self readBytes:&value length:4]; + return @(value); + } + case FluttifyFieldRef: { + NSString *refId = [self readUTF8]; + return HEAP[refId]; + } + default: + NSAssert(NO, @"Corrupted standard message"); + return nil; + } +} +@end diff --git a/ios/Classes/FoundationFluttifyPlugin.h b/ios/Classes/FoundationFluttifyPlugin.h new file mode 100644 index 0000000..f0095c5 --- /dev/null +++ b/ios/Classes/FoundationFluttifyPlugin.h @@ -0,0 +1,9 @@ +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface FoundationFluttifyPlugin : NSObject +- (instancetype) initWithRegistrar:(NSObject*) registrar; +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/Classes/FoundationFluttifyPlugin.m b/ios/Classes/FoundationFluttifyPlugin.m new file mode 100644 index 0000000..5676ae1 --- /dev/null +++ b/ios/Classes/FoundationFluttifyPlugin.m @@ -0,0 +1,410 @@ +#import "FoundationFluttifyPlugin.h" +#import "PlatformService.h" +#import "UIImageHandler.h" +#import "UIViewHandler.h" +#import "CGPointHandler.h" +#import "NSDataHandler.h" +#import "NSDateHandler.h" +#import "UIEdgeInsetsHandler.h" +#import "UIColorHandler.h" +#import "NSErrorHandler.h" +#import "CGRectHandler.h" +#import "CGSizeHandler.h" +#import "UIViewControllerHandler.h" +#import "UIImageViewHandler.h" +#import "NSObjectHandler.h" +#import "platform_view/UIViewFactory.h" +#import "FluttifyMessageCodec.h" + +// The stack that exists on the Dart side for a method call is enabled only when the MethodChannel passing parameters are limited +NSMutableDictionary *STACK; + +// Container for Dart side random access objects +NSMutableDictionary *HEAP; + +// whether enable log or not +BOOL enableLog; + +NSString *_channelName = @"com.fluttify/foundation_method"; + +@implementation FoundationFluttifyPlugin { + NSObject *_registrar; +} + ++ (void)registerWithRegistrar:(NSObject *)registrar { + // 栈容器 + STACK = @{}.mutableCopy; + // 堆容器 + HEAP = @{}.mutableCopy; + + FlutterMethodChannel *channel = [FlutterMethodChannel + methodChannelWithName:_channelName + binaryMessenger:[registrar messenger] + codec:[FlutterStandardMethodCodec codecWithReaderWriter:[[FluttifyReaderWriter alloc] init]]]; + + FoundationFluttifyPlugin *instance = [[FoundationFluttifyPlugin alloc] initWithRegistrar:registrar]; + [registrar addMethodCallDelegate:instance channel:channel]; + [registrar registerViewFactory:[[UIViewFactory alloc] initWithRegistrar:registrar] withId:@"me.yohom/foundation_fluttify/UIView"]; +} + +- (instancetype)initWithRegistrar:(NSObject *)registrar { + self = [super init]; + if (self) { + _registrar = registrar; + [_registrar addApplicationDelegate:self]; + } + return self; +} + +- (void)handleMethodCall:(FlutterMethodCall *)methodCall result:(FlutterResult)methodResult { + id rawArgs = [methodCall arguments]; + if ([methodCall.method hasPrefix:@"UIImage::"]) { + UIImageHandler(methodCall.method, rawArgs, methodResult); + } else if ([methodCall.method hasPrefix:@"UIViewController::"]) { + UIViewControllerHandler(methodCall.method, rawArgs, methodResult); + } else if ([methodCall.method hasPrefix:@"UIView::"]) { + UIViewHandler(methodCall.method, rawArgs, methodResult); + } else if ([methodCall.method hasPrefix:@"CGPoint::"]) { + CGPointHandler(methodCall.method, rawArgs, methodResult); + } else if ([methodCall.method hasPrefix:@"NSData::"]) { + NSDataHandler(methodCall.method, rawArgs, methodResult); + } else if ([methodCall.method hasPrefix:@"UIEdgeInsets::"]) { + UIEdgeInsetsHandler(methodCall.method, rawArgs, methodResult); + } else if ([methodCall.method hasPrefix:@"UIColor::"]) { + UIColorHandler(methodCall.method, rawArgs, methodResult); + } else if ([methodCall.method hasPrefix:@"NSError::"]) { + NSErrorHandler(methodCall.method, rawArgs, methodResult); + } else if ([methodCall.method hasPrefix:@"CGRect::"]) { + CGRectHandler(methodCall.method, rawArgs, methodResult); + } else if ([methodCall.method hasPrefix:@"CGSize::"]) { + CGSizeHandler(methodCall.method, rawArgs, methodResult); + } else if ([methodCall.method hasPrefix:@"UIImageView::"]) { + UIImageViewHandler(methodCall.method, rawArgs, methodResult); + } else if ([methodCall.method hasPrefix:@"NSObject::"]) { + NSObjectHandler(methodCall.method, rawArgs, methodResult); + } else if ([methodCall.method hasPrefix:@"NSDate::"]) { + NSDateHandler(methodCall.method, rawArgs, methodResult); + } else if ([methodCall.method hasPrefix:@"Platform"]) { + PlatformService(methodCall.method, rawArgs, methodResult, self->_registrar); + } else { + methodResult(FlutterMethodNotImplemented); + } +} + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + if (enableLog) { + NSLog(@"application:didFinishLaunchingWithOptions"); + } + FlutterMethodChannel *channel = [FlutterMethodChannel + methodChannelWithName:_channelName + binaryMessenger:[_registrar messenger] + codec:[FlutterStandardMethodCodec codecWithReaderWriter:[[FluttifyReaderWriter alloc] init]]]; + + [channel invokeMethod:@"applicationDidFinishLaunchingWithOptions" + arguments:@{@"application": application, @"launchOptions": @{}}]; // 由于无法预知NSDictionary里的类型, 这里不传输了 + return YES; +} + +/** + * Called if this has been registered for `UIApplicationDelegate` callbacks. + * + * @return `NO` if this vetoes application launch. + */ +- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + if (enableLog) { + NSLog(@"application:willFinishLaunchingWithOptions"); + } + FlutterMethodChannel *channel = [FlutterMethodChannel + methodChannelWithName:_channelName + binaryMessenger:[_registrar messenger] + codec:[FlutterStandardMethodCodec codecWithReaderWriter:[[FluttifyReaderWriter alloc] init]]]; + + [channel invokeMethod:@"applicationWillFinishLaunchingWithOptions" + arguments:@{@"application": application, @"launchOptions": @{}}]; + return YES; +} + +/** + * Called if this has been registered for `UIApplicationDelegate` callbacks. + */ +- (void)applicationDidBecomeActive:(UIApplication *)application { + if (enableLog) { + NSLog(@"applicationDidBecomeActive"); + } + FlutterMethodChannel *channel = [FlutterMethodChannel + methodChannelWithName:_channelName + binaryMessenger:[_registrar messenger] + codec:[FlutterStandardMethodCodec codecWithReaderWriter:[[FluttifyReaderWriter alloc] init]]]; + + [channel invokeMethod:@"applicationDidBecomeActive" + arguments:@{@"application": application}]; +} + +/** + * Called if this has been registered for `UIApplicationDelegate` callbacks. + */ +- (void)applicationWillResignActive:(UIApplication *)application { + if (enableLog) { + NSLog(@"applicationWillResignActive"); + } + FlutterMethodChannel *channel = [FlutterMethodChannel + methodChannelWithName:_channelName + binaryMessenger:[_registrar messenger] + codec:[FlutterStandardMethodCodec codecWithReaderWriter:[[FluttifyReaderWriter alloc] init]]]; + + [channel invokeMethod:@"applicationWillResignActive" + arguments:@{@"application": application}]; +} + +/** + * Called if this has been registered for `UIApplicationDelegate` callbacks. + */ +- (void)applicationDidEnterBackground:(UIApplication *)application { + if (enableLog) { + NSLog(@"applicationDidEnterBackground"); + } + FlutterMethodChannel *channel = [FlutterMethodChannel + methodChannelWithName:_channelName + binaryMessenger:[_registrar messenger] + codec:[FlutterStandardMethodCodec codecWithReaderWriter:[[FluttifyReaderWriter alloc] init]]]; + + [channel invokeMethod:@"applicationDidEnterBackground" + arguments:@{@"application": application}]; +} + +/** + * Called if this has been registered for `UIApplicationDelegate` callbacks. + */ +- (void)applicationWillEnterForeground:(UIApplication *)application { + if (enableLog) { + NSLog(@"applicationWillEnterForeground"); + } + FlutterMethodChannel *channel = [FlutterMethodChannel + methodChannelWithName:_channelName + binaryMessenger:[_registrar messenger] + codec:[FlutterStandardMethodCodec codecWithReaderWriter:[[FluttifyReaderWriter alloc] init]]]; + + [channel invokeMethod:@"applicationWillEnterForeground" + arguments:@{@"application": application}]; +} + +/** + Called if this has been registered for `UIApplicationDelegate` callbacks. + */ +- (void)applicationWillTerminate:(UIApplication *)application { + if (enableLog) { + NSLog(@"applicationWillTerminate"); + } + FlutterMethodChannel *channel = [FlutterMethodChannel + methodChannelWithName:_channelName + binaryMessenger:[_registrar messenger] + codec:[FlutterStandardMethodCodec codecWithReaderWriter:[[FluttifyReaderWriter alloc] init]]]; + + [channel invokeMethod:@"applicationWillTerminate" + arguments:@{@"application": application}]; +} + +/** + * Called if this has been registered for `UIApplicationDelegate` callbacks. + */ +- (void) application:(UIApplication *)application +didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings +API_DEPRECATED( + "See -[UIApplicationDelegate application:didRegisterUserNotificationSettings:] deprecation", + ios(8.0, 10.0)) { + if (enableLog) { + NSLog(@"application:didRegisterUserNotificationSettings"); + } + FlutterMethodChannel *channel = [FlutterMethodChannel + methodChannelWithName:_channelName + binaryMessenger:[_registrar messenger] + codec:[FlutterStandardMethodCodec codecWithReaderWriter:[[FluttifyReaderWriter alloc] init]]]; + + [channel invokeMethod:@"applicationDidRegisterUserNotificationSettings" + arguments:@{@"application": application, @"notificationSettings": notificationSettings}]; +} + +/** + * Called if this has been registered for `UIApplicationDelegate` callbacks. + */ +- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { + if (enableLog) { + NSLog(@"application:didRegisterForRemoteNotificationsWithDeviceToken"); + } + FlutterMethodChannel *channel = [FlutterMethodChannel + methodChannelWithName:_channelName + binaryMessenger:[_registrar messenger] + codec:[FlutterStandardMethodCodec codecWithReaderWriter:[[FluttifyReaderWriter alloc] init]]]; + + [channel invokeMethod:@"applicationDidRegisterForRemoteNotificationsWithDeviceToken" + arguments:@{@"application": application, @"deviceToken": deviceToken}]; +} + +/** + * Called if this has been registered for `UIApplicationDelegate` callbacks. + * + * @return `YES` if this handles the request. + */ +- (BOOL) application:(UIApplication *)application +didReceiveRemoteNotification:(NSDictionary *)userInfo + fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler { + if (enableLog) { + NSLog(@"application:didReceiveRemoteNotification:fetchCompletionHandler"); + } + FlutterMethodChannel *channel = [FlutterMethodChannel + methodChannelWithName:_channelName + binaryMessenger:[_registrar messenger] + codec:[FlutterStandardMethodCodec codecWithReaderWriter:[[FluttifyReaderWriter alloc] init]]]; + + [channel invokeMethod:@"applicationDidReceiveRemoteNotificationFetchCompletionHandler" + arguments:@{@"application": application, @"userInfo": userInfo}]; + return NO; +} + +/** + * Called if this has been registered for `UIApplicationDelegate` callbacks. + * + * @return `YES` if this handles the request. + */ +- (BOOL)application:(UIApplication *)application + openURL:(NSURL *)url + options:(NSDictionary *)options { + if (enableLog) { + NSLog(@"application:openURL:options"); + } + FlutterMethodChannel *channel = [FlutterMethodChannel + methodChannelWithName:_channelName + binaryMessenger:[_registrar messenger] + codec:[FlutterStandardMethodCodec codecWithReaderWriter:[[FluttifyReaderWriter alloc] init]]]; + + [channel invokeMethod:@"applicationOpenURLOptions" + arguments:@{@"application": application, @"url": url, @"options": @{}}]; + return NO; +} + +/** + * Called if this has been registered for `UIApplicationDelegate` callbacks. + * + * @return `YES` if this handles the request. + */ +- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url { + if (enableLog) { + NSLog(@"application:handleOpenURL"); + } + FlutterMethodChannel *channel = [FlutterMethodChannel + methodChannelWithName:_channelName + binaryMessenger:[_registrar messenger] + codec:[FlutterStandardMethodCodec codecWithReaderWriter:[[FluttifyReaderWriter alloc] init]]]; + + [channel invokeMethod:@"applicationHandleOpenURL" + arguments:@{@"application": application, @"url": url}]; + return NO; +} + +/** + * Called if this has been registered for `UIApplicationDelegate` callbacks. + * + * @return `YES` if this handles the request. + */ +- (BOOL)application:(UIApplication *)application + openURL:(NSURL *)url + sourceApplication:(NSString *)sourceApplication + annotation:(id)annotation { + if (enableLog) { + NSLog(@"application:openURL:sourceApplication:annotation"); + } + FlutterMethodChannel *channel = [FlutterMethodChannel + methodChannelWithName:_channelName + binaryMessenger:[_registrar messenger] + codec:[FlutterStandardMethodCodec codecWithReaderWriter:[[FluttifyReaderWriter alloc] init]]]; + + [channel invokeMethod:@"applicationOpenURLSourceApplicationAnnotation" + arguments:@{@"application": application, @"url": url, @"sourceApplication": sourceApplication, @"annotation": (NSObject *) annotation}]; + return NO; +} + +/** + * Called if this has been registered for `UIApplicationDelegate` callbacks. + * + * @return `YES` if this handles the request. + */ +- (BOOL) application:(UIApplication *)application +performActionForShortcutItem:(UIApplicationShortcutItem *)shortcutItem + completionHandler:(void (^)(BOOL succeeded))completionHandler +API_AVAILABLE(ios(9.0)) { + if (enableLog) { + NSLog(@"application:performActionForShortcutItem:completionHandler"); + } + FlutterMethodChannel *channel = [FlutterMethodChannel + methodChannelWithName:_channelName + binaryMessenger:[_registrar messenger] + codec:[FlutterStandardMethodCodec codecWithReaderWriter:[[FluttifyReaderWriter alloc] init]]]; + + [channel invokeMethod:@"applicationPerformActionForShortcutItemCompletionHandler" + arguments:@{@"application": application, @"shortcutItem": shortcutItem}]; + return NO; +} + +/** + * Called if this has been registered for `UIApplicationDelegate` callbacks. + * + * @return `YES` if this handles the request. + */ +- (BOOL) application:(UIApplication *)application +handleEventsForBackgroundURLSession:(nonnull NSString *)identifier + completionHandler:(nonnull void (^)(void))completionHandler { + if (enableLog) { + NSLog(@"application:handleEventsForBackgroundURLSession:completionHandler"); + } + FlutterMethodChannel *channel = [FlutterMethodChannel + methodChannelWithName:_channelName + binaryMessenger:[_registrar messenger] + codec:[FlutterStandardMethodCodec codecWithReaderWriter:[[FluttifyReaderWriter alloc] init]]]; + + [channel invokeMethod:@"applicationHandleEventsForBackgroundURLSessionCompletionHandler" + arguments:@{@"application": application, @"identifier": identifier}]; + return NO; +} + +/** + * Called if this has been registered for `UIApplicationDelegate` callbacks. + * + * @return `YES` if this handles the request. + */ +- (BOOL) application:(UIApplication *)application +performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler { + if (enableLog) { + NSLog(@"application:performFetchWithCompletionHandler"); + } + FlutterMethodChannel *channel = [FlutterMethodChannel + methodChannelWithName:_channelName + binaryMessenger:[_registrar messenger] + codec:[FlutterStandardMethodCodec codecWithReaderWriter:[[FluttifyReaderWriter alloc] init]]]; + + [channel invokeMethod:@"applicationPerformFetchWithCompletionHandler" + arguments:@{@"application": application}]; + return NO; +} + +/** + * Called if this has been registered for `UIApplicationDelegate` callbacks. + * + * @return `YES` if this handles the request. + */ +- (BOOL) application:(UIApplication *)application +continueUserActivity:(NSUserActivity *)userActivity + restorationHandler:(void (^)(NSArray *))restorationHandler { + if (enableLog) { + NSLog(@"application:continueUserActivity:restorationHandler"); + } + FlutterMethodChannel *channel = [FlutterMethodChannel + methodChannelWithName:_channelName + binaryMessenger:[_registrar messenger] + codec:[FlutterStandardMethodCodec codecWithReaderWriter:[[FluttifyReaderWriter alloc] init]]]; + + [channel invokeMethod:@"applicationContinueUserActivityRestorationHandler" + arguments:@{@"application": application, @"userActivity": userActivity}]; + return NO; +} + +@end diff --git a/ios/Classes/NSDataHandler.h b/ios/Classes/NSDataHandler.h new file mode 100644 index 0000000..23683f4 --- /dev/null +++ b/ios/Classes/NSDataHandler.h @@ -0,0 +1,12 @@ +// +// Created by Yohom Bao on 2019/11/25. +// + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +void NSDataHandler(NSString* method, id args, FlutterResult methodResult); + +NS_ASSUME_NONNULL_END diff --git a/ios/Classes/NSDataHandler.m b/ios/Classes/NSDataHandler.m new file mode 100644 index 0000000..8cfa3c3 --- /dev/null +++ b/ios/Classes/NSDataHandler.m @@ -0,0 +1,36 @@ +// +// Created by Yohom Bao on 2019/11/25. +// + +#import "NSDataHandler.h" + +extern BOOL enableLog; + +void NSDataHandler(NSString* method, id rawArgs, FlutterResult methodResult) { + if ([@"NSData::createWithUint8List" isEqualToString:method]) { + NSDictionary* args = (NSDictionary*) rawArgs; + + FlutterStandardTypedData *data = (FlutterStandardTypedData *) args[@"data"]; + if (data != nil && (NSNull*) data != [NSNull null]) { + NSData *target = data.data; + methodResult(target); + } else { + methodResult([FlutterError errorWithCode:@"目标对象为nul" + message:@"目标对象为nul" + details:@"目标对象为nul"]); + } + } else if ([@"NSData::getData" isEqualToString:method]) { + NSDictionary* args = (NSDictionary*) rawArgs; + + NSData *target = (NSData *) args[@"__this__"]; + if (target != nil && (NSNull*) target != [NSNull null]) { + methodResult([FlutterStandardTypedData typedDataWithBytes:target]); + } else { + methodResult([FlutterError errorWithCode:@"目标对象为nul" + message:@"目标对象为nul" + details:@"目标对象为nul"]); + } + } else { + methodResult(FlutterMethodNotImplemented); + } +} diff --git a/ios/Classes/NSDateHandler.h b/ios/Classes/NSDateHandler.h new file mode 100644 index 0000000..fedcad7 --- /dev/null +++ b/ios/Classes/NSDateHandler.h @@ -0,0 +1,15 @@ +// +// NSDateHandler.h +// foundation_fluttify +// +// Created by Yohom Bao on 2020/11/9. +// + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +void NSDateHandler(NSString* method, id args, FlutterResult methodResult); + +NS_ASSUME_NONNULL_END diff --git a/ios/Classes/NSDateHandler.m b/ios/Classes/NSDateHandler.m new file mode 100644 index 0000000..072838c --- /dev/null +++ b/ios/Classes/NSDateHandler.m @@ -0,0 +1,27 @@ +// +// NSDateHandler.m +// foundation_fluttify +// +// Created by Yohom Bao on 2020/11/9. +// + +#import "NSDateHandler.h" + +extern BOOL enableLog; + +void NSDateHandler(NSString* method, id rawArgs, FlutterResult methodResult) { + if ([@"NSDate::get_timeIntervalSince1970" isEqualToString:method]) { + NSDictionary* args = (NSDictionary*) rawArgs; + + NSDate *target = (NSDate *) args[@"__this__"]; + if (target != nil && (NSNull*) target != [NSNull null]) { + methodResult(@(target.timeIntervalSince1970)); + } else { + methodResult([FlutterError errorWithCode:@"目标对象为nul" + message:@"目标对象为nul" + details:@"目标对象为nul"]); + } + } else { + methodResult(FlutterMethodNotImplemented); + } +} diff --git a/ios/Classes/NSErrorHandler.h b/ios/Classes/NSErrorHandler.h new file mode 100644 index 0000000..eb6171b --- /dev/null +++ b/ios/Classes/NSErrorHandler.h @@ -0,0 +1,15 @@ +// +// NSErrorHandler.h +// foundation_fluttify +// +// Created by Yohom Bao on 2020/4/5. +// + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +void NSErrorHandler(NSString* method, id args, FlutterResult methodResult); + +NS_ASSUME_NONNULL_END diff --git a/ios/Classes/NSErrorHandler.m b/ios/Classes/NSErrorHandler.m new file mode 100644 index 0000000..56d6176 --- /dev/null +++ b/ios/Classes/NSErrorHandler.m @@ -0,0 +1,39 @@ +// +// NSErrorHandler.m +// foundation_fluttify +// +// Created by Yohom Bao on 2020/4/5. +// + +#import "NSErrorHandler.h" + +extern BOOL enableLog; + +void NSErrorHandler(NSString* method, id rawArgs, FlutterResult methodResult) { + if ([@"NSError::getCode" isEqualToString:method]) { + NSDictionary* args = (NSDictionary*) rawArgs; + + NSError *target = (NSError *) args[@"__this__"]; + if (target != nil && (NSNull*) target != [NSNull null]) { + methodResult(@(target.code)); + } else { + methodResult([FlutterError errorWithCode:@"目标对象为nul" + message:@"目标对象为nul" + details:@"目标对象为nul"]); + } + } else if ([@"NSError::getDescription" isEqualToString:method]) { + NSDictionary* args = (NSDictionary*) rawArgs; + + NSError *target = (NSError *) args[@"__this__"]; + if (target != nil && (NSNull*) target != [NSNull null]) { + methodResult(target.description); + } else { + methodResult([FlutterError errorWithCode:@"目标对象为nul" + message:@"目标对象为nul" + details:@"目标对象为nul"]); + } + } else { + methodResult(FlutterMethodNotImplemented); + } +} + diff --git a/ios/Classes/NSObjectHandler.h b/ios/Classes/NSObjectHandler.h new file mode 100644 index 0000000..ec0dcad --- /dev/null +++ b/ios/Classes/NSObjectHandler.h @@ -0,0 +1,15 @@ +// +// NSObjectHandler.h +// FMDB +// +// Created by Yohom Bao on 2020/9/14. +// + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +void NSObjectHandler(NSString* method, id args, FlutterResult methodResult); + +NS_ASSUME_NONNULL_END diff --git a/ios/Classes/NSObjectHandler.m b/ios/Classes/NSObjectHandler.m new file mode 100644 index 0000000..7cd37ed --- /dev/null +++ b/ios/Classes/NSObjectHandler.m @@ -0,0 +1,32 @@ +// +// NSObjectHandler.m +// FMDB +// +// Created by Yohom Bao on 2020/9/14. +// + +#import "NSObjectHandler.h" + +extern BOOL enableLog; + +void NSObjectHandler(NSString* method, id rawArgs, FlutterResult methodResult) { + if ([@"NSObject::init" isEqualToString:method]) { + NSDictionary* args = (NSDictionary*) rawArgs; + + NSObject *__this__ = (NSObject *) args[@"__this__"]; + + NSObject *target = [__this__ init]; + + methodResult(target); + } else if ([@"NSObject::init_batch" isEqualToString:method]) { + NSDictionary* args = (NSDictionary*) rawArgs; + + NSObject *__this__ = (NSObject *) args[@"__this__"]; + + NSObject *target = [__this__ init]; + + methodResult(target); + } else { + methodResult(FlutterMethodNotImplemented); + } +} diff --git a/ios/Classes/PlatformService.h b/ios/Classes/PlatformService.h new file mode 100644 index 0000000..8d45c0c --- /dev/null +++ b/ios/Classes/PlatformService.h @@ -0,0 +1,15 @@ +// +// PlatformFactoryHandler.h +// foundation_fluttify +// +// Created by Yohom Bao on 2019/11/22. +// + +#import "FoundationFluttifyPlugin.h" +#import + +NS_ASSUME_NONNULL_BEGIN + +void PlatformService(NSString* method, id args, FlutterResult methodResult, NSObject* registrar); + +NS_ASSUME_NONNULL_END diff --git a/ios/Classes/PlatformService.m b/ios/Classes/PlatformService.m new file mode 100644 index 0000000..23fd948 --- /dev/null +++ b/ios/Classes/PlatformService.m @@ -0,0 +1,352 @@ +// +// PlatformFactoryHandler.m +// foundation_fluttify +// +// Created by Yohom Bao on 2019/11/22. +// + +#import "PlatformService.h" +#import +#import + +extern NSMutableDictionary *STACK; +extern NSMutableDictionary *HEAP; +extern BOOL enableLog; + +void PlatformService(NSString* method, id rawArgs, FlutterResult methodResult, NSObject* registrar) { + // toggle log + if ([@"PlatformService::enableLog" isEqualToString:method]) { + NSDictionary* args = (NSDictionary*) rawArgs; + + enableLog = [args[@"enable"] boolValue]; + methodResult(@"success"); + } + // 通过反射调用方法 + else if ([@"PlatformService::performSelectorWithObject" isEqualToString:method]) { + NSDictionary* args = (NSDictionary*) rawArgs; + + NSString *selector = (NSString *) args[@"selector"]; + NSObject *object = (NSObject *) args[@"object"]; + + NSObject *__this__ = (NSObject *) args[@"__this__"]; + if (__this__ != nil && (NSNull*) __this__ != [NSNull null]) { + [__this__ performSelector:NSSelectorFromString(selector) withObject:object]; + methodResult(@"success"); + } else { + methodResult([FlutterError errorWithCode:@"目标对象为nul" + message:@"目标对象为nul" + details:@"目标对象为nul"]); + } + } + // 判断当前对象是否存在 + else if ([@"PlatformService::isNull" isEqualToString:method]) { + NSDictionary* args = (NSDictionary*) rawArgs; + + NSObject *__this__ = (NSObject *) args[@"__this__"]; + methodResult(@(__this__ == nil || (NSNull*) __this__ == [NSNull null])); + } + // 为对象添加字段 + else if ([@"PlatformService::addProperty" isEqualToString:method]) { + NSDictionary* args = (NSDictionary*) rawArgs; + + NSInteger propertyKey = [(NSNumber *) args[@"propertyKey"] integerValue]; + NSObject *property__ = (NSObject *) args[@"property"]; + + NSObject *__this__ = args[@"__this__"]; + + if (__this__ && (NSNull*) __this__ != [NSNull null]) { + objc_setAssociatedObject(__this__, (const void *) propertyKey, property__, OBJC_ASSOCIATION_RETAIN_NONATOMIC); + methodResult(@"success"); + } else { + methodResult([FlutterError errorWithCode:@"目标对象为空" message:@"目标对象为空" details:@"目标对象为空"]); + } + } + // 为对象添加列表字段 + else if ([@"PlatformService::addListProperty" isEqualToString:method]) { + NSDictionary* args = (NSDictionary*) rawArgs; + + NSInteger propertyKey = [(NSNumber *) args[@"propertyKey"] integerValue]; + NSArray* property__ = (NSArray*) args[@"property"]; + + NSObject *__this__ = args[@"__this__"]; + + if (__this__ && (NSNull*) __this__ != [NSNull null]) { + objc_setAssociatedObject(__this__, (const void *) propertyKey, property__, OBJC_ASSOCIATION_RETAIN_NONATOMIC); + methodResult(@"success"); + } else { + methodResult([FlutterError errorWithCode:@"目标对象为空" message:@"目标对象为空" details:@"目标对象为空"]); + } + } + // 批量为对象添加字段 + else if ([@"PlatformService::addProperty_batch" isEqualToString:method]) { + NSArray*>* argsBatch = (NSArray*>*) rawArgs; + + NSMutableArray* resultList = [NSMutableArray array]; + + for (NSUInteger __i__ = 0; __i__ < argsBatch.count; __i__++) { + NSDictionary* args = argsBatch[__i__]; + + NSInteger propertyKey = [(NSNumber *) args[@"propertyKey"] integerValue]; + NSObject *property__ = (NSObject *) args[@"property"]; + + NSObject *__this__ = args[@"__this__"]; + + if (__this__ && (NSNull*) __this__ != [NSNull null]) { + objc_setAssociatedObject(__this__, (const void *) propertyKey, property__, OBJC_ASSOCIATION_RETAIN_NONATOMIC); + [resultList addObject:@"success"]; + } else { + methodResult([FlutterError errorWithCode:@"目标对象为空" message:@"目标对象为空" details:@"目标对象为空"]); + break; + } + } + + methodResult(resultList); + } + // 获取添加字段的值 + else if ([@"PlatformService::getProperty" isEqualToString:method]) { + NSDictionary* args = (NSDictionary*) rawArgs; + + NSInteger propertyKey = [(NSNumber *) args[@"propertyKey"] integerValue]; + + NSObject *__this__ = args[@"__this__"]; + + if (__this__ && (NSNull*) __this__ != [NSNull null]) { + NSObject *result = objc_getAssociatedObject(__this__, (const void *) propertyKey); + methodResult(result); + } else { + methodResult([FlutterError errorWithCode:@"目标对象为空" message:@"目标对象为空" details:@"目标对象为空"]); + } + } + // 批量获取添加字段的值 + else if ([@"PlatformService::getProperty_batch" isEqualToString:method]) { + NSArray*>* argsBatch = (NSArray*>*) rawArgs; + + NSMutableArray* resultList = [NSMutableArray array]; + + for (NSUInteger __i__ = 0; __i__ < argsBatch.count; __i__++) { + NSDictionary* args = argsBatch[__i__]; + + NSInteger propertyKey = [(NSNumber *) args[@"propertyKey"] integerValue]; + + NSObject *__this__ = args[@"__this__"]; + + if (__this__ && (NSNull*) __this__ != [NSNull null]) { + NSObject *result = objc_getAssociatedObject(__this__, (const void *) propertyKey); + [resultList addObject:result]; + } else { + methodResult([FlutterError errorWithCode:@"目标对象为空" message:@"目标对象为空" details:@"目标对象为空"]); + break; + } + } + + methodResult(resultList); + } + // 为对象添加jsonable字段 + else if ([@"PlatformService::addJsonableProperty" isEqualToString:method]) { + NSDictionary* args = (NSDictionary*) rawArgs; + + NSInteger propertyKey = [(NSNumber *) args[@"propertyKey"] integerValue]; + NSObject *property = (NSObject *) args[@"property"]; + + NSObject *__this__ = args[@"__this__"]; + + if (__this__ && (NSNull*) __this__ != [NSNull null]) { + objc_setAssociatedObject(__this__, (const void *) propertyKey, property, OBJC_ASSOCIATION_RETAIN_NONATOMIC); + methodResult(@"success"); + } else { + methodResult([FlutterError errorWithCode:@"目标对象为空" message:@"目标对象为空" details:@"目标对象为空"]); + } + } + // 批量为对象添加jsonable字段 + else if ([@"PlatformService::addJsonableProperty_batch" isEqualToString:method]) { + NSArray*>* argsBatch = (NSArray*>*) rawArgs; + + NSMutableArray* resultList = [NSMutableArray array]; + + for (NSUInteger __i__ = 0; __i__ < argsBatch.count; __i__++) { + NSDictionary* args = argsBatch[__i__]; + + NSInteger propertyKey = [(NSNumber *) args[@"propertyKey"] integerValue]; + NSObject *property = (NSObject *) args[@"property"]; + + NSObject *__this__ = args[@"__this__"]; + + if (__this__ && (NSNull*) __this__ != [NSNull null]) { + objc_setAssociatedObject(__this__, (const void *) propertyKey, property, OBJC_ASSOCIATION_RETAIN_NONATOMIC); + [resultList addObject:@"success"]; + } else { + methodResult([FlutterError errorWithCode:@"目标对象为空" message:@"目标对象为空" details:@"目标对象为空"]); + break; + } + } + + methodResult(resultList); + } + // 获取添加字段的jsonable值 + else if ([@"PlatformService::getJsonableProperty" isEqualToString:method]) { + NSDictionary* args = (NSDictionary*) rawArgs; + + NSInteger propertyKey = [(NSNumber *) args[@"propertyKey"] integerValue]; + + NSObject *__this__ = args[@"__this__"]; + + if (__this__ && (NSNull*) __this__ != [NSNull null]) { + methodResult(objc_getAssociatedObject(__this__, (const void *) propertyKey)); + } else { + methodResult([FlutterError errorWithCode:@"目标对象为空" message:@"目标对象为空" details:@"目标对象为空"]); + } + } + // 批量获取添加字段的jsonable值 + else if ([@"PlatformService::getJsonableProperty_batch" isEqualToString:method]) { + NSArray*>* argsBatch = (NSArray*>*) rawArgs; + + NSMutableArray* resultList = [NSMutableArray array]; + + for (NSUInteger __i__ = 0; __i__ < argsBatch.count; __i__++) { + NSDictionary* args = argsBatch[__i__]; + + NSInteger propertyKey = [(NSNumber *) args[@"propertyKey"] integerValue]; + + NSObject *__this__ = args[@"__this__"]; + + if (__this__ && (NSNull*) __this__ != [NSNull null]) { + NSObject* result = objc_getAssociatedObject(__this__, (const void *) propertyKey); + [resultList addObject:result]; + } else { + methodResult([FlutterError errorWithCode:@"目标对象为空" message:@"目标对象为空" details:@"目标对象为空"]); + break; + } + } + + methodResult(resultList); + } + // 释放一个对象 + else if ([@"PlatformService::release" isEqualToString:method]) { + NSDictionary* args = (NSDictionary*) rawArgs; + + NSNumber *__this__ = (NSNumber *) args[@"__this__"]; + + if (enableLog) NSLog(@"PlatformService::释放对象: %@", __this__); + + [HEAP removeObjectForKey:[NSString stringWithFormat:@"%@", __this__]]; + methodResult(@"success"); + + if (enableLog) NSLog(@"size: %ld, HEAP: %@", [HEAP count], HEAP); + } + // 释放一批对象 + else if ([@"PlatformService::release_batch" isEqualToString:method]) { + NSDictionary* args = (NSDictionary*) rawArgs; + + NSArray* __this_batch__ = (NSArray*) args[@"__this_batch__"]; + + if (enableLog) NSLog(@"PlatformService::批量释放对象: %@", __this_batch__); + + for (NSNumber* item in __this_batch__) { + [HEAP removeObjectForKey:[NSString stringWithFormat:@"%@", item]]; + } + methodResult(@"success"); + + if (enableLog) NSLog(@"size: %ld, HEAP: %@", [HEAP count], HEAP); + } + // 清空堆 + else if ([@"PlatformService::clearHeap" isEqualToString:method]) { + if (enableLog) NSLog(@"PlatformService::清空堆"); + + [HEAP removeAllObjects]; + methodResult(@"success"); + + if (enableLog) NSLog(@"size: %ld, HEAP: %@", [HEAP count], HEAP); + } + // 压入栈 + else if ([@"PlatformService::pushStack" isEqualToString:method]) { + NSDictionary* args = (NSDictionary*) rawArgs; + + NSString *name = (NSString *) args[@"name"]; + + NSObject *__this__ = (NSObject *) args[@"__this__"]; + + if (enableLog) NSLog(@"PlatformService::压入栈 %@@%@", NSStringFromClass([args[@"__this__"] class]), __this__); + + STACK[name] = __this__; + + methodResult(@"success"); + + if (enableLog) NSLog(@"STACK: %@", STACK); + } + // 压入栈 jsonable + else if ([@"PlatformService::pushStackJsonable" isEqualToString:method]) { + NSDictionary* args = (NSDictionary*) rawArgs; + + NSString *name = (NSString *) args[@"name"]; + NSObject *data = (NSObject *) args[@"data"]; + + if (enableLog) NSLog(@"PlatformService::压入栈 %@", data); + + STACK[name] = data; + + methodResult(@"success"); + + if (enableLog) NSLog(@"STACK: %@", STACK); + } + // 清空栈 + else if ([@"PlatformService::clearStack" isEqualToString:method]) { + if (enableLog) NSLog(@"PlatformService::清空栈"); + + [STACK removeAllObjects]; + methodResult(@"success"); + + if (enableLog) NSLog(@"STACK: %@", STACK); + } + // 打开一个ViewController + else if ([@"PlatformService::presentViewController" isEqualToString:method]) { + NSDictionary* args = (NSDictionary*) rawArgs; + + if (enableLog) NSLog(@"PlatformService::打开一个ViewController"); + NSString* viewControllerClass = (NSString*) args[@"viewControllerClass"]; + BOOL withNavigationController = [(NSNumber*) args[@"withNavigationController"] boolValue]; + + UIViewController *controller = (UIViewController *) [[NSClassFromString(viewControllerClass) alloc] init]; + if (withNavigationController) { + // UINavigationController *naviController = [[UINavigationController alloc] initWithRootViewController:controller]; + // UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithTitle:@"关闭" style:UIBarButtonItemStyleDone __this__:nil action:@selector(dismiss)]; + // [[controller navigationItem] setLeftBarButtonItem:item]; + // [[UIApplication sharedApplication].keyWindow.rootViewController presentViewController:naviController animated:YES completion:nil]; + } else { + [[UIApplication sharedApplication].keyWindow.rootViewController presentViewController:controller animated:YES completion:nil]; + } + methodResult(@"success"); + } + // 获取flutter asset的路径 + else if ([@"PlatformService::getAssetPath" isEqualToString:method]) { + NSDictionary* args = (NSDictionary*) rawArgs; + + NSString *flutterAssetPath = (NSString *) args[@"flutterAssetPath"]; + + if (enableLog) NSLog(@"PlatformService::Flutter Asset%@", flutterAssetPath); + + NSString* key = [registrar lookupKeyForAsset:flutterAssetPath]; + NSString* path = [[NSBundle mainBundle] pathForResource:key ofType:nil]; + + methodResult(path); + } + // viewId转refId + else if ([@"PlatformService::viewId2RefId" isEqualToString:method]) { + NSDictionary* args = (NSDictionary*) rawArgs; + + NSString *viewId = (NSString *) args[@"viewId"]; + + if (enableLog) NSLog(@"PlatformService::viewId%@", viewId); + + if ([[HEAP allKeys] containsObject:viewId]) { + NSObject* object = HEAP[viewId]; + methodResult([NSString stringWithFormat:@"%@", @(object.hash)]); + // 转换后删除viewId + [HEAP removeObjectForKey:viewId]; + } else { + methodResult([FlutterError errorWithCode:@"viewId无对应对象" message:@"viewId无对应对象" details:@"viewId无对应对象"]); + } + + } else { + methodResult(FlutterMethodNotImplemented); + } +} diff --git a/ios/Classes/UIColorHandler.h b/ios/Classes/UIColorHandler.h new file mode 100644 index 0000000..3b4a37e --- /dev/null +++ b/ios/Classes/UIColorHandler.h @@ -0,0 +1,15 @@ +// +// UIColorHandler.h +// foundation_fluttify +// +// Created by Yohom Bao on 2020/3/9. +// + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +void UIColorHandler(NSString* method, id args, FlutterResult methodResult); + +NS_ASSUME_NONNULL_END diff --git a/ios/Classes/UIColorHandler.m b/ios/Classes/UIColorHandler.m new file mode 100644 index 0000000..e1d9bc3 --- /dev/null +++ b/ios/Classes/UIColorHandler.m @@ -0,0 +1,29 @@ +// +// UIColorHandler.m +// foundation_fluttify +// +// Created by Yohom Bao on 2020/3/9. +// + +#import "UIColorHandler.h" + +extern BOOL enableLog; + +void UIColorHandler(NSString* method, id rawArgs, FlutterResult methodResult) { + if ([@"UIColor::create" isEqualToString:method]) { + NSDictionary* args = (NSDictionary*) rawArgs; + + NSNumber *colorValue = (NSNumber *) args[@"colorValue"]; + CGFloat alpha = (0xff000000 & [colorValue integerValue]) >> 24; + CGFloat red = (0x00ff0000 & [colorValue integerValue]) >> 16; + CGFloat green = (0x0000ff00 & [colorValue integerValue]) >> 8; + CGFloat blue = (0x000000ff & [colorValue integerValue]) >> 0; + + UIColor *color = [UIColor colorWithRed:red / 0xFF green:green / 0xFF blue:blue / 0xFF alpha:alpha / 0xFF]; + + methodResult(color); + } else { + methodResult(FlutterMethodNotImplemented); + } +} + diff --git a/ios/Classes/UIEdgeInsetsHandler.h b/ios/Classes/UIEdgeInsetsHandler.h new file mode 100644 index 0000000..78d20b3 --- /dev/null +++ b/ios/Classes/UIEdgeInsetsHandler.h @@ -0,0 +1,12 @@ +// +// Created by Yohom Bao on 2019/12/5. +// + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +void UIEdgeInsetsHandler(NSString* method, id args, FlutterResult methodResult); + +NS_ASSUME_NONNULL_END diff --git a/ios/Classes/UIEdgeInsetsHandler.m b/ios/Classes/UIEdgeInsetsHandler.m new file mode 100644 index 0000000..7a6846b --- /dev/null +++ b/ios/Classes/UIEdgeInsetsHandler.m @@ -0,0 +1,74 @@ +// +// Created by Yohom Bao on 2019/12/5. +// + +#import "UIEdgeInsetsHandler.h" + +extern BOOL enableLog; + +void UIEdgeInsetsHandler(NSString* method, id rawArgs, FlutterResult methodResult) { + if ([@"UIEdgeInsets::getTop" isEqualToString:method]) { + NSDictionary* args = (NSDictionary*) rawArgs; + + NSValue *target = (NSValue *) args[@"__this__"]; + if (target != nil && (NSNull*) target != [NSNull null]) { + UIEdgeInsets insets = [target UIEdgeInsetsValue]; + methodResult(@(insets.top)); + } else { + methodResult([FlutterError errorWithCode:@"目标对象为nul" + message:@"目标对象为nul" + details:@"目标对象为nul"]); + } + } else if ([@"UIEdgeInsets::getLeft" isEqualToString:method]) { + NSDictionary* args = (NSDictionary*) rawArgs; + + NSValue *target = (NSValue *) args[@"__this__"]; + if (target != nil && (NSNull*) target != [NSNull null]) { + UIEdgeInsets insets = [target UIEdgeInsetsValue]; + methodResult(@(insets.left)); + } else { + methodResult([FlutterError errorWithCode:@"目标对象为nul" + message:@"目标对象为nul" + details:@"目标对象为nul"]); + } + } else if ([@"UIEdgeInsets::getBottom" isEqualToString:method]) { + NSDictionary* args = (NSDictionary*) rawArgs; + + NSValue *target = (NSValue *) args[@"__this__"]; + if (target != nil && (NSNull*) target != [NSNull null]) { + UIEdgeInsets insets = [target UIEdgeInsetsValue]; + methodResult(@(insets.bottom)); + } else { + methodResult([FlutterError errorWithCode:@"目标对象为nul" + message:@"目标对象为nul" + details:@"目标对象为nul"]); + } + } else if ([@"UIEdgeInsets::getRight" isEqualToString:method]) { + NSDictionary* args = (NSDictionary*) rawArgs; + + NSValue *target = (NSValue *) args[@"__this__"]; + if (target != nil && (NSNull*) target != [NSNull null]) { + UIEdgeInsets insets = [target UIEdgeInsetsValue]; + methodResult(@(insets.right)); + } else { + methodResult([FlutterError errorWithCode:@"目标对象为nul" + message:@"目标对象为nul" + details:@"目标对象为nul"]); + } + } else if ([@"UIEdgeInsets::create" isEqualToString:method]) { + NSDictionary* args = (NSDictionary*) rawArgs; + + NSNumber *top = (NSNumber *) args[@"top"]; + NSNumber *left = (NSNumber *) args[@"left"]; + NSNumber *bottom = (NSNumber *) args[@"bottom"]; + NSNumber *right = (NSNumber *) args[@"right"]; + + UIEdgeInsets insets = UIEdgeInsetsMake([top floatValue], [left floatValue], [bottom floatValue], [right floatValue]); + + NSValue *valuePoint = [NSValue valueWithUIEdgeInsets:insets]; + + methodResult(valuePoint); + } else { + methodResult(FlutterMethodNotImplemented); + } +} diff --git a/ios/Classes/UIImageHandler.h b/ios/Classes/UIImageHandler.h new file mode 100644 index 0000000..04998ca --- /dev/null +++ b/ios/Classes/UIImageHandler.h @@ -0,0 +1,13 @@ +// +// Created by Yohom Bao on 2019/11/22. +// + +#import +#import +#import "FoundationFluttifyPlugin.h" + +NS_ASSUME_NONNULL_BEGIN + +void UIImageHandler(NSString* method, id args, FlutterResult methodResult); + +NS_ASSUME_NONNULL_END diff --git a/ios/Classes/UIImageHandler.m b/ios/Classes/UIImageHandler.m new file mode 100644 index 0000000..662a05b --- /dev/null +++ b/ios/Classes/UIImageHandler.m @@ -0,0 +1,69 @@ +// +// Created by Yohom Bao on 2019/11/22. +// + +#import "UIImageHandler.h" + +extern BOOL enableLog; + +void UIImageHandler(NSString *method, id rawArgs, FlutterResult methodResult) { + // UIImage::getData + if ([@"UIImage::getData" isEqualToString:method]) { + NSDictionary *args = (NSDictionary *) rawArgs; + + UIImage *target = (UIImage *) args[@"__this__"]; + if (target != nil && (NSNull*) target != [NSNull null]) { + NSData *data = UIImageJPEGRepresentation(target, 100); + methodResult([FlutterStandardTypedData typedDataWithBytes:data]); + } else { + methodResult([FlutterError errorWithCode:@"目标对象为nul" + message:@"目标对象为nul" + details:@"目标对象为nul"]); + } + } + // 创建UIImage + else if ([@"UIImage::createUIImage" isEqualToString:method]) { + NSDictionary *args = (NSDictionary *) rawArgs; + + FlutterStandardTypedData *bitmapBytes = (FlutterStandardTypedData *) args[@"bitmapBytes"]; + + UIImage *bitmap = [UIImage imageWithData:bitmapBytes.data scale:[UIScreen mainScreen].scale]; + + methodResult(bitmap); + } + // 创建UIImage + else if ([@"UIImage::createWithPath" isEqualToString:method]) { + NSDictionary *args = (NSDictionary *) rawArgs; + + NSString *resource = (NSString *) args[@"resource"]; + NSString *type = (NSString *) args[@"type"]; + NSString *fileName = (NSString *) args[@"fileName"]; + + NSString *path = [[NSBundle mainBundle] pathForResource:resource ofType:type]; + path = [path stringByAppendingPathComponent:fileName]; + + UIImage *bitmap = [UIImage imageWithContentsOfFile:path]; + + methodResult(bitmap); + } + // 批量创建UIImage + else if ([@"UIImage::createUIImage_batch" isEqualToString:method]) { + NSArray *> *argsBatch = (NSArray *> *) rawArgs; + + NSMutableArray *resultList = [NSMutableArray array]; + + for (NSUInteger __i__ = 0; __i__ < argsBatch.count; __i__++) { + NSDictionary *args = argsBatch[__i__]; + + FlutterStandardTypedData *bitmapBytes = (FlutterStandardTypedData *) args[@"bitmapBytes"]; + + UIImage *bitmap = [UIImage imageWithData:bitmapBytes.data scale:[UIScreen mainScreen].scale]; + + [resultList addObject:bitmap]; + } + + methodResult(resultList); + } else { + methodResult(FlutterMethodNotImplemented); + } +} diff --git a/ios/Classes/UIImageViewHandler.h b/ios/Classes/UIImageViewHandler.h new file mode 100644 index 0000000..e99d0ea --- /dev/null +++ b/ios/Classes/UIImageViewHandler.h @@ -0,0 +1,15 @@ +// +// UIImageViewHandler.h +// foundation_fluttify +// +// Created by Yohom Bao on 2020/7/2. +// + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +void UIImageViewHandler(NSString* method, id args, FlutterResult methodResult); + +NS_ASSUME_NONNULL_END diff --git a/ios/Classes/UIImageViewHandler.m b/ios/Classes/UIImageViewHandler.m new file mode 100644 index 0000000..08ddc2d --- /dev/null +++ b/ios/Classes/UIImageViewHandler.m @@ -0,0 +1,24 @@ +// +// UIImageViewHandler.m +// foundation_fluttify +// +// Created by Yohom Bao on 2020/7/2. +// + +#import "UIImageViewHandler.h" + +extern BOOL enableLog; + +void UIImageViewHandler(NSString *method, id rawArgs, FlutterResult methodResult) { + if ([@"UIImageView::create" isEqualToString:method]) { + NSDictionary *args = (NSDictionary *) rawArgs; + + UIImage *image = (UIImage *) args[@"image"]; + + UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; + + methodResult(imageView); + } else { + methodResult(FlutterMethodNotImplemented); + } +} diff --git a/ios/Classes/UIViewControllerHandler.h b/ios/Classes/UIViewControllerHandler.h new file mode 100644 index 0000000..dbd03bc --- /dev/null +++ b/ios/Classes/UIViewControllerHandler.h @@ -0,0 +1,15 @@ +// +// UIViewControllerHandler.h +// foundation_fluttify +// +// Created by Yohom Bao on 2020/6/6. +// + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +void UIViewControllerHandler(NSString* method, id args, FlutterResult methodResult); + +NS_ASSUME_NONNULL_END diff --git a/ios/Classes/UIViewControllerHandler.m b/ios/Classes/UIViewControllerHandler.m new file mode 100644 index 0000000..0c21a1e --- /dev/null +++ b/ios/Classes/UIViewControllerHandler.m @@ -0,0 +1,21 @@ +// +// UIViewControllerHandler.m +// foundation_fluttify +// +// Created by Yohom Bao on 2020/6/6. +// + +#import "UIViewControllerHandler.h" +#import + +extern BOOL enableLog; + +void UIViewControllerHandler(NSString* method, id args, FlutterResult methodResult) { + if ([@"UIViewController::get" isEqualToString:method]) { + UIViewController* controller = [UIApplication sharedApplication].keyWindow.rootViewController; + + methodResult(controller); + } else { + methodResult(FlutterMethodNotImplemented); + } +} diff --git a/ios/Classes/UIViewHandler.h b/ios/Classes/UIViewHandler.h new file mode 100644 index 0000000..53e3bf5 --- /dev/null +++ b/ios/Classes/UIViewHandler.h @@ -0,0 +1,12 @@ +// +// Created by Yohom Bao on 2019/11/22. +// + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +void UIViewHandler(NSString* method, id args, FlutterResult methodResult); + +NS_ASSUME_NONNULL_END diff --git a/ios/Classes/UIViewHandler.m b/ios/Classes/UIViewHandler.m new file mode 100644 index 0000000..201f239 --- /dev/null +++ b/ios/Classes/UIViewHandler.m @@ -0,0 +1,210 @@ +// +// Created by Yohom Bao on 2019/11/22. +// + +#import +#import "UIViewHandler.h" + +extern BOOL enableLog; + +void UIViewHandler(NSString* method, id args, FlutterResult methodResult) { + // UIImage::getFrame + if ([@"UIView::getFrame" isEqualToString:method]) { + UIView *target = (UIView *) args[@"__this__"]; + if (target != nil && (NSNull*) target != [NSNull null]) { + CGRect rect = [target frame]; + NSValue *dataValue = [NSValue value:&rect withObjCType:@encode(CGRect)]; + methodResult(dataValue); + } else { + methodResult([FlutterError errorWithCode:@"目标对象为nul" + message:@"目标对象为nul" + details:@"目标对象为nul"]); + } + } else if ([@"UIView::getHidden" isEqualToString:method]) { + UIView *target = (UIView *) args[@"__this__"]; + if (target != nil && (NSNull*) target != [NSNull null]) { + methodResult(@(target.isHidden)); + } else { + methodResult([FlutterError errorWithCode:@"目标对象为nul" + message:@"目标对象为nul" + details:@"目标对象为nul"]); + } + } else if ([@"UIView::rotate" isEqualToString:method]) { + NSNumber* angle = (NSNumber*) args[@"angle"]; + + UIView *target = (UIView *) args[@"__this__"]; + if (target != nil && (NSNull*) target != [NSNull null]) { + target.transform = CGAffineTransformMakeRotation([angle doubleValue] / 180.0 * M_PI); + methodResult(@"success"); + } else { + methodResult([FlutterError errorWithCode:@"目标对象为nul" + message:@"目标对象为nul" + details:@"目标对象为nul"]); + } + } else if ([@"UIView::create" isEqualToString:method]) { + UIView* result = [[UIView alloc] init]; + methodResult(result); + } else if ([@"UIView::setHidden" isEqualToString:method]) { + NSNumber* hidden = (NSNumber*) args[@"hidden"]; + + UIView *target = (UIView *) args[@"__this__"]; + if (target != nil && (NSNull*) target != [NSNull null]) { + target.hidden = [hidden boolValue]; + methodResult(@"success"); + } else { + methodResult([FlutterError errorWithCode:@"目标对象为nul" + message:@"目标对象为nul" + details:@"目标对象为nul"]); + } + } else if ([@"UIView::setAnchorPoint" isEqualToString:method]) { + NSNumber* anchorU = (NSNumber*) args[@"anchorU"]; + NSNumber* anchorV = (NSNumber*) args[@"anchorV"]; + + UIView *target = (UIView *) args[@"__this__"]; + if (target != nil && (NSNull*) target != [NSNull null]) { + target.layer.anchorPoint = CGPointMake([anchorU doubleValue], [anchorV doubleValue]); + methodResult(@"success"); + } else { + methodResult([FlutterError errorWithCode:@"目标对象为nul" + message:@"目标对象为nul" + details:@"目标对象为nul"]); + } + } else if ([@"UIView::scaleWithDuration" isEqualToString:method]) { + NSNumber* duration = (NSNumber*) args[@"duration"]; + NSNumber* fromValue = (NSNumber*) args[@"fromValue"]; + NSNumber* toValue = (NSNumber*) args[@"toValue"]; + NSNumber* repeatCount = (NSNumber*) args[@"repeatCount"]; + NSNumber* repeatMode = (NSNumber*) args[@"repeatMode"]; + + UIView *target = (UIView *) args[@"__this__"]; + if (target != nil && (NSNull*) target != [NSNull null]) { + CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.scale"]; + animation.fromValue = fromValue; + animation.toValue = toValue; + animation.duration = [duration doubleValue]; + animation.autoreverses = [repeatMode intValue] == 0 ? NO : YES; + animation.repeatCount = [repeatCount intValue] == 0 ? MAXFLOAT : [repeatCount intValue]; + animation.removedOnCompletion = NO; + animation.fillMode = kCAFillModeForwards; + [target.layer addAnimation:animation forKey:@"zoom"]; + + methodResult(@"success"); + } else { + methodResult([FlutterError errorWithCode:@"目标对象为nul" + message:@"目标对象为nul" + details:@"目标对象为nul"]); + } + } else if ([@"UIView::translateWithDuration" isEqualToString:method]) { + NSNumber* duration = (NSNumber*) args[@"duration"]; + NSNumber* toX = (NSNumber*) args[@"toX"]; + NSNumber* toY = (NSNumber*) args[@"toY"]; + NSNumber* repeatCount = (NSNumber*) args[@"repeatCount"]; + NSNumber* repeatMode = (NSNumber*) args[@"repeatMode"]; + + UIView *target = (UIView *) args[@"__this__"]; + if (target != nil && (NSNull*) target != [NSNull null]) { + CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"]; + animation.toValue = [NSValue valueWithCGPoint:CGPointMake([toX floatValue], [toY floatValue])]; + animation.duration = [duration doubleValue]; + animation.autoreverses = [repeatMode intValue] == 0 ? NO : YES; + animation.repeatCount = [repeatCount intValue] == 0 ? MAXFLOAT : [repeatCount intValue]; + animation.removedOnCompletion = NO; + animation.fillMode = kCAFillModeForwards; + [target.layer addAnimation:animation forKey:@"position"]; + + methodResult(@"success"); + } else { + methodResult([FlutterError errorWithCode:@"目标对象为nul" + message:@"目标对象为nul" + details:@"目标对象为nul"]); + } + } else if ([@"UIView::alphaWithDuration" isEqualToString:method]) { + NSNumber* duration = (NSNumber*) args[@"duration"]; + NSNumber* fromValue = (NSNumber*) args[@"fromValue"]; + NSNumber* toValue = (NSNumber*) args[@"toValue"]; + NSNumber* repeatCount = (NSNumber*) args[@"repeatCount"]; + NSNumber* repeatMode = (NSNumber*) args[@"repeatMode"]; + + UIView *target = (UIView *) args[@"__this__"]; + if (target != nil && (NSNull*) target != [NSNull null]) { + CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"opacity"]; + animation.fromValue = fromValue; + animation.toValue = toValue; + animation.duration = [duration doubleValue]; + animation.autoreverses = [repeatMode intValue] == 0 ? NO : YES; + animation.repeatCount = [repeatCount intValue] == 0 ? MAXFLOAT : [repeatCount intValue]; + animation.removedOnCompletion = NO; + animation.fillMode = kCAFillModeForwards; + [target.layer addAnimation:animation forKey:@"opacity"]; + + methodResult(@"success"); + } else { + methodResult([FlutterError errorWithCode:@"目标对象为nul" + message:@"目标对象为nul" + details:@"目标对象为nul"]); + } + } else if ([@"UIView::rotateWithDuration" isEqualToString:method]) { + NSNumber* duration = (NSNumber*) args[@"duration"]; + NSNumber* fromValue = (NSNumber*) args[@"fromValue"]; + NSNumber* toValue = (NSNumber*) args[@"toValue"]; + NSNumber* repeatCount = (NSNumber*) args[@"repeatCount"]; + NSNumber* repeatMode = (NSNumber*) args[@"repeatMode"]; + + UIView *target = (UIView *) args[@"__this__"]; + if (target != nil && (NSNull*) target != [NSNull null]) { + CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"]; + animation.fromValue = fromValue; + animation.toValue = toValue; + animation.duration = [duration doubleValue]; + animation.autoreverses = [repeatMode intValue] == 0 ? NO : YES; + animation.repeatCount = [repeatCount intValue] == 0 ? MAXFLOAT : [repeatCount intValue]; + animation.removedOnCompletion = NO; + animation.fillMode = kCAFillModeForwards; + [target.layer addAnimation:animation forKey:@"rotation"]; + + methodResult(@"success"); + } else { + methodResult([FlutterError errorWithCode:@"目标对象为nul" + message:@"目标对象为nul" + details:@"目标对象为nul"]); + } + } else if ([@"UIView::groupWithDuration" isEqualToString:method]) { + NSNumber* duration = (NSNumber*) args[@"duration"]; + NSArray* fromValue = (NSArray*) args[@"fromValue"]; + NSArray* toValue = (NSArray*) args[@"toValue"]; + NSArray* keyPath = (NSArray*) args[@"keyPath"]; + NSNumber* repeatCount = (NSNumber*) args[@"repeatCount"]; + NSNumber* repeatMode = (NSNumber*) args[@"repeatMode"]; + + UIView *target = (UIView *) args[@"__this__"]; + if (target != nil && (NSNull*) target != [NSNull null]) { + NSMutableArray* animations = [NSMutableArray arrayWithCapacity:[fromValue count]]; + + for (NSUInteger i = 0; i < animations.count; i++) { + CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:keyPath[i]]; + animation.fromValue = fromValue[i]; + animation.toValue = toValue[i]; + + [animations addObject:animation]; + } + + CAAnimationGroup *group = [CAAnimationGroup animation]; + group.duration = [duration doubleValue]; + group.autoreverses = [repeatMode intValue] == 0 ? NO : YES; + group.repeatCount = [repeatCount intValue] == 0 ? MAXFLOAT : [repeatCount intValue]; + group.removedOnCompletion = NO; + group.fillMode = kCAFillModeForwards; + [group setAnimations:animations]; + + [target.layer addAnimation:group forKey:@"group"]; + + methodResult(@"success"); + } else { + methodResult([FlutterError errorWithCode:@"目标对象为nul" + message:@"目标对象为nul" + details:@"目标对象为nul"]); + } + } else { + methodResult(FlutterMethodNotImplemented); + } +} diff --git a/ios/Classes/platform_view/UIViewFactory.h b/ios/Classes/platform_view/UIViewFactory.h new file mode 100644 index 0000000..ab53060 --- /dev/null +++ b/ios/Classes/platform_view/UIViewFactory.h @@ -0,0 +1,29 @@ +// +// UIViewFactory.h +// foundation_fluttify +// +// Created by Yohom Bao on 2020/4/17. +// + +#import +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface UIViewFactory : NSObject + +- (instancetype)initWithRegistrar:(NSObject *)registrar; + +@property(nonatomic) NSObject* registrar; + +@end + +@interface UIViewPlatformView : NSObject + +- (instancetype)initWithViewId:(int64_t)viewId frame:(CGRect)frame registrar:(NSObject *)registrar; + +@property(nonatomic) NSObject* registrar; + +@end + +NS_ASSUME_NONNULL_END diff --git a/ios/Classes/platform_view/UIViewFactory.m b/ios/Classes/platform_view/UIViewFactory.m new file mode 100644 index 0000000..c96711d --- /dev/null +++ b/ios/Classes/platform_view/UIViewFactory.m @@ -0,0 +1,60 @@ +// +// UIViewFactory.m +// foundation_fluttify +// +// Created by Yohom Bao on 2020/4/17. +// + +#import "UIViewFactory.h" +#import "FoundationFluttifyPlugin.h" + +// Dart端随机存取对象的容器 +extern NSMutableDictionary *HEAP; + +@implementation UIViewFactory { +} + +- (instancetype)initWithRegistrar:(NSObject *)registrar { + self = [super init]; + if (self) { + _registrar = registrar; + } + + return self; +} + +- (NSObject *)createWithFrame:(CGRect)frame viewIdentifier:(int64_t)viewId arguments:(id _Nullable)args { + return [[UIViewPlatformView alloc] initWithViewId:viewId frame: frame registrar:_registrar]; +} + +@end + +@implementation UIViewPlatformView { + int64_t _viewId; + CGRect _frame; + UIView* _view; +} + +- (instancetype)initWithViewId:(int64_t)viewId frame:(CGRect)frame registrar:(NSObject *)registrar { + self = [super init]; + if (self) { + _viewId = viewId; + _registrar = registrar; + _frame = frame; + } + + return self; +} + +- (UIView *)view { + if (_view == nil) { + _view = [[UIView alloc] initWithFrame:_frame]; + } + // 这里用一个magic number调整一下id + HEAP[[NSString stringWithFormat:@"%@", @(2147483647 - _viewId)]] = _view; + HEAP[[NSString stringWithFormat:@"%@:%@", @"UIView", @(_view.hash)]] = _view; + return _view; +} + +@end + diff --git a/ios/foundation_fluttify.podspec b/ios/foundation_fluttify.podspec new file mode 100644 index 0000000..b719bc4 --- /dev/null +++ b/ios/foundation_fluttify.podspec @@ -0,0 +1,24 @@ +# +# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html +# +Pod::Spec.new do |s| + s.name = 'foundation_fluttify' + s.version = '0.0.1' + s.summary = 'A new Flutter project.' + s.description = <<-DESC +A new Flutter project. + DESC + s.homepage = 'http://example.com' + s.license = { :file => '../LICENSE' } + s.author = { 'Your Company' => 'email@example.com' } + s.source = { :path => '.' } + s.source_files = 'Classes/**/*' + s.public_header_files = 'Classes/**/*.h' + s.dependency 'Flutter' + + s.ios.deployment_target = '8.0' + s.static_framework = true + # 系统framework + s.frameworks = [] +end + diff --git a/lib/foundation_fluttify.dart b/lib/foundation_fluttify.dart new file mode 100644 index 0000000..28a2e10 --- /dev/null +++ b/lib/foundation_fluttify.dart @@ -0,0 +1,82 @@ +library foundation_fluttify; + +export 'src/extension/image_provider.x.dart'; +export 'src/function/functions.dart'; +export 'src/object/obejcts.dart'; +export 'src/type/core/array.dart'; +export 'src/type/core/broadcast_event_channel.dart'; +export 'src/type/core/fluttify_message_codec.dart'; +export 'src/type/core/ref.dart'; +export 'src/type/core/typedefs.dart'; +export 'src/type/platform/android_type/android/app/activity.dart'; +export 'src/type/platform/android_type/android/app/application.dart'; +export 'src/type/platform/android_type/android/app/notification.dart'; +export 'src/type/platform/android_type/android/app/pending_intent.dart'; +export 'src/type/platform/android_type/android/content/broadcast_receiver.dart'; +export 'src/type/platform/android_type/android/content/content_provider.dart'; +export 'src/type/platform/android_type/android/content/context.dart'; +export 'src/type/platform/android_type/android/content/intent.dart'; +export 'src/type/platform/android_type/android/content/intent_filter.dart'; +export 'src/type/platform/android_type/android/graphics/bitmap.dart'; +export 'src/type/platform/android_type/android/graphics/drawable/drawable.dart'; +export 'src/type/platform/android_type/android/graphics/point.dart'; +export 'src/type/platform/android_type/android/graphics/point_f.dart'; +export 'src/type/platform/android_type/android/location/location.dart'; +export 'src/type/platform/android_type/android/opengl/gl_surface_view.dart'; +export 'src/type/platform/android_type/android/os/binder.dart'; +export 'src/type/platform/android_type/android/os/bundle.dart'; +export 'src/type/platform/android_type/android/os/parcelable.dart'; +export 'src/type/platform/android_type/android/util/pair.dart'; +export 'src/type/platform/android_type/android/view/motion_event.dart'; +export 'src/type/platform/android_type/android/view/surface_holder.dart'; +export 'src/type/platform/android_type/android/view/surface_view.dart'; +export 'src/type/platform/android_type/android/view/view.dart'; +export 'src/type/platform/android_type/android/view/view_group.dart'; +export 'src/type/platform/android_type/android/widget/frame_layout.dart'; +export 'src/type/platform/android_type/android/widget/image_view.dart'; +export 'src/type/platform/android_type/android/widget/linear_layout.dart'; +export 'src/type/platform/android_type/android/widget/relative_layout.dart'; +export 'src/type/platform/android_type/android/widget/text_view.dart'; +export 'src/type/platform/android_type/java/io/closeable.dart'; +export 'src/type/platform/android_type/java/io/file.dart'; +export 'src/type/platform/android_type/java/io/serializable.dart'; +export 'src/type/platform/android_type/java/lang/object.dart'; +export 'src/type/platform/android_type/java/lang/throwable.dart'; +export 'src/type/platform/android_type/org/json/json_object.dart'; +export 'src/type/platform/ios_type/av_audio_session_category_options.dart'; +export 'src/type/platform/ios_type/ca_action.dart'; +export 'src/type/platform/ios_type/ca_animation.dart'; +export 'src/type/platform/ios_type/ca_basic_animation.dart'; +export 'src/type/platform/ios_type/ca_media_timing.dart'; +export 'src/type/platform/ios_type/ca_property_animation.dart'; +export 'src/type/platform/ios_type/cg_point.dart'; +export 'src/type/platform/ios_type/cg_rect.dart'; +export 'src/type/platform/ios_type/cg_size.dart'; +export 'src/type/platform/ios_type/ns_coding.dart'; +export 'src/type/platform/ios_type/ns_copying.dart'; +export 'src/type/platform/ios_type/ns_data.dart'; +export 'src/type/platform/ios_type/ns_date.dart'; +export 'src/type/platform/ios_type/ns_error.dart'; +export 'src/type/platform/ios_type/ns_mutable_copying.dart'; +export 'src/type/platform/ios_type/ns_object.dart'; +export 'src/type/platform/ios_type/ns_operation.dart'; +export 'src/type/platform/ios_type/ns_url.dart'; +export 'src/type/platform/ios_type/ns_user_activity.dart'; +export 'src/type/platform/ios_type/ns_value.dart'; +export 'src/type/platform/ios_type/ui_application.dart'; +export 'src/type/platform/ios_type/ui_application_shortcut_item.dart'; +export 'src/type/platform/ios_type/ui_bar_style.dart'; +export 'src/type/platform/ios_type/ui_color.dart'; +export 'src/type/platform/ios_type/ui_control.dart'; +export 'src/type/platform/ios_type/ui_edge_insets.dart'; +export 'src/type/platform/ios_type/ui_image.dart'; +export 'src/type/platform/ios_type/ui_image_view.dart'; +export 'src/type/platform/ios_type/ui_status_bar_style.dart'; +export 'src/type/platform/ios_type/ui_user_notification_settings.dart'; +export 'src/type/platform/ios_type/ui_view.dart'; +export 'src/type/platform/ios_type/ui_view_controller.dart'; +export 'src/type/widget/android_opengl_GLSurfaceView.widget.dart'; +export 'src/type/widget/android_view_SurfaceView.widget.dart'; +export 'src/type/widget/android_widget_FrameLayout.widget.dart'; +export 'src/type/widget/scoped_release_pool.widget.dart'; +export 'src/type/widget/ui_view.widget.dart'; diff --git a/lib/src/extension/image_provider.x.dart b/lib/src/extension/image_provider.x.dart new file mode 100644 index 0000000..3054fdd --- /dev/null +++ b/lib/src/extension/image_provider.x.dart @@ -0,0 +1,36 @@ +import 'dart:async'; +import 'dart:typed_data'; +import 'dart:ui'; + +import 'package:flutter/material.dart'; + +Map _cache = {}; + +extension ImageProviderX on ImageProvider { + Future toImageData(ImageConfiguration config) async { + final completer = Completer(); + final key = await obtainKey(config); + if (_cache.containsKey(key.toString())) { + debugPrint('命中缓存'); + completer.complete(_cache[key.toString()]); + } else { + late ImageStreamListener listener; + ImageStream stream = resolve(config); //获取图片流 + listener = ImageStreamListener((imageInfo, sync) async { + final byteData = + await imageInfo.image.toByteData(format: ImageByteFormat.png); + final result = byteData?.buffer.asUint8List(); + if (result != null) { + _cache[key.toString()] = result; + } + + if (!completer.isCompleted) completer.complete(result); + + stream.removeListener(listener); //移除监听 + }); + stream.addListener(listener); + } + + return completer.future; + } +} diff --git a/lib/src/function/functions.dart b/lib/src/function/functions.dart new file mode 100644 index 0000000..9528966 --- /dev/null +++ b/lib/src/function/functions.dart @@ -0,0 +1,255 @@ +import 'dart:async'; +import 'dart:io'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/foundation.dart'; + +import '../../foundation_fluttify.dart'; + +typedef _FutureCallback = Future Function(Set releasePool); + +bool _enableFluttifyLog = true; +Future enableFluttifyLog(bool enable) { + _enableFluttifyLog = enable; + return kMethodChannel.invokeMethod('PlatformService::enableLog', { + 'enable': enable, + }); +} + +bool get fluttifyLogEnabled => _enableFluttifyLog; + +Future platform({ + _FutureCallback? android, + _FutureCallback? ios, +}) async { + // 方法单位的释放池, 如果需要的时候可以在这里直接释放, 不使用这个释放池的话可以使用[ScopedReleasePool] + final releasePool = {}; + try { + if (android != null && Platform.isAndroid) { + return await android(releasePool); + } else if (ios != null && Platform.isIOS) { + return await ios(releasePool); + } else { + return Future.value(); + } + } catch (e) { + return Future.error(e); + } finally { + if (releasePool.isNotEmpty) { + await releasePool.whereType().release_batch(); + releasePool.clear(); + // remove all local object from global object pool + gGlobalReleasePool.removeAll(releasePool); + } + } +} + +Future clearHeap() async { + await kMethodChannel.invokeMethod('PlatformService::clearHeap'); +} + +Future pushStack(String name, Ref ref) async { + await kMethodChannel.invokeMethod( + 'PlatformService::pushStack', + {'name': name, '__this__': ref}, + ); +} + +Future pushStackJsonable(String name, dynamic jsonable) async { + await kMethodChannel.invokeMethod('PlatformService::pushStackJsonable', { + 'name': name, + 'data': jsonable, + }); +} + +Future clearStack() async { + await kMethodChannel.invokeMethod('PlatformService::clearStack'); +} + +Future setupOrientationSensor() async { + await kMethodChannel.invokeMethod('PlatformService::setupOrientationSensor'); +} + +Future startActivity( + String activityClass, { + Map extras = const {}, +}) async { + assert(activityClass.isNotEmpty); + await kMethodChannel.invokeMethod( + 'PlatformService::startActivity', + {'activityClass': activityClass, 'extras': extras}, + ); +} + +Future startActivityForResult( + String activityClass, { + required int requestCode, + Map extras = const {}, +}) async { + assert(activityClass.isNotEmpty); + final result = await kMethodChannel.invokeMethod( + 'PlatformService::startActivityForResult', + { + 'activityClass': activityClass, + 'extras': extras, + 'requestCode': requestCode, + }, + ); + return android_content_Intent() + ..refId = result + ..tag__ = 'platform'; +} + +Future presentViewController( + String viewControllerClass, { + bool withNavigationController = false, +}) async { + assert(viewControllerClass.isNotEmpty); + await kMethodChannel.invokeMethod( + 'PlatformService::presentViewController', + { + 'viewControllerClass': viewControllerClass, + 'withNavigationController': withNavigationController, + }, + ); +} + +/// viewId转换为refId +/// +/// 使用这个方法前, 保存PlatformView是把viewId作为key保存在Map中, 带来了不一致性. +/// 使用这个方法把viewId转换为对应PlatformView对象的refId, 使其与普通对象的行为保持一致. +Future viewId2RefId(String viewId) async { + return kMethodChannel.invokeMethod( + 'PlatformService::viewId2RefId', + {'viewId': viewId}, + ); +} + +/// 不怎么好用 +@deprecated +Future getAssetPath(String flutterAssetPath) async { + return kMethodChannel.invokeMethod( + 'PlatformService::getAssetPath', + {'flutterAssetPath': flutterAssetPath}, + ); +} + +void log(String content) { + if (fluttifyLogEnabled) debugPrint(content); +} + +T? FoundationFluttifyAndroidAs(dynamic __this__) { + if (T == android_content_Context) { + return (android_content_Context()..refId = (__this__ as Ref).refId) as T; + } else if (T == android_content_Intent) { + return (android_content_Intent()..refId = (__this__ as Ref).refId) as T; + } else if (T == android_content_ContentProvider) { + return (android_content_ContentProvider()..refId = (__this__ as Ref).refId) + as T; + } else if (T == android_app_Application) { + return (android_app_Application()..refId = (__this__ as Ref).refId) as T; + } else if (T == android_app_Notification) { + return (android_app_Notification()..refId = (__this__ as Ref).refId) as T; + } else if (T == android_app_Activity) { + return (android_app_Activity()..refId = (__this__ as Ref).refId) as T; + } else if (T == android_app_PendingIntent) { + return (android_app_PendingIntent()..refId = (__this__ as Ref).refId) as T; + } else if (T == android_os_Bundle) { + return (android_os_Bundle()..refId = (__this__ as Ref).refId) as T; + } else if (T == android_os_Binder) { + return (android_os_Binder()..refId = (__this__ as Ref).refId) as T; + } else if (T == android_view_View) { + return (android_view_View()..refId = (__this__ as Ref).refId) as T; + } else if (T == android_view_SurfaceView) { + return (android_view_SurfaceView()..refId = (__this__ as Ref).refId) as T; + } else if (T == android_view_SurfaceHolder) { + return (android_view_SurfaceHolder.subInstance() + ..refId = (__this__ as Ref).refId) as T; + } else if (T == android_opengl_GLSurfaceView) { + return (android_opengl_GLSurfaceView()..refId = (__this__ as Ref).refId) + as T; + } else if (T == android_view_View_OnApplyWindowInsetsListener) { + return (android_view_View_OnApplyWindowInsetsListener.subInstance() + ..refId = (__this__ as Ref).refId) as T; + } else if (T == android_view_ViewGroup) { + return (android_view_ViewGroup()..refId = (__this__ as Ref).refId) as T; + } else if (T == android_graphics_Point) { + return (android_graphics_Point()..refId = (__this__ as Ref).refId) as T; + } else if (T == android_graphics_PointF) { + return (android_graphics_PointF()..refId = (__this__ as Ref).refId) as T; + } else if (T == android_graphics_Bitmap) { + return (android_graphics_Bitmap()..refId = (__this__ as Ref).refId) as T; + } else if (T == android_widget_ImageView) { + return (android_widget_ImageView()..refId = (__this__ as Ref).refId) as T; + } else if (T == java_io_Serializable) { + return (java_io_Serializable.subInstance()..refId = (__this__ as Ref).refId) + as T; + } else if (T == java_io_File) { + return (java_io_File()..refId = (__this__ as Ref).refId) as T; + } else if (T == android_location_Location) { + return (android_location_Location()..refId = (__this__ as Ref).refId) as T; + } else if (T == android_view_MotionEvent) { + return (android_view_MotionEvent()..refId = (__this__ as Ref).refId) as T; + } else if (T == android_graphics_drawable_Drawable) { + return (android_graphics_drawable_Drawable() + ..refId = (__this__ as Ref).refId) as T; + } else if (T == android_widget_FrameLayout) { + return (android_widget_FrameLayout()..refId = (__this__ as Ref).refId) as T; + } else if (T == android_widget_TextView) { + return (android_widget_TextView()..refId = (__this__ as Ref).refId) as T; + } else if (T == android_widget_LinearLayout) { + return (android_widget_LinearLayout()..refId = (__this__ as Ref).refId) + as T; + } else if (T == android_widget_RelativeLayout) { + return (android_widget_RelativeLayout()..refId = (__this__ as Ref).refId) + as T; + } else if (T == android_os_Parcelable) { + return (android_os_Parcelable.subInstance() + ..refId = (__this__ as Ref).refId) as T; + } else if (T == android_util_Pair) { + return (android_util_Pair()..refId = (__this__ as Ref).refId) as T; + } else { + return null; + } +} + +T? FoundationFluttifyIOSAs(dynamic __this__) { + if (T == CGRect) { + return (CGRect()..refId = (__this__ as Ref).refId) as T; + } else if (T == CGPoint) { + return (CGPoint()..refId = (__this__ as Ref).refId) as T; + } else if (T == CGSize) { + return (CGSize()..refId = (__this__ as Ref).refId) as T; + } else if (T == UIEdgeInsets) { + return (UIEdgeInsets()..refId = (__this__ as Ref).refId) as T; + } else if (T == NSError) { + return (NSError()..refId = (__this__ as Ref).refId) as T; + } else if (T == NSCoding) { + return (NSCoding.subInstance()..refId = (__this__ as Ref).refId) as T; + } else if (T == NSCopying) { + return (NSCopying.subInstance()..refId = (__this__ as Ref).refId) as T; + } else if (T == NSMutableCopying) { + return (NSMutableCopying.subInstance()..refId = (__this__ as Ref).refId) + as T; + } else if (T == UIView) { + return (UIView()..refId = (__this__ as Ref).refId) as T; + } else if (T == UIViewController) { + return (UIViewController()..refId = (__this__ as Ref).refId) as T; + } else if (T == UIControl) { + return (UIControl()..refId = (__this__ as Ref).refId) as T; + } else if (T == UIImage) { + return (UIImage()..refId = (__this__ as Ref).refId) as T; + } else if (T == UIImageView) { + return (UIImageView()..refId = (__this__ as Ref).refId) as T; + } else if (T == UIColor) { + return (UIColor()..refId = (__this__ as Ref).refId) as T; + } else if (T == NSData) { + return (NSData()..refId = (__this__ as Ref).refId) as T; + } else if (T == NSDate) { + return (NSDate()..refId = (__this__ as Ref).refId) as T; + } else if (T == NSOperation) { + return (NSOperation()..refId = (__this__ as Ref).refId) as T; + } else { + return null; + } +} diff --git a/lib/src/object/obejcts.dart b/lib/src/object/obejcts.dart new file mode 100644 index 0000000..a1bdf00 --- /dev/null +++ b/lib/src/object/obejcts.dart @@ -0,0 +1,197 @@ +import 'package:flutter/services.dart'; +import 'package:foundation_fluttify/foundation_fluttify.dart'; +import 'package:foundation_fluttify/src/type/core/ref.dart'; +import 'package:foundation_fluttify/src/type/core/stack.dart'; +import 'package:foundation_fluttify/src/type/core/typedefs.dart'; + +/// native object release pool, all objects returned by the native side will be in this set +final gGlobalReleasePool = {}; + +final gReleasePoolStack = Stack(); + +const kMethodChannelName = 'com.fluttify/foundation_method'; +const kMethodCodec = StandardMethodCodec(FluttifyMessageCodec()); +final kMethodChannel = MethodChannel(kMethodChannelName, kMethodCodec) + ..setMethodCallHandler((call) async { + final method = call.method; + final arguments = call.arguments as Map; + + final application = UIApplication()..refId = arguments['application']; + switch (method) { + case 'applicationDidFinishLaunchingWithOptions': + if (applicationDidFinishLaunchingWithOptions != null) { + final launchOptions = arguments['launchOptions'] as Map; + applicationDidFinishLaunchingWithOptions!(application, launchOptions); + } + break; + case 'applicationWillFinishLaunchingWithOptions': + if (applicationWillFinishLaunchingWithOptions != null) { + final launchOptions = arguments['launchOptions'] as Map; + applicationWillFinishLaunchingWithOptions!( + application, launchOptions); + } + break; + case 'applicationDidBecomeActive': + if (applicationDidBecomeActive != null) { + applicationDidBecomeActive!(application); + } + break; + case 'applicationWillResignActive': + if (applicationWillResignActive != null) { + applicationWillResignActive!(application); + } + break; + case 'applicationDidEnterBackground': + if (applicationDidEnterBackground != null) { + applicationDidEnterBackground!(application); + } + break; + case 'applicationWillEnterForeground': + if (applicationWillEnterForeground != null) { + applicationWillEnterForeground!(application); + } + break; + case 'applicationWillTerminate': + if (applicationWillTerminate != null) { + applicationWillTerminate!(application); + } + break; + case 'applicationDidRegisterUserNotificationSettings': + if (applicationDidRegisterUserNotificationSettings != null) { + final notificationSettings = UIUserNotificationSettings() + ..refId = arguments['notificationSettings']; + + applicationDidRegisterUserNotificationSettings!( + application, notificationSettings); + } + break; + case 'applicationDidRegisterForRemoteNotificationsWithDeviceToken': + if (applicationDidRegisterForRemoteNotificationsWithDeviceToken != + null) { + final deviceToken = NSData()..refId = arguments['deviceToken']; + + applicationDidRegisterForRemoteNotificationsWithDeviceToken!( + application, deviceToken); + } + break; + case 'applicationDidReceiveRemoteNotificationFetchCompletionHandler': + if (applicationDidReceiveRemoteNotificationFetchCompletionHandler != + null) { + final userInfo = arguments['userInfo'] as Map; + applicationDidReceiveRemoteNotificationFetchCompletionHandler!( + application, userInfo); + } + break; + case 'applicationOpenURLOptions': + if (applicationOpenURLOptions != null) { + final url = NSURL()..refId = arguments['url']; + final options = (arguments['options'] as Map).cast(); + applicationOpenURLOptions!(application, url, options); + } + break; + case 'applicationHandleOpenURL': + if (applicationHandleOpenURL != null) { + final url = NSURL()..refId = arguments['url']; + applicationHandleOpenURL!(application, url); + } + break; + case 'applicationOpenURLSourceApplicationAnnotation': + if (applicationOpenURLSourceApplicationAnnotation != null) { + final openURL = NSURL()..refId = arguments['openURL']; + final sourceApplication = arguments['sourceApplication'] as String; + final annotation = NSObject()..refId = arguments['annotation']; + + applicationOpenURLSourceApplicationAnnotation!( + application, + openURL, + sourceApplication, + annotation, + ); + } + break; + case 'applicationPerformActionForShortcutItemCompletionHandler': + if (applicationPerformActionForShortcutItemCompletionHandler != null) { + final shortcutItem = UIApplicationShortcutItem() + ..refId = arguments['shortcutItem']; + + applicationPerformActionForShortcutItemCompletionHandler!( + application, shortcutItem); + } + break; + case 'applicationHandleEventsForBackgroundURLSessionCompletionHandler': + if (applicationHandleEventsForBackgroundURLSessionCompletionHandler != + null) { + final identifier = arguments['identifier'] as String; + + applicationHandleEventsForBackgroundURLSessionCompletionHandler!( + application, identifier); + } + break; + case 'applicationPerformFetchWithCompletionHandler': + applicationPerformFetchWithCompletionHandler?.call(application); + + break; + case 'applicationContinueUserActivityRestorationHandler': + if (applicationContinueUserActivityRestorationHandler != null) { + final userActivity = NSUserActivity() + ..refId = arguments['userActivity']; + + applicationContinueUserActivityRestorationHandler!( + application, userActivity); + } + break; + default: + return Future.error('not implemented'); + } + }); + +const kBroadcastEventChannelName = 'com.fluttify/foundation_broadcast_event'; +const kBroadcastEventChannel = + FluttifyBroadcastEventChannel(kBroadcastEventChannelName); + +const kSensorEventChannelName = 'com.fluttify/foundation_sensor_event'; +const kSensorEventChannel = EventChannel(kSensorEventChannelName); + +ApplicationDidFinishLaunchingWithOptions? + applicationDidFinishLaunchingWithOptions; + +ApplicationWillFinishLaunchingWithOptions? + applicationWillFinishLaunchingWithOptions; + +ApplicationDidBecomeActive? applicationDidBecomeActive; + +ApplicationWillResignActive? applicationWillResignActive; + +ApplicationDidEnterBackground? applicationDidEnterBackground; + +ApplicationWillEnterForeground? applicationWillEnterForeground; + +ApplicationWillTerminate? applicationWillTerminate; + +ApplicationDidRegisterUserNotificationSettings? + applicationDidRegisterUserNotificationSettings; + +ApplicationDidRegisterForRemoteNotificationsWithDeviceToken? + applicationDidRegisterForRemoteNotificationsWithDeviceToken; + +ApplicationDidReceiveRemoteNotificationFetchCompletionHandler? + applicationDidReceiveRemoteNotificationFetchCompletionHandler; + +ApplicationOpenURLOptions? applicationOpenURLOptions; + +ApplicationHandleOpenURL? applicationHandleOpenURL; + +ApplicationOpenURLSourceApplicationAnnotation? + applicationOpenURLSourceApplicationAnnotation; + +ApplicationPerformActionForShortcutItemCompletionHandler? + applicationPerformActionForShortcutItemCompletionHandler; + +ApplicationHandleEventsForBackgroundURLSessionCompletionHandler? + applicationHandleEventsForBackgroundURLSessionCompletionHandler; + +ApplicationPerformFetchWithCompletionHandler? + applicationPerformFetchWithCompletionHandler; + +ApplicationContinueUserActivityRestorationHandler? + applicationContinueUserActivityRestorationHandler; diff --git a/lib/src/type/core/array.dart b/lib/src/type/core/array.dart new file mode 100644 index 0000000..1ed4456 --- /dev/null +++ b/lib/src/type/core/array.dart @@ -0,0 +1,5 @@ +class Array { + Array.ofList(this.data); + + final List data; +} diff --git a/lib/src/type/core/broadcast_event_channel.dart b/lib/src/type/core/broadcast_event_channel.dart new file mode 100644 index 0000000..0f2507c --- /dev/null +++ b/lib/src/type/core/broadcast_event_channel.dart @@ -0,0 +1,13 @@ +import 'package:flutter/services.dart'; +import 'package:foundation_fluttify/src/type/platform/android_type/android/content/intent.dart'; + +class FluttifyBroadcastEventChannel extends EventChannel { + const FluttifyBroadcastEventChannel(String name) : super(name); + + @override + Stream receiveBroadcastStream([dynamic arguments]) { + return super + .receiveBroadcastStream(arguments) + .map((event) => android_content_Intent()..refId = event); + } +} diff --git a/lib/src/type/core/fluttify_message_codec.dart b/lib/src/type/core/fluttify_message_codec.dart new file mode 100644 index 0000000..ae5fa08 --- /dev/null +++ b/lib/src/type/core/fluttify_message_codec.dart @@ -0,0 +1,210 @@ +import 'dart:convert'; +import 'dart:io'; +import 'dart:typed_data'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; +import 'package:foundation_fluttify/foundation_fluttify.dart'; +import 'package:foundation_fluttify/src/type/core/array.dart'; + +class FluttifyMessageCodec extends StandardMessageCodec { + const FluttifyMessageCodec({ + this.tag, + this.androidCaster, + this.iosCaster, + }); + + final String? tag; + + /// 外部传入造型回调, 自动把Ref转换为目标对象 + /// foundation内部还是手动处理 + final dynamic Function(dynamic ref, String typeName)? androidCaster; + final dynamic Function(dynamic ref, String typeName)? iosCaster; + + static const int _valueNull = 0; + static const int _valueTrue = 1; + static const int _valueFalse = 2; + static const int _valueInt32 = 3; + static const int _valueInt64 = 4; + static const int _valueLargeInt = 5; + static const int _valueFloat64 = 6; + static const int _valueString = 7; + static const int _valueUint8List = 8; + static const int _valueInt32List = 9; + static const int _valueInt64List = 10; + static const int _valueFloat64List = 11; + static const int _valueList = 12; + static const int _valueMap = 13; + // Fluttify使用 Android only + static const int _valueArray = 125; + // Fluttify使用 + static const int _valueEnum = 126; + // 虽然dart端说明自定义类型要用128以上的值, 但是Java那边是用byte接收, 128已经超出, 所以 + // 这里直接使用127了, 肯定不会与flutter本身的类型冲突 + static const int _valueRef = 127; + + @override + void writeValue(WriteBuffer buffer, dynamic value) { + if (value == null || (value is Ref && value.refId == null)) { + buffer.putUint8(_valueNull); + } else if (value is bool) { + buffer.putUint8(value ? _valueTrue : _valueFalse); + } else if (value is double) { + // Double precedes int because in JS everything is a double. + // Therefore in JS, both `is int` and `is double` always + // return `true`. If we check int first, we'll end up treating + // all numbers as ints and attempt the int32/int64 conversion, + // which is wrong. This precedence rule is irrelevant when + // decoding because we use tags to detect the type of value. + buffer.putUint8(_valueFloat64); + buffer.putFloat64(value); + } else if (value is int) { + if (-0x7fffffff - 1 <= value && value <= 0x7fffffff) { + buffer.putUint8(_valueInt32); + buffer.putInt32(value); + } else { + buffer.putUint8(_valueInt64); + buffer.putInt64(value); + } + } else if (value is String) { + buffer.putUint8(_valueString); + final Uint8List bytes = utf8.encoder.convert(value); + writeSize(buffer, bytes.length); + buffer.putUint8List(bytes); + } else if (value is Uint8List) { + buffer.putUint8(_valueUint8List); + writeSize(buffer, value.length); + buffer.putUint8List(value); + } else if (value is Int32List) { + buffer.putUint8(_valueInt32List); + writeSize(buffer, value.length); + buffer.putInt32List(value); + } else if (value is Int64List) { + buffer.putUint8(_valueInt64List); + writeSize(buffer, value.length); + buffer.putInt64List(value); + } else if (value is Float64List) { + buffer.putUint8(_valueFloat64List); + writeSize(buffer, value.length); + buffer.putFloat64List(value); + } else if (value is Array) { + buffer.putUint8(_valueArray); + writeSize(buffer, value.data.length); + for (final dynamic item in value.data) { + writeValue(buffer, item); + } + } else if (value is Iterable) { + buffer.putUint8(_valueList); + writeSize(buffer, value.length); + for (final dynamic item in value) { + writeValue(buffer, item); + } + } else if (value is Map) { + buffer.putUint8(_valueMap); + writeSize(buffer, value.length); + value.forEach((dynamic key, dynamic value) { + writeValue(buffer, key); + writeValue(buffer, value); + }); + } + // 以下为fluttify增加的类型 + // 枚举 传递索引值 + else if (value is Enum) { + buffer.putUint8(_valueEnum); + buffer.putInt32(value.index); + } + // fluttify Ref类 + else if (value is Ref) { + buffer.putUint8(_valueRef); + final Uint8List bytes = utf8.encoder.convert(value.refId!); + writeSize(buffer, bytes.length); + buffer.putUint8List(bytes); + } else { + throw ArgumentError.value(value); + } + } + + @override + dynamic readValueOfType(int type, ReadBuffer buffer) { + switch (type) { + case _valueNull: + return null; + case _valueTrue: + return true; + case _valueFalse: + return false; + case _valueInt32: + return buffer.getInt32(); + case _valueInt64: + return buffer.getInt64(); + case _valueFloat64: + return buffer.getFloat64(); + case _valueLargeInt: + case _valueString: + final int length = readSize(buffer); + return utf8.decoder.convert(buffer.getUint8List(length)); + case _valueUint8List: + final int length = readSize(buffer); + return buffer.getUint8List(length); + case _valueInt32List: + final int length = readSize(buffer); + return buffer.getInt32List(length); + case _valueInt64List: + final int length = readSize(buffer); + return buffer.getInt64List(length); + case _valueFloat64List: + final int length = readSize(buffer); + return buffer.getFloat64List(length); + case _valueArray: + final int length = readSize(buffer); + final dynamic result = + List.filled(length, null, growable: false); + for (int i = 0; i < length; i++) { + result[i] = readValue(buffer); + } + return result; + case _valueList: + final int length = readSize(buffer); + final dynamic result = + List.filled(length, null, growable: false); + for (int i = 0; i < length; i++) { + result[i] = readValue(buffer); + } + return result; + case _valueMap: + final int length = readSize(buffer); + final dynamic result = {}; + for (int i = 0; i < length; i++) { + result[readValue(buffer)] = readValue(buffer); + } + return result; + case _valueEnum: + return buffer.getInt32(); + case _valueRef: + final int length = readSize(buffer); + final String refId = utf8.decoder.convert(buffer.getUint8List(length)); + + Ref ref = Ref() + ..refId = refId + ..tag__ = tag; + if (Platform.isAndroid && androidCaster != null) { + ref = androidCaster!(ref, refId.split(':')[0]); + } else if (Platform.isIOS && iosCaster != null) { + ref = iosCaster!(ref, refId.split(':')[0]); + } + + // 如果有ScopedReleasePool, 则使用ScopedReleasePool里的释放池 + // 否则使用全局的释放池 + if (gReleasePoolStack.peek() != null) { + log('添加对象 $ref 到局部释放池'); + gReleasePoolStack.peek()?.add(ref); + } else { + log('添加对象 $ref 到全局释放池'); + gGlobalReleasePool.add(ref); + } + return ref; + default: + throw const FormatException('Message corrupted'); + } + } +} diff --git a/lib/src/type/core/ref.dart b/lib/src/type/core/ref.dart new file mode 100644 index 0000000..6ce3656 --- /dev/null +++ b/lib/src/type/core/ref.dart @@ -0,0 +1,195 @@ +import 'package:foundation_fluttify/src/object/obejcts.dart'; + +class Ref { + /// unique id of native side counterpart object + String? refId; + + /// custom tag + String? tag__; + + /// 释放当前引用对象 + Future release__() async { + // 这里使用refId去删除元素, 因为PlatformView和普通对象的键不同, 不是hashCode, 原生端不能 + // 通过获取hash的方式删除元素 + await kMethodChannel + .invokeMethod('PlatformService::release', {'__this__': refId}); + } + + Future isNull() { + return kMethodChannel + .invokeMethod('PlatformService::isNull', {'__this__': this}); + } + + /// 通过反射调用方法 + Future performSelectorWithObject__(String selector, Object object) { + return kMethodChannel + .invokeMethod('PlatformService::performSelectorWithObject', { + '__this__': this, + 'selector': selector, + 'object': object, + }); + } + + /// 为类型添加属性 + Future addProperty__(int propertyKey, Ref property) async { + assert(property is Ref); + assert(propertyKey > 0); + return kMethodChannel.invokeMethod('PlatformService::addProperty', { + '__this__': this, + 'propertyKey': propertyKey, + 'property': property, + }); + } + + /// 为类型添加属性 + Future addListProperty__(int propertyKey, List property) async { + assert(propertyKey > 0); + return kMethodChannel.invokeMethod('PlatformService::addListProperty', { + '__this__': this, + 'propertyKey': propertyKey, + 'property': property, + }); + } + + /// 获取添加字段的值 + Future getProperty__(int propertyKey) async { + assert(propertyKey > 0); + final result = + await kMethodChannel.invokeMethod('PlatformService::getProperty', { + '__this__': this, + 'propertyKey': propertyKey, + }); + return Ref()..refId = result; + } + + /// 为类型添加jsonable属性 + Future addJsonableProperty__(int propertyKey, Object property) async { + assert(propertyKey > 0); + assert(property is String || + property is int || + property is double || + property is Map || + property is List || + property is bool); + return kMethodChannel.invokeMethod('PlatformService::addJsonableProperty', { + '__this__': this, + 'propertyKey': propertyKey, + 'property': property, + }); + } + + /// 获取添加字段的jsonable值 + Future getJsonableProperty__(int propertyKey) async { + assert(propertyKey > 0); + return kMethodChannel.invokeMethod('PlatformService::getJsonableProperty', { + '__this__': this, + 'propertyKey': propertyKey, + }); + } + + /// 转换为批处理 + List asBatch(int length) { + assert(length > 0); + return List.filled(length, this as T); + } + + @override + bool operator ==(Object other) => + identical(this, other) || + other is Ref && runtimeType == other.runtimeType && refId == other.refId; + + @override + int get hashCode => refId.hashCode; + + @override + String toString() { + return 'Ref{refId: $refId, runtimeType: $runtimeType, tag__: $tag__}'; + } +} + +extension Ref_Batch on Iterable { + // 这里使用refId去删除元素, 因为PlatformView和普通对象的键不同, 不是hashCode, 原生端不能 + // 通过获取hash的方式删除元素 + Future release_batch() async { + return kMethodChannel.invokeMethod( + 'PlatformService::release_batch', + {'__this_batch__': map((e) => e.refId).toList()}, + ); + } +} + +extension RefList_Batch on List { + /// 为类型添加属性 + Future addProperty_batch(int propertyKey, List property) async { + assert(property is List); + return kMethodChannel.invokeMethod( + 'PlatformService::addProperty_batch', + [ + for (int i = 0; i < length; i++) + { + '__this__': this[i], + 'propertyKey': propertyKey, + 'property': property[i], + } + ], + ); + } + + /// 获取添加字段的值 + Future> getProperty_batch(int propertyKey) async { + final List resultBatch = await kMethodChannel.invokeMethod( + 'PlatformService::getProperty_batch', + [ + for (int i = 0; i < length; i++) + { + '__this__': this[i], + 'propertyKey': propertyKey, + } + ], + ); + return resultBatch + .map((refId) => Ref() + ..refId = refId + ..tag__ = 'platform') + .toList(); + } + + /// 为类型添加jsonable属性 + Future addJsonableProperty_batch( + int propertyKey, + List property, + ) async { + assert(property is List || + property is List || + property is List || + property is List || + property is List || + property is List); + return kMethodChannel.invokeMethod( + 'PlatformService::addJsonableProperty_batch', + [ + for (int i = 0; i < length; i++) + { + '__this__': this[i], + 'propertyKey': propertyKey, + 'property': property[i], + } + ], + ); + } + + /// 获取添加字段的jsonable值 + Future> getJsonableProperty_batch(int propertyKey) async { + final List resultBatch = await kMethodChannel.invokeMethod( + 'PlatformService::getJsonableProperty_batch', + [ + for (int i = 0; i < length; i++) + { + '__this__': this[i], + 'propertyKey': propertyKey, + } + ], + ); + return resultBatch; + } +} diff --git a/lib/src/type/core/stack.dart b/lib/src/type/core/stack.dart new file mode 100644 index 0000000..77f6b8c --- /dev/null +++ b/lib/src/type/core/stack.dart @@ -0,0 +1,34 @@ +import 'dart:collection'; + +class Stack { + final ListQueue _list = ListQueue(); + + /// check if the stack is empty. + bool get isEmpty => _list.isEmpty; + + /// check if the stack is not empty. + bool get isNotEmpty => _list.isNotEmpty; + + /// push element in top of the stack. + void push(T e) { + _list.addLast(e); + } + + /// get the top of the stack and delete it. + T pop() { + T res = _list.last; + _list.removeLast(); + return res; + } + + /// get the top of the stack without deleting it. + T? peek() { + if (_list.isEmpty) return null; + return _list.last; + } + + /// get the size of the stack. + int size() { + return _list.length; + } +} diff --git a/lib/src/type/core/typedefs.dart b/lib/src/type/core/typedefs.dart new file mode 100644 index 0000000..54d2cf7 --- /dev/null +++ b/lib/src/type/core/typedefs.dart @@ -0,0 +1,181 @@ +import 'dart:async'; + +import 'package:foundation_fluttify/foundation_fluttify.dart'; +import 'package:foundation_fluttify/src/type/platform/ios_type/ui_application.dart'; + +typedef FutureVoidCallback = Future Function(); +typedef FutureValueChanged = Future Function(T value); +typedef Action0 = FutureOr Function(); +typedef Action1 = FutureOr Function(T arg0); +typedef Action2 = FutureOr Function(T1 arg0, T2 arg1); +typedef Action3 = FutureOr Function( + T1 arg1, T2 arg2, T3 arg3); +typedef Action4 = FutureOr Function( + T1 arg1, + T2 arg2, + T3 arg3, + T4 arg4, +); +typedef Action5 = FutureOr Function( + T1 arg1, + T2 arg2, + T3 arg3, + T4 arg4, + T5 arg5, +); +typedef Action6 = FutureOr Function( + T1 arg1, + T2 arg2, + T3 arg3, + T4 arg4, + T5 arg5, + T6 arg6, +); +typedef Action7 = FutureOr Function( + T1 arg1, + T2 arg2, + T3 arg3, + T4 arg4, + T5 arg5, + T6 arg6, + T7 arg7, +); +typedef Action8 = FutureOr Function( + T1 arg1, + T2 arg2, + T3 arg3, + T4 arg4, + T5 arg5, + T6 arg6, + T7 arg7, + T8 arg8, +); +typedef Action9 = FutureOr Function( + T1 arg1, + T2 arg2, + T3 arg3, + T4 arg4, + T5 arg5, + T6 arg6, + T7 arg7, + T8 arg8, + T9 arg9, +); +typedef Function0 = FutureOr Function(); +typedef Function1 = FutureOr Function(T arg0); +typedef Function2 = FutureOr Function(T1 arg0, T2 arg1); +typedef Function3 = FutureOr Function( + T1 arg1, T2 arg2, T3 arg3); +typedef Function4 = FutureOr Function( + T1 arg1, + T2 arg2, + T3 arg3, + T4 arg4, +); +typedef Function5 = FutureOr Function( + T1 arg1, + T2 arg2, + T3 arg3, + T4 arg4, + T5 arg5, +); +typedef Function6 = FutureOr Function( + T1 arg1, + T2 arg2, + T3 arg3, + T4 arg4, + T5 arg5, + T6 arg6, +); +typedef Function7 = FutureOr Function( + T1 arg1, + T2 arg2, + T3 arg3, + T4 arg4, + T5 arg5, + T6 arg6, + T7 arg7, +); +typedef Function8 = FutureOr Function( + T1 arg1, + T2 arg2, + T3 arg3, + T4 arg4, + T5 arg5, + T6 arg6, + T7 arg7, + T8 arg8, +); +typedef Function9 = FutureOr Function( + T1 arg1, + T2 arg2, + T3 arg3, + T4 arg4, + T5 arg5, + T6 arg6, + T7 arg7, + T8 arg8, + T9 arg9, +); + +typedef ApplicationDidFinishLaunchingWithOptions = void Function( + UIApplication application, + Map options, +); +typedef ApplicationWillFinishLaunchingWithOptions = void Function( + UIApplication application, + Map options, +); +typedef ApplicationDidBecomeActive = void Function(UIApplication application); +typedef ApplicationWillResignActive = void Function(UIApplication application); +typedef ApplicationDidEnterBackground = void Function( + UIApplication application); +typedef ApplicationWillEnterForeground = void Function( + UIApplication application); +typedef ApplicationWillTerminate = void Function(UIApplication application); +typedef ApplicationDidRegisterUserNotificationSettings = void Function( + UIApplication application, + UIUserNotificationSettings notificationSettings, +); +typedef ApplicationDidRegisterForRemoteNotificationsWithDeviceToken = void + Function( + UIApplication application, + NSData deviceToken, +); +typedef ApplicationDidReceiveRemoteNotificationFetchCompletionHandler = void + Function( + UIApplication application, + Map userInfo, +); +typedef ApplicationOpenURLOptions = void Function( + UIApplication application, + NSURL url, + Map options, +); +typedef ApplicationHandleOpenURL = void Function( + UIApplication application, + NSURL url, +); +typedef ApplicationOpenURLSourceApplicationAnnotation = void Function( + UIApplication application, + NSURL url, + String sourceApplication, + NSObject annotation, +); +typedef ApplicationPerformActionForShortcutItemCompletionHandler = void + Function( + UIApplication application, + UIApplicationShortcutItem shortcutItem, +); +typedef ApplicationHandleEventsForBackgroundURLSessionCompletionHandler = void + Function( + UIApplication application, + String identifier, +); +typedef ApplicationPerformFetchWithCompletionHandler = void Function( + UIApplication application, +); +typedef ApplicationContinueUserActivityRestorationHandler = void Function( + UIApplication application, + NSUserActivity userActivity, +); diff --git a/lib/src/type/platform/android_type/android/app/activity.dart b/lib/src/type/platform/android_type/android/app/activity.dart new file mode 100644 index 0000000..f044e9e --- /dev/null +++ b/lib/src/type/platform/android_type/android/app/activity.dart @@ -0,0 +1,22 @@ +import 'package:foundation_fluttify/foundation_fluttify.dart'; +import 'package:foundation_fluttify/src/object/obejcts.dart'; +import 'package:foundation_fluttify/src/type/platform/android_type/android/content/context.dart'; +import 'package:foundation_fluttify/src/type/platform/android_type/android/content/intent.dart'; + +// ignore_for_file: non_constant_identifier_names, camel_case_types, missing_return, unused_import +class android_app_Activity extends android_content_Context { + @override + final String tag__ = 'platform'; + + static Future get() async { + final result = + await kMethodChannel.invokeMethod('android.app.Activity::get'); + return android_app_Activity()..refId = result?.refId; + } + + Future get intent async { + final result = await kMethodChannel.invokeMethod( + 'android.app.Activity::getIntent', {'__this__': this}); + return android_content_Intent()..refId = result?.refId; + } +} diff --git a/lib/src/type/platform/android_type/android/app/application.dart b/lib/src/type/platform/android_type/android/app/application.dart new file mode 100644 index 0000000..c63ed6d --- /dev/null +++ b/lib/src/type/platform/android_type/android/app/application.dart @@ -0,0 +1,15 @@ +import 'package:foundation_fluttify/foundation_fluttify.dart'; +import 'package:foundation_fluttify/src/object/obejcts.dart'; +import 'package:foundation_fluttify/src/type/platform/android_type/android/content/context.dart'; + +// ignore_for_file: non_constant_identifier_names, camel_case_types, missing_return, unused_import +class android_app_Application extends android_content_Context { + @override + final String tag__ = 'platform'; + + static Future get() async { + final result = + await kMethodChannel.invokeMethod('android.app.Application::get'); + return android_app_Application()..refId = result?.refId; + } +} diff --git a/lib/src/type/platform/android_type/android/app/notification.dart b/lib/src/type/platform/android_type/android/app/notification.dart new file mode 100644 index 0000000..4dceda7 --- /dev/null +++ b/lib/src/type/platform/android_type/android/app/notification.dart @@ -0,0 +1,35 @@ +import 'package:flutter/cupertino.dart'; +import 'package:foundation_fluttify/foundation_fluttify.dart'; +import 'package:foundation_fluttify/src/object/obejcts.dart'; +import 'package:foundation_fluttify/src/type/platform/android_type/android/content/context.dart'; +import 'package:foundation_fluttify/src/type/platform/android_type/android/content/intent.dart'; + +// ignore_for_file: non_constant_identifier_names, camel_case_types, missing_return, unused_import +class android_app_Notification extends java_lang_Object { + @override + final String tag__ = 'platform'; + + static Future create({ + required String contentTitle, + required String contentText, + int? when, + required String channelId, + required String channelName, + bool enableLights = true, + bool showBadge = true, + }) async { + final result = await kMethodChannel.invokeMethod( + 'android.app.Notification::create', + { + 'contentTitle': contentTitle, + 'contentText': contentText, + 'when': when ?? DateTime.now().millisecondsSinceEpoch, + 'channelId': channelId, + 'channelName': channelName, + 'enableLights': enableLights, + 'showBadge': showBadge, + }, + ); + return android_app_Notification()..refId = result?.refId; + } +} diff --git a/lib/src/type/platform/android_type/android/app/pending_intent.dart b/lib/src/type/platform/android_type/android/app/pending_intent.dart new file mode 100644 index 0000000..c62a8b6 --- /dev/null +++ b/lib/src/type/platform/android_type/android/app/pending_intent.dart @@ -0,0 +1,11 @@ +import 'package:foundation_fluttify/foundation_fluttify.dart'; +import 'package:foundation_fluttify/src/object/obejcts.dart'; +import 'package:foundation_fluttify/src/type/platform/android_type/android/content/context.dart'; +import 'package:foundation_fluttify/src/type/platform/android_type/android/content/intent.dart'; + +// ignore_for_file: non_constant_identifier_names, camel_case_types, missing_return, unused_import +class android_app_PendingIntent extends java_lang_Object + with android_os_Parcelable { + @override + final String tag__ = 'platform'; +} diff --git a/lib/src/type/platform/android_type/android/content/broadcast_receiver.dart b/lib/src/type/platform/android_type/android/content/broadcast_receiver.dart new file mode 100644 index 0000000..b12a229 --- /dev/null +++ b/lib/src/type/platform/android_type/android/content/broadcast_receiver.dart @@ -0,0 +1,37 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/services.dart'; +import 'package:foundation_fluttify/foundation_fluttify.dart'; +import 'package:foundation_fluttify/src/object/obejcts.dart'; +import 'package:foundation_fluttify/src/type/platform/android_type/java/lang/object.dart'; + +import 'intent.dart'; + +// ignore_for_file: non_constant_identifier_names, camel_case_types, missing_return, unused_import +class android_content_BroadcastReceiver extends java_lang_Object { + @override + final String tag__ = 'platform'; + + Future create( + ValueChanged onReceive, + ) async { + final result = await kMethodChannel.invokeMethod( + 'android.content.Context::registerReceiver', + { + '__this__': this, + 'broadcastReceiver': '', + 'intentFilter': '', + }, + ); + + MethodChannel('android.content.BroadcastReceiver::create::Callback') + .setMethodCallHandler((call) async { + if (call.method == + 'Callback::android.content.BroadcastReceiver::onReceive') { + final intentRefId = call.arguments['intent'] as String; + final intent = android_content_Intent()..refId = intentRefId; + onReceive(intent); + } + }); + return android_content_BroadcastReceiver()..refId = result?.refId; + } +} diff --git a/lib/src/type/platform/android_type/android/content/content_provider.dart b/lib/src/type/platform/android_type/android/content/content_provider.dart new file mode 100644 index 0000000..a324d0f --- /dev/null +++ b/lib/src/type/platform/android_type/android/content/content_provider.dart @@ -0,0 +1,9 @@ + + +import 'package:foundation_fluttify/src/type/platform/android_type/java/lang/object.dart'; + +// ignore_for_file: non_constant_identifier_names, camel_case_types, missing_return, unused_import +class android_content_ContentProvider extends java_lang_Object { + @override + final String tag__ = 'platform'; +} diff --git a/lib/src/type/platform/android_type/android/content/context.dart b/lib/src/type/platform/android_type/android/content/context.dart new file mode 100644 index 0000000..55e616f --- /dev/null +++ b/lib/src/type/platform/android_type/android/content/context.dart @@ -0,0 +1,28 @@ +import 'package:foundation_fluttify/foundation_fluttify.dart'; +import 'package:foundation_fluttify/src/object/obejcts.dart'; +import 'package:foundation_fluttify/src/type/platform/android_type/java/lang/object.dart'; + +import 'broadcast_receiver.dart'; +import 'intent.dart'; +import 'intent_filter.dart'; + +// ignore_for_file: non_constant_identifier_names, camel_case_types, missing_return, unused_import +class android_content_Context extends java_lang_Object { + @override + final String tag__ = 'platform'; + + Future registerReceiver( + android_content_BroadcastReceiver receiver, + android_content_IntentFilter intentFilter, + ) async { + final result = await kMethodChannel.invokeMethod( + 'android.content.Context::registerReceiver', + { + '__this__': this, + 'broadcastReceiver': receiver, + 'intentFilter': intentFilter, + }, + ); + return android_content_Intent()..refId = result?.refId; + } +} diff --git a/lib/src/type/platform/android_type/android/content/intent.dart b/lib/src/type/platform/android_type/android/content/intent.dart new file mode 100644 index 0000000..ca67dc7 --- /dev/null +++ b/lib/src/type/platform/android_type/android/content/intent.dart @@ -0,0 +1,23 @@ + + +import 'package:foundation_fluttify/src/object/obejcts.dart'; +import 'package:foundation_fluttify/src/type/platform/android_type/android/os/bundle.dart'; +import 'package:foundation_fluttify/src/type/platform/android_type/java/lang/object.dart'; + +// ignore_for_file: non_constant_identifier_names, camel_case_types, missing_return, unused_import +class android_content_Intent extends java_lang_Object { + @override + final String tag__ = 'platform'; + + Future?> get bundle async { + final result = await kMethodChannel.invokeMapMethod( + 'android.content.Intent::getBundle', {'__this__': this}); + return result; + } + + Future get action async { + final result = await kMethodChannel + .invokeMethod('android.content.Intent::getAction', {'__this__': this}); + return result; + } +} diff --git a/lib/src/type/platform/android_type/android/content/intent_filter.dart b/lib/src/type/platform/android_type/android/content/intent_filter.dart new file mode 100644 index 0000000..d3bb0a4 --- /dev/null +++ b/lib/src/type/platform/android_type/android/content/intent_filter.dart @@ -0,0 +1,19 @@ +import 'package:foundation_fluttify/foundation_fluttify.dart'; +import 'package:foundation_fluttify/src/object/obejcts.dart'; +import 'package:foundation_fluttify/src/type/platform/android_type/java/lang/object.dart'; + +import 'intent.dart'; + +// ignore_for_file: non_constant_identifier_names, camel_case_types, missing_return, unused_import +class android_content_IntentFilter extends java_lang_Object { + @override + final String tag__ = 'platform'; + + Future create(String action) async { + final result = await kMethodChannel.invokeMethod( + 'android.content.IntentFilter::create', + {'__this__': this, 'action': action}, + ); + return android_content_IntentFilter()..refId = result?.refId; + } +} diff --git a/lib/src/type/platform/android_type/android/graphics/bitmap.dart b/lib/src/type/platform/android_type/android/graphics/bitmap.dart new file mode 100644 index 0000000..c57f277 --- /dev/null +++ b/lib/src/type/platform/android_type/android/graphics/bitmap.dart @@ -0,0 +1,57 @@ +// ignore_for_file: non_constant_identifier_names, camel_case_types, missing_return, unused_import + +import 'dart:typed_data'; + +import 'package:foundation_fluttify/foundation_fluttify.dart'; +import 'package:foundation_fluttify/src/object/obejcts.dart'; +import 'package:foundation_fluttify/src/type/platform/android_type/java/lang/object.dart'; + +class android_graphics_Bitmap extends java_lang_Object { + @override + final String tag__ = 'platform'; + + static Future create(Uint8List bitmapBytes) async { + final result = await kMethodChannel.invokeMethod( + 'android.graphics.Bitmap::create', {'bitmapBytes': bitmapBytes}); + return android_graphics_Bitmap()..refId = result?.refId; + } + + static Future createWithDrawable( + String drawableId, + ) async { + final result = await kMethodChannel.invokeMethod( + 'android.graphics.Bitmap::createWithDrawable', + {'drawableId': drawableId}, + ); + return android_graphics_Bitmap()..refId = result?.refId; + } + + static Future?> create_batch( + List bitmapBytesBatch, + ) async { + final resultBatch = await kMethodChannel.invokeListMethod( + 'android.graphics.Bitmap::create_batch', + [ + for (final bitmapBytes in bitmapBytesBatch) {'bitmapBytes': bitmapBytes} + ], + ); + return resultBatch + ?.map((it) => android_graphics_Bitmap()..refId = it.refId) + .toList(); + } + + Future get data { + return kMethodChannel + .invokeMethod('android.graphics.Bitmap::getData', {'__this__': this}); + } + + Future recycle() { + return kMethodChannel + .invokeMethod('android.graphics.Bitmap::recycle', {'__this__': this}); + } + + Future get isRecycled { + return kMethodChannel.invokeMethod( + 'android.graphics.Bitmap::isRecycled', {'__this__': this}); + } +} diff --git a/lib/src/type/platform/android_type/android/graphics/drawable/drawable.dart b/lib/src/type/platform/android_type/android/graphics/drawable/drawable.dart new file mode 100644 index 0000000..00ffe4a --- /dev/null +++ b/lib/src/type/platform/android_type/android/graphics/drawable/drawable.dart @@ -0,0 +1,7 @@ +// ignore_for_file: non_constant_identifier_names, camel_case_types, missing_return, unused_import +import 'package:foundation_fluttify/src/type/platform/android_type/java/lang/object.dart'; + +class android_graphics_drawable_Drawable extends java_lang_Object { + @override + final String tag__ = 'platform'; +} diff --git a/lib/src/type/platform/android_type/android/graphics/point.dart b/lib/src/type/platform/android_type/android/graphics/point.dart new file mode 100644 index 0000000..4b9bad9 --- /dev/null +++ b/lib/src/type/platform/android_type/android/graphics/point.dart @@ -0,0 +1,28 @@ +// ignore_for_file: non_constant_identifier_names, camel_case_types, missing_return, unused_import + +import 'dart:typed_data'; + +import 'package:foundation_fluttify/foundation_fluttify.dart'; +import 'package:foundation_fluttify/src/object/obejcts.dart'; +import 'package:foundation_fluttify/src/type/platform/android_type/java/lang/object.dart'; + +class android_graphics_Point extends java_lang_Object { + @override + final String tag__ = 'platform'; + + static Future create(int x, int y) async { + final result = await kMethodChannel + .invokeMethod('android.graphics.Point::create', {'x': x, 'y': y}); + return android_graphics_Point()..refId = result?.refId; + } + + Future get x { + return kMethodChannel + .invokeMethod('android.graphics.Point::getX', {'__this__': this}); + } + + Future get y { + return kMethodChannel + .invokeMethod('android.graphics.Point::getY', {'__this__': this}); + } +} diff --git a/lib/src/type/platform/android_type/android/graphics/point_f.dart b/lib/src/type/platform/android_type/android/graphics/point_f.dart new file mode 100644 index 0000000..838f456 --- /dev/null +++ b/lib/src/type/platform/android_type/android/graphics/point_f.dart @@ -0,0 +1,7 @@ +// ignore_for_file: non_constant_identifier_names, camel_case_types, missing_return, unused_import +import 'package:foundation_fluttify/src/type/platform/android_type/java/lang/object.dart'; + +class android_graphics_PointF extends java_lang_Object { + @override + final String tag__ = 'platform'; +} diff --git a/lib/src/type/platform/android_type/android/location/location.dart b/lib/src/type/platform/android_type/android/location/location.dart new file mode 100644 index 0000000..5fb3075 --- /dev/null +++ b/lib/src/type/platform/android_type/android/location/location.dart @@ -0,0 +1,88 @@ +// ignore_for_file: non_constant_identifier_names, camel_case_types, missing_return, unused_import + +import 'package:foundation_fluttify/foundation_fluttify.dart'; +import 'package:foundation_fluttify/src/object/obejcts.dart'; +import 'package:foundation_fluttify/src/type/platform/android_type/java/lang/object.dart'; + +class android_location_Location extends java_lang_Object { + static Future create(String provider) async { + final result = await kMethodChannel.invokeMethod( + 'android.location.Location::create', {'provider': provider}); + return android_location_Location()..refId = result?.refId; + } + + @override + final String tag__ = 'platform'; + + Future get latitude { + return kMethodChannel.invokeMethod( + 'android.location.Location::getLatitude', {'__this__': this}); + } + + Future get longitude { + return kMethodChannel.invokeMethod( + 'android.location.Location::getLongitude', {'__this__': this}); + } + + Future get bearing { + return kMethodChannel.invokeMethod( + 'android.location.Location::getBearing', {'__this__': this}); + } + + Future get altitude { + return kMethodChannel.invokeMethod( + 'android.location.Location::getAltitude', {'__this__': this}); + } + + Future get accuracy { + return kMethodChannel.invokeMethod( + 'android.location.Location::getAccuracy', {'__this__': this}); + } + + Future get speed { + return kMethodChannel.invokeMethod( + 'android.location.Location::getSpeed', {'__this__': this}); + } + + Future setLatitude(double latitude) async { + return kMethodChannel.invokeMethod( + 'android.location.Location::setLatitude', + {'__this__': this, 'latitude': latitude}, + ); + } + + Future setLongitude(double longitude) async { + return kMethodChannel.invokeMethod( + 'android.location.Location::setLongitude', + {'__this__': this, 'longitude': longitude}, + ); + } + + Future setBearing(double bearing) async { + return kMethodChannel.invokeMethod( + 'android.location.Location::setBearing', + {'__this__': this, 'bearing': bearing}, + ); + } + + Future setAltitude(double altitude) async { + return kMethodChannel.invokeMethod( + 'android.location.Location::setAltitude', + {'__this__': this, 'altitude': altitude}, + ); + } + + Future setAccuracy(double accuracy) async { + return kMethodChannel.invokeMethod( + 'android.location.Location::setAccuracy', + {'__this__': this, 'accuracy': accuracy}, + ); + } + + Future setSpeed(double speed) async { + return kMethodChannel.invokeMethod( + 'android.location.Location::setSpeed', + {'__this__': this, 'speed': speed}, + ); + } +} diff --git a/lib/src/type/platform/android_type/android/opengl/gl_surface_view.dart b/lib/src/type/platform/android_type/android/opengl/gl_surface_view.dart new file mode 100644 index 0000000..1acfcfb --- /dev/null +++ b/lib/src/type/platform/android_type/android/opengl/gl_surface_view.dart @@ -0,0 +1,6 @@ +import 'package:foundation_fluttify/foundation_fluttify.dart'; + +class android_opengl_GLSurfaceView extends android_view_SurfaceView { + @override + final String tag__ = 'platform'; +} diff --git a/lib/src/type/platform/android_type/android/os/binder.dart b/lib/src/type/platform/android_type/android/os/binder.dart new file mode 100644 index 0000000..86e4f0f --- /dev/null +++ b/lib/src/type/platform/android_type/android/os/binder.dart @@ -0,0 +1,7 @@ +// ignore_for_file: non_constant_identifier_names, camel_case_types, missing_return, unused_import +import 'package:foundation_fluttify/src/type/platform/android_type/java/lang/object.dart'; + +class android_os_Binder extends java_lang_Object { + @override + final String tag__ = 'platform'; +} diff --git a/lib/src/type/platform/android_type/android/os/bundle.dart b/lib/src/type/platform/android_type/android/os/bundle.dart new file mode 100644 index 0000000..adcbd25 --- /dev/null +++ b/lib/src/type/platform/android_type/android/os/bundle.dart @@ -0,0 +1,59 @@ +import 'package:foundation_fluttify/foundation_fluttify.dart'; +import 'package:foundation_fluttify/src/object/obejcts.dart'; +import 'package:foundation_fluttify/src/type/platform/android_type/java/lang/object.dart'; + +// ignore_for_file: non_constant_identifier_names, camel_case_types, missing_return, unused_import +class android_os_Bundle extends java_lang_Object { + static Future create() async { + final result = + await kMethodChannel.invokeMethod('android.os.Bundle::create'); + return android_os_Bundle()..refId = result?.refId; + } + + @override + final String tag__ = 'platform'; + + Future putString(String key, String value) { + return kMethodChannel.invokeMethod('android.os.Bundle::putString', { + '__this__': this, + 'key': key, + 'value': value, + }); + } + + Future putInt(String key, int value) { + return kMethodChannel.invokeMethod('android.os.Bundle::putInt', { + '__this__': this, + 'key': key, + 'value': value, + }); + } + + Future getString(String key) { + return kMethodChannel.invokeMethod( + 'android.os.Bundle::getString', + {'__this__': this, 'key': key}, + ); + } + + Future getInt(String key) { + return kMethodChannel.invokeMethod( + 'android.os.Bundle::getInt', + {'__this__': this, 'key': key}, + ); + } + + Future getDouble(String key) { + return kMethodChannel.invokeMethod( + 'android.os.Bundle::getDouble', + {'__this__': this, 'key': key}, + ); + } + + Future getFloat(String key) { + return kMethodChannel.invokeMethod( + 'android.os.Bundle::getFloat', + {'__this__': this, 'key': key}, + ); + } +} diff --git a/lib/src/type/platform/android_type/android/os/parcelable.dart b/lib/src/type/platform/android_type/android/os/parcelable.dart new file mode 100644 index 0000000..c54c286 --- /dev/null +++ b/lib/src/type/platform/android_type/android/os/parcelable.dart @@ -0,0 +1,14 @@ +// ignore_for_file: non_constant_identifier_names, camel_case_types, missing_return, unused_import +import 'package:foundation_fluttify/src/type/platform/android_type/java/lang/object.dart'; + +class _android_os_Parcelable_SUB extends java_lang_Object + with android_os_Parcelable {} + +mixin android_os_Parcelable on java_lang_Object { + @override + final String tag__ = 'platform'; + + static android_os_Parcelable subInstance() { + return _android_os_Parcelable_SUB(); + } +} diff --git a/lib/src/type/platform/android_type/android/util/pair.dart b/lib/src/type/platform/android_type/android/util/pair.dart new file mode 100644 index 0000000..6f18c53 --- /dev/null +++ b/lib/src/type/platform/android_type/android/util/pair.dart @@ -0,0 +1,21 @@ +// ignore_for_file: non_constant_identifier_names, camel_case_types, missing_return, unused_import + + + +import 'package:foundation_fluttify/src/object/obejcts.dart'; +import 'package:foundation_fluttify/src/type/platform/android_type/java/lang/object.dart'; + +class android_util_Pair extends java_lang_Object { + @override + final String tag__ = 'platform'; + + Future get first { + return kMethodChannel + .invokeMethod('android.util.Pair::getFirst', {'__this__': this}); + } + + Future get second { + return kMethodChannel + .invokeMethod('android.util.Pair::getSecond', {'__this__': this}); + } +} diff --git a/lib/src/type/platform/android_type/android/view/motion_event.dart b/lib/src/type/platform/android_type/android/view/motion_event.dart new file mode 100644 index 0000000..45623a6 --- /dev/null +++ b/lib/src/type/platform/android_type/android/view/motion_event.dart @@ -0,0 +1,7 @@ +// ignore_for_file: non_constant_identifier_names, camel_case_types, missing_return, unused_import +import 'package:foundation_fluttify/src/type/platform/android_type/java/lang/object.dart'; + +class android_view_MotionEvent extends java_lang_Object { + @override + final String tag__ = 'platform'; +} diff --git a/lib/src/type/platform/android_type/android/view/surface_holder.dart b/lib/src/type/platform/android_type/android/view/surface_holder.dart new file mode 100644 index 0000000..f9e670c --- /dev/null +++ b/lib/src/type/platform/android_type/android/view/surface_holder.dart @@ -0,0 +1,71 @@ +import 'package:flutter/services.dart'; +import 'package:flutter/widgets.dart'; +import 'package:foundation_fluttify/foundation_fluttify.dart'; + +class _android_view_SurfaceHolder_SUB extends java_lang_Object + with android_view_SurfaceHolder {} + +mixin android_view_SurfaceHolder on java_lang_Object { + static android_view_SurfaceHolder subInstance() => + _android_view_SurfaceHolder_SUB(); + + @override + final String tag__ = 'platform'; + + Future addCallback( + android_view_SurfaceHolder_Callback callback, + ) async { + // invoke native method + await kMethodChannel.invokeMethod( + 'android.view.SurfaceHolder::addCallback', + {'__this__': this, 'callback': callback}, + ); + + // handle native call + MethodChannel( + 'android.view.SurfaceHolder::addCallback::Callback', + kMethodCodec, + ).setMethodCallHandler((methodCall) async { + try { + final args = methodCall.arguments as Map?; + switch (methodCall.method) { + case 'Callback::android.view.SurfaceHolder.Callback::surfaceCreated': + callback.surfaceCreated(args!['var1']); + break; + case 'Callback::android.view.SurfaceHolder.Callback::surfaceChanged': + callback.surfaceChanged( + args!['var1'], + args['var2'], + args['var3'], + args['var4'], + ); + break; + case 'Callback::android.view.SurfaceHolder.Callback::surfaceDestroyed': + callback.surfaceDestroyed(args!['var1']); + break; + default: + throw MissingPluginException('方法${methodCall.method}未实现'); + } + } catch (e) { + debugPrint(e.toString()); + rethrow; + } + }); + } +} + +mixin android_view_SurfaceHolder_Callback on java_lang_Object { + @override + final String tag__ = 'platform'; + + void surfaceCreated(android_view_SurfaceHolder? var1) {} + + void surfaceChanged( + android_view_SurfaceHolder? var1, + int? var2, + int? var3, + int? var4, + ) {} + + void surfaceDestroyed(android_view_SurfaceHolder? var1) {} +} diff --git a/lib/src/type/platform/android_type/android/view/surface_view.dart b/lib/src/type/platform/android_type/android/view/surface_view.dart new file mode 100644 index 0000000..9343aba --- /dev/null +++ b/lib/src/type/platform/android_type/android/view/surface_view.dart @@ -0,0 +1,28 @@ +import 'package:foundation_fluttify/foundation_fluttify.dart'; + +class android_view_SurfaceView extends android_view_View { + @override + final String tag__ = 'platform'; + + Future getHolder() async { + final result = await kMethodChannel.invokeMethod( + 'android.view.SurfaceView::getHolder', + {'__this__': this}, + ); + return android_view_SurfaceHolder.subInstance()..refId = result?.refId; + } + + Future setZOrderOnTop(bool onTop) async { + await kMethodChannel.invokeMethod( + 'android.view.SurfaceView::setZOrderOnTop', + {'__this__': this, 'onTop': onTop}, + ); + } + + Future setZOrderMediaOverlay(bool isMediaOverlay) async { + await kMethodChannel.invokeMethod( + 'android.view.SurfaceView::setZOrderMediaOverlay', + {'__this__': this, 'isMediaOverlay': isMediaOverlay}, + ); + } +} diff --git a/lib/src/type/platform/android_type/android/view/view.dart b/lib/src/type/platform/android_type/android/view/view.dart new file mode 100644 index 0000000..e880bbf --- /dev/null +++ b/lib/src/type/platform/android_type/android/view/view.dart @@ -0,0 +1,42 @@ +// ignore_for_file: non_constant_identifier_names, camel_case_types, missing_return, unused_import +import 'package:foundation_fluttify/src/object/obejcts.dart'; +import 'package:foundation_fluttify/src/type/platform/android_type/java/lang/object.dart'; + +class android_view_View extends java_lang_Object { + @override + final String tag__ = 'platform'; +} + +class _android_view_View_OnApplyWindowInsetsListener_SUB + extends java_lang_Object + with android_view_View_OnApplyWindowInsetsListener { + @override + final String tag__ = 'platform'; +} + +mixin android_view_View_OnApplyWindowInsetsListener on java_lang_Object { + static android_view_View_OnApplyWindowInsetsListener subInstance() => + _android_view_View_OnApplyWindowInsetsListener_SUB(); + @override + final String tag__ = 'platform'; +} + +class _android_view_View_OnClickListener_SUB extends java_lang_Object + with android_view_View_OnClickListener {} + +mixin android_view_View_OnClickListener on java_lang_Object { + static android_view_View_OnClickListener subInstance() => + _android_view_View_OnClickListener_SUB(); + @override + final String tag__ = 'platform'; +} + +class _android_view_View_OnTouchListener_SUB extends java_lang_Object + with android_view_View_OnTouchListener {} + +mixin android_view_View_OnTouchListener on java_lang_Object { + static android_view_View_OnTouchListener subInstance() => + _android_view_View_OnTouchListener_SUB(); + @override + final String tag__ = 'platform'; +} diff --git a/lib/src/type/platform/android_type/android/view/view_group.dart b/lib/src/type/platform/android_type/android/view/view_group.dart new file mode 100644 index 0000000..b3980f4 --- /dev/null +++ b/lib/src/type/platform/android_type/android/view/view_group.dart @@ -0,0 +1,22 @@ +// ignore_for_file: non_constant_identifier_names, camel_case_types, missing_return, unused_import +import 'package:foundation_fluttify/src/object/obejcts.dart'; +import 'package:foundation_fluttify/src/type/platform/android_type/android/view/view.dart'; + +class android_view_ViewGroup extends android_view_View { + @override + final String tag__ = 'platform'; + + Future addView(android_view_View child) { + return kMethodChannel.invokeMethod( + 'android.view.ViewGroup::addView', + {'__this__': this, 'child': child}, + ); + } + + Future removeAllViews() { + return kMethodChannel.invokeMethod( + 'android.view.ViewGroup::removeAllViews', + {'__this__': this}, + ); + } +} diff --git a/lib/src/type/platform/android_type/android/widget/frame_layout.dart b/lib/src/type/platform/android_type/android/widget/frame_layout.dart new file mode 100644 index 0000000..51575f8 --- /dev/null +++ b/lib/src/type/platform/android_type/android/widget/frame_layout.dart @@ -0,0 +1,7 @@ +// ignore_for_file: non_constant_identifier_names, camel_case_types, missing_return, unused_import +import 'package:foundation_fluttify/src/type/platform/android_type/android/view/view_group.dart'; + +class android_widget_FrameLayout extends android_view_ViewGroup { + @override + final String tag__ = 'platform'; +} diff --git a/lib/src/type/platform/android_type/android/widget/image_view.dart b/lib/src/type/platform/android_type/android/widget/image_view.dart new file mode 100644 index 0000000..f8d50f8 --- /dev/null +++ b/lib/src/type/platform/android_type/android/widget/image_view.dart @@ -0,0 +1,18 @@ +// ignore_for_file: non_constant_identifier_names, camel_case_types, missing_return, unused_import +import 'package:foundation_fluttify/foundation_fluttify.dart'; +import 'package:foundation_fluttify/src/type/platform/android_type/android/view/view.dart'; + +class android_widget_ImageView extends android_view_View { + @override + final String tag__ = 'platform'; + + static Future createWithBitmap( + android_graphics_Bitmap bitmap, + ) async { + final result = await kMethodChannel.invokeMethod( + 'android.widget.ImageView::createWithBitmap', + {'bitmap': bitmap}, + ); + return android_widget_ImageView()..refId = result?.refId; + } +} diff --git a/lib/src/type/platform/android_type/android/widget/linear_layout.dart b/lib/src/type/platform/android_type/android/widget/linear_layout.dart new file mode 100644 index 0000000..b8fa853 --- /dev/null +++ b/lib/src/type/platform/android_type/android/widget/linear_layout.dart @@ -0,0 +1,7 @@ +// ignore_for_file: non_constant_identifier_names, camel_case_types, missing_return, unused_import +import 'package:foundation_fluttify/src/type/platform/android_type/android/view/view_group.dart'; + +class android_widget_LinearLayout extends android_view_ViewGroup { + @override + final String tag__ = 'platform'; +} diff --git a/lib/src/type/platform/android_type/android/widget/relative_layout.dart b/lib/src/type/platform/android_type/android/widget/relative_layout.dart new file mode 100644 index 0000000..1ec0828 --- /dev/null +++ b/lib/src/type/platform/android_type/android/widget/relative_layout.dart @@ -0,0 +1,7 @@ +// ignore_for_file: non_constant_identifier_names, camel_case_types, missing_return, unused_import +import 'package:foundation_fluttify/src/type/platform/android_type/android/view/view_group.dart'; + +class android_widget_RelativeLayout extends android_view_ViewGroup { + @override + final String tag__ = 'platform'; +} diff --git a/lib/src/type/platform/android_type/android/widget/text_view.dart b/lib/src/type/platform/android_type/android/widget/text_view.dart new file mode 100644 index 0000000..2439f7b --- /dev/null +++ b/lib/src/type/platform/android_type/android/widget/text_view.dart @@ -0,0 +1,7 @@ +// ignore_for_file: non_constant_identifier_names, camel_case_types, missing_return, unused_import +import 'package:foundation_fluttify/src/type/platform/android_type/android/view/view.dart'; + +class android_widget_TextView extends android_view_View { + @override + final String tag__ = 'platform'; +} diff --git a/lib/src/type/platform/android_type/java/io/closeable.dart b/lib/src/type/platform/android_type/java/io/closeable.dart new file mode 100644 index 0000000..8758bd2 --- /dev/null +++ b/lib/src/type/platform/android_type/java/io/closeable.dart @@ -0,0 +1,16 @@ +import 'package:foundation_fluttify/foundation_fluttify.dart'; + +// ignore_for_file: non_constant_identifier_names, camel_case_types, missing_return, unused_import +class _java_io_Closeable_SUB extends java_lang_Object with java_io_Closeable { + @override + final String tag__ = 'platform'; +} + +mixin java_io_Closeable on java_lang_Object { + static java_io_Closeable subInstance() { + return _java_io_Closeable_SUB(); + } + + @override + final String tag__ = 'platform'; +} diff --git a/lib/src/type/platform/android_type/java/io/file.dart b/lib/src/type/platform/android_type/java/io/file.dart new file mode 100644 index 0000000..d757204 --- /dev/null +++ b/lib/src/type/platform/android_type/java/io/file.dart @@ -0,0 +1,13 @@ +import 'package:foundation_fluttify/foundation_fluttify.dart'; + +// ignore_for_file: non_constant_identifier_names, camel_case_types, missing_return, unused_import +class java_io_File extends java_lang_Object { + @override + final String tag__ = 'platform'; + + static Future create(String path) async { + final result = await kMethodChannel + .invokeMethod('java.io.File::create', {'path': path}); + return java_io_File()..refId = result?.refId; + } +} diff --git a/lib/src/type/platform/android_type/java/io/serializable.dart b/lib/src/type/platform/android_type/java/io/serializable.dart new file mode 100644 index 0000000..8cfa3d8 --- /dev/null +++ b/lib/src/type/platform/android_type/java/io/serializable.dart @@ -0,0 +1,17 @@ +import 'package:foundation_fluttify/foundation_fluttify.dart'; + +// ignore_for_file: non_constant_identifier_names, camel_case_types, missing_return, unused_import +class _java_io_Serializable_SUB extends java_lang_Object + with java_io_Serializable { + @override + final String tag__ = 'platform'; +} + +mixin java_io_Serializable on java_lang_Object { + static java_io_Serializable subInstance() { + return _java_io_Serializable_SUB(); + } + + @override + final String tag__ = 'platform'; +} diff --git a/lib/src/type/platform/android_type/java/lang/object.dart b/lib/src/type/platform/android_type/java/lang/object.dart new file mode 100644 index 0000000..e2719db --- /dev/null +++ b/lib/src/type/platform/android_type/java/lang/object.dart @@ -0,0 +1,7 @@ +import 'package:foundation_fluttify/src/type/core/ref.dart'; + +// ignore_for_file: non_constant_identifier_names, camel_case_types, missing_return, unused_import +class java_lang_Object extends Ref { + @override + final String tag__ = 'platform'; +} diff --git a/lib/src/type/platform/android_type/java/lang/throwable.dart b/lib/src/type/platform/android_type/java/lang/throwable.dart new file mode 100644 index 0000000..e97e4de --- /dev/null +++ b/lib/src/type/platform/android_type/java/lang/throwable.dart @@ -0,0 +1,7 @@ +import 'package:foundation_fluttify/src/type/core/ref.dart'; + +// ignore_for_file: non_constant_identifier_names, camel_case_types, missing_return, unused_import +class java_lang_Throwable extends Ref { + @override + final String tag__ = 'platform'; +} diff --git a/lib/src/type/platform/android_type/org/json/json_object.dart b/lib/src/type/platform/android_type/org/json/json_object.dart new file mode 100644 index 0000000..628f20a --- /dev/null +++ b/lib/src/type/platform/android_type/org/json/json_object.dart @@ -0,0 +1,7 @@ +import 'package:foundation_fluttify/src/type/platform/android_type/java/lang/object.dart'; + +// ignore_for_file: non_constant_identifier_names, camel_case_types, missing_return, unused_import +class org_json_JSONObject extends java_lang_Object { + @override + final String tag__ = 'platform'; +} diff --git a/lib/src/type/platform/ios_type/av_audio_session_category_options.dart b/lib/src/type/platform/ios_type/av_audio_session_category_options.dart new file mode 100644 index 0000000..640ea41 --- /dev/null +++ b/lib/src/type/platform/ios_type/av_audio_session_category_options.dart @@ -0,0 +1,26 @@ +//typedef NS_OPTIONS(NSUInteger, AVAudioSessionCategoryOptions) +//{ +// /* MixWithOthers is only valid with AVAudioSessionCategoryPlayAndRecord, AVAudioSessionCategoryPlayback, and AVAudioSessionCategoryMultiRoute */ +// AVAudioSessionCategoryOptionMixWithOthers = 0x1, +// /* DuckOthers is only valid with AVAudioSessionCategoryAmbient, AVAudioSessionCategoryPlayAndRecord, AVAudioSessionCategoryPlayback, and AVAudioSessionCategoryMultiRoute */ +// AVAudioSessionCategoryOptionDuckOthers = 0x2, +// /* AllowBluetooth is only valid with AVAudioSessionCategoryRecord and AVAudioSessionCategoryPlayAndRecord */ +// AVAudioSessionCategoryOptionAllowBluetooth API_UNAVAILABLE(tvos, watchos, macos) = 0x4, +// /* DefaultToSpeaker is only valid with AVAudioSessionCategoryPlayAndRecord */ +// AVAudioSessionCategoryOptionDefaultToSpeaker API_UNAVAILABLE(tvos, watchos, macos) = 0x8, +// /* InterruptSpokenAudioAndMixWithOthers is only valid with AVAudioSessionCategoryPlayAndRecord, AVAudioSessionCategoryPlayback, and AVAudioSessionCategoryMultiRoute */ +// AVAudioSessionCategoryOptionInterruptSpokenAudioAndMixWithOthers API_AVAILABLE(ios(9.0), watchos(2.0), tvos(9.0)) API_UNAVAILABLE(macos) = 0x11, +// /* AllowBluetoothA2DP is only valid with AVAudioSessionCategoryPlayAndRecord */ +// AVAudioSessionCategoryOptionAllowBluetoothA2DP API_AVAILABLE(ios(10.0), watchos(3.0), tvos(10.0)) API_UNAVAILABLE(macos) = 0x20, +// /* AllowAirPlay is only valid with AVAudioSessionCategoryPlayAndRecord */ +// AVAudioSessionCategoryOptionAllowAirPlay API_AVAILABLE(ios(10.0), tvos(10.0)) API_UNAVAILABLE(watchos, macos) = 0x40, +//}; +enum AVAudioSessionCategoryOptions { + AVAudioSessionCategoryOptionMixWithOthers, + AVAudioSessionCategoryOptionDuckOthers, + AVAudioSessionCategoryOptionAllowBluetooth, + AVAudioSessionCategoryOptionDefaultToSpeaker, + AVAudioSessionCategoryOptionInterruptSpokenAudioAndMixWithOthers, + AVAudioSessionCategoryOptionAllowBluetoothA2DP, + AVAudioSessionCategoryOptionAllowAirPlay +} diff --git a/lib/src/type/platform/ios_type/ca_action.dart b/lib/src/type/platform/ios_type/ca_action.dart new file mode 100644 index 0000000..dd96f3a --- /dev/null +++ b/lib/src/type/platform/ios_type/ca_action.dart @@ -0,0 +1,7 @@ +// ignore_for_file: non_constant_identifier_names +import 'package:foundation_fluttify/foundation_fluttify.dart'; + +mixin CAAction on NSObject { + @override + final String tag__ = 'platform'; +} diff --git a/lib/src/type/platform/ios_type/ca_animation.dart b/lib/src/type/platform/ios_type/ca_animation.dart new file mode 100644 index 0000000..ef93f89 --- /dev/null +++ b/lib/src/type/platform/ios_type/ca_animation.dart @@ -0,0 +1,9 @@ +// ignore_for_file: non_constant_identifier_names +import 'package:foundation_fluttify/foundation_fluttify.dart'; + +import 'ca_media_timing.dart'; + +class CAAnimation extends NSObject with NSCopying, CAMediaTiming { + @override + final String tag__ = 'platform'; +} diff --git a/lib/src/type/platform/ios_type/ca_basic_animation.dart b/lib/src/type/platform/ios_type/ca_basic_animation.dart new file mode 100644 index 0000000..47d4ad9 --- /dev/null +++ b/lib/src/type/platform/ios_type/ca_basic_animation.dart @@ -0,0 +1,18 @@ +// ignore_for_file: non_constant_identifier_names +import 'ca_property_animation.dart'; + +class CABasicAnimation extends CAPropertyAnimation { + CABasicAnimation(this.fromValue, this.toValue, this.byValue); + + @override + final String tag__ = 'platform'; + + final dynamic fromValue; + final dynamic toValue; + final dynamic byValue; + + @override + String toString() { + return 'CABasicAnimation{fromValue: $fromValue, toValue: $toValue, byValue: $byValue}'; + } +} diff --git a/lib/src/type/platform/ios_type/ca_media_timing.dart b/lib/src/type/platform/ios_type/ca_media_timing.dart new file mode 100644 index 0000000..ba7f179 --- /dev/null +++ b/lib/src/type/platform/ios_type/ca_media_timing.dart @@ -0,0 +1,52 @@ +// ignore_for_file: non_constant_identifier_names + + + +import 'package:foundation_fluttify/foundation_fluttify.dart'; + +mixin CAMediaTiming on NSObject { + @override + final String tag__ = 'platform'; + + /// The begin time of the object, in relation to its parent object, if + /// applicable. Defaults to 0. + double? beginTime; + + /// The basic duration of the object. Defaults to 0. + double? duration; + + /// The rate of the layer. Used to scale parent time to local time, e.g. + /// if rate is 2, local time progresses twice as fast as parent time. + /// Defaults to 1. + double? speed; + + /// Additional offset in active local time. i.e. to convert from parent + /// time tp to active local time t: t = (tp - begin) * speed + offset. + /// One use of this is to "pause" a layer by setting `speed' to zero and + /// `offset' to a suitable value. Defaults to 0. */ + double? timeOffset; + + /// The repeat count of the object. May be fractional. Defaults to 0. + double? repeatCount; + + /// The repeat duration of the object. Defaults to 0. + double? repeatDuration; + + /// When true, the object plays backwards after playing forwards. Defaults + /// to NO. + bool? autoreverses; + + /// Defines how the timed object behaves outside its active duration. + /// Local time may be clamped to either end of the active duration, or + /// the element may be removed from the presentation. The legal values + /// are `backwards', `forwards', `both' and `removed'. Defaults to + /// `removed'. + bool? fillMode; +} + +enum CAMediaTimingFillMode { + backwards, + forwards, + both, + removed, +} diff --git a/lib/src/type/platform/ios_type/ca_property_animation.dart b/lib/src/type/platform/ios_type/ca_property_animation.dart new file mode 100644 index 0000000..58ace8e --- /dev/null +++ b/lib/src/type/platform/ios_type/ca_property_animation.dart @@ -0,0 +1,7 @@ +// ignore_for_file: non_constant_identifier_names +import 'ca_animation.dart'; + +class CAPropertyAnimation extends CAAnimation { + @override + final String tag__ = 'platform'; +} diff --git a/lib/src/type/platform/ios_type/cg_point.dart b/lib/src/type/platform/ios_type/cg_point.dart new file mode 100644 index 0000000..e550060 --- /dev/null +++ b/lib/src/type/platform/ios_type/cg_point.dart @@ -0,0 +1,54 @@ +// ignore_for_file: non_constant_identifier_names + +import 'dart:math'; + +import 'package:foundation_fluttify/foundation_fluttify.dart'; +import 'package:foundation_fluttify/src/object/obejcts.dart'; + +class CGPoint extends Ref { + @override + final String tag__ = 'platform'; + + static Future create(double x, double y) async { + final result = await kMethodChannel + .invokeMethod('CGPoint::create', {'x': x, 'y': y}); + return CGPoint()..refId = result?.refId; + } + + static Future createWithPoint(Point point) async { + final result = await kMethodChannel + .invokeMethod('CGPoint::create', {'x': point.x, 'y': point.y}); + return CGPoint()..refId = result?.refId; + } + + static Future> create_batch( + List x, + List y, + ) async { + final resultBatch = await kMethodChannel + .invokeListMethod('CGPoint::create_batch', {'x': x, 'y': y}); + return [ + for (final item in resultBatch ?? []) CGPoint()..refId = item.refId + ]; + } + + Future get x { + return kMethodChannel.invokeMethod('CGPoint::getX', {'__this__': this}); + } + + Future get y { + return kMethodChannel.invokeMethod('CGPoint::getY', {'__this__': this}); + } +} + +extension CGPointListX on List { + Future?> get x_batch { + return kMethodChannel + .invokeMethod('CGPoint::getX_batch', {'__this__': this}); + } + + Future?> get y_batch { + return kMethodChannel + .invokeMethod('CGPoint::getY_batch', {'__this__': this}); + } +} diff --git a/lib/src/type/platform/ios_type/cg_rect.dart b/lib/src/type/platform/ios_type/cg_rect.dart new file mode 100644 index 0000000..4d81fd9 --- /dev/null +++ b/lib/src/type/platform/ios_type/cg_rect.dart @@ -0,0 +1,39 @@ +// ignore_for_file: non_constant_identifier_names + +import 'package:foundation_fluttify/foundation_fluttify.dart'; + +class CGRect extends Ref { + @override + final String tag__ = 'platform'; + + static Future create( + double x, + double y, + double width, + double height, + ) async { + final result = await kMethodChannel.invokeMethod('CGRect::create', { + 'x': x, + 'y': y, + 'width': width, + 'height': height, + }); + return CGRect()..refId = result?.refId; + } + + Future get x { + return kMethodChannel.invokeMethod('CGRect::getX', {'__this__': this}); + } + + Future get y { + return kMethodChannel.invokeMethod('CGRect::getY', {'__this__': this}); + } + + Future get width { + return kMethodChannel.invokeMethod('CGRect::getWidth', {'__this__': this}); + } + + Future get height { + return kMethodChannel.invokeMethod('CGRect::getHeight', {'__this__': this}); + } +} diff --git a/lib/src/type/platform/ios_type/cg_size.dart b/lib/src/type/platform/ios_type/cg_size.dart new file mode 100644 index 0000000..3936e12 --- /dev/null +++ b/lib/src/type/platform/ios_type/cg_size.dart @@ -0,0 +1,27 @@ +// ignore_for_file: non_constant_identifier_names + +import 'package:foundation_fluttify/foundation_fluttify.dart'; + +class CGSize extends Ref { + @override + final String tag__ = 'platform'; + + static Future create( + double width, + double height, + ) async { + final result = await kMethodChannel.invokeMethod('CGSize::create', { + 'width': width, + 'height': height, + }); + return CGSize()..refId = result?.refId; + } + + Future get width { + return kMethodChannel.invokeMethod('CGSize::getWidth', {'__this__': this}); + } + + Future get height { + return kMethodChannel.invokeMethod('CGSize::getHeight', {'__this__': this}); + } +} diff --git a/lib/src/type/platform/ios_type/ns_coding.dart b/lib/src/type/platform/ios_type/ns_coding.dart new file mode 100644 index 0000000..5428673 --- /dev/null +++ b/lib/src/type/platform/ios_type/ns_coding.dart @@ -0,0 +1,12 @@ +// ignore_for_file: non_constant_identifier_names +import 'ns_object.dart'; + +// ignore: camel_case_types +class _NSCoding_SUB extends NSObject with NSCoding {} + +mixin NSCoding on NSObject { + @override + final String tag__ = 'platform'; + + static NSCoding subInstance() => _NSCoding_SUB(); +} diff --git a/lib/src/type/platform/ios_type/ns_copying.dart b/lib/src/type/platform/ios_type/ns_copying.dart new file mode 100644 index 0000000..3dae51c --- /dev/null +++ b/lib/src/type/platform/ios_type/ns_copying.dart @@ -0,0 +1,12 @@ +// ignore_for_file: non_constant_identifier_names +import 'ns_object.dart'; + +// ignore: camel_case_types +class _NSCopying_SUB extends NSObject with NSCopying {} + +mixin NSCopying on NSObject { + @override + final String tag__ = 'platform'; + + static NSCopying subInstance() => _NSCopying_SUB(); +} diff --git a/lib/src/type/platform/ios_type/ns_data.dart b/lib/src/type/platform/ios_type/ns_data.dart new file mode 100644 index 0000000..2ec7b22 --- /dev/null +++ b/lib/src/type/platform/ios_type/ns_data.dart @@ -0,0 +1,24 @@ +// ignore_for_file: non_constant_identifier_names + +import 'dart:typed_data'; + +import 'package:foundation_fluttify/foundation_fluttify.dart'; +import 'package:foundation_fluttify/src/object/obejcts.dart'; + +class NSData extends NSObject { + @override + final String tag__ = 'platform'; + + static Future createWithUint8List(Uint8List data) async { + final result = await kMethodChannel + .invokeMethod('NSData::createWithUint8List', {'data': data}); + return NSData()..refId = result?.refId; + } + + Future getData() { + return kMethodChannel.invokeMethod( + 'NSData::getData', + {'__this__': this}, + ); + } +} diff --git a/lib/src/type/platform/ios_type/ns_date.dart b/lib/src/type/platform/ios_type/ns_date.dart new file mode 100644 index 0000000..99a7091 --- /dev/null +++ b/lib/src/type/platform/ios_type/ns_date.dart @@ -0,0 +1,19 @@ +// ignore_for_file: non_constant_identifier_names + + + +import 'package:foundation_fluttify/foundation_fluttify.dart'; +import 'package:foundation_fluttify/src/object/obejcts.dart'; + +class NSDate extends NSObject { + @override + final String tag__ = 'platform'; + + /// 时间戳 单位秒 + Future get timeIntervalSince1970 { + return kMethodChannel.invokeMethod( + 'NSDate::get_timeIntervalSince1970', + {'__this__': this}, + ); + } +} diff --git a/lib/src/type/platform/ios_type/ns_error.dart b/lib/src/type/platform/ios_type/ns_error.dart new file mode 100644 index 0000000..6d3848a --- /dev/null +++ b/lib/src/type/platform/ios_type/ns_error.dart @@ -0,0 +1,24 @@ +// ignore_for_file: non_constant_identifier_names + + + +import 'package:foundation_fluttify/foundation_fluttify.dart'; + +import 'ns_object.dart'; + +class NSError extends NSObject { + @override + final String tag__ = 'platform'; + + Future get code async { + final int? errorCode = await kMethodChannel + .invokeMethod('NSError::getCode', {'__this__': this}); + return errorCode; + } + + Future get description async { + final String? description = await kMethodChannel + .invokeMethod('NSError::getDescription', {'__this__': this}); + return description; + } +} diff --git a/lib/src/type/platform/ios_type/ns_mutable_copying.dart b/lib/src/type/platform/ios_type/ns_mutable_copying.dart new file mode 100644 index 0000000..274ac16 --- /dev/null +++ b/lib/src/type/platform/ios_type/ns_mutable_copying.dart @@ -0,0 +1,11 @@ +// ignore_for_file: non_constant_identifier_names +import 'ns_object.dart'; + +class _NSMutableCopying_SUB extends NSObject with NSMutableCopying {} + +mixin NSMutableCopying on NSObject { + static NSMutableCopying subInstance() => _NSMutableCopying_SUB(); + + @override + final String tag__ = 'platform'; +} diff --git a/lib/src/type/platform/ios_type/ns_object.dart b/lib/src/type/platform/ios_type/ns_object.dart new file mode 100644 index 0000000..17088ff --- /dev/null +++ b/lib/src/type/platform/ios_type/ns_object.dart @@ -0,0 +1,10 @@ +// ignore_for_file: non_constant_identifier_names + +import 'package:foundation_fluttify/foundation_fluttify.dart'; + +class NSObject extends Ref { + @override + final String tag__ = 'platform'; +} + +extension NSObjectListX on List {} diff --git a/lib/src/type/platform/ios_type/ns_operation.dart b/lib/src/type/platform/ios_type/ns_operation.dart new file mode 100644 index 0000000..1ca517f --- /dev/null +++ b/lib/src/type/platform/ios_type/ns_operation.dart @@ -0,0 +1,7 @@ +// ignore_for_file: non_constant_identifier_names +import 'ns_object.dart'; + +class NSOperation extends NSObject { + @override + final String tag__ = 'platform'; +} diff --git a/lib/src/type/platform/ios_type/ns_url.dart b/lib/src/type/platform/ios_type/ns_url.dart new file mode 100644 index 0000000..2dd9150 --- /dev/null +++ b/lib/src/type/platform/ios_type/ns_url.dart @@ -0,0 +1,7 @@ +// ignore_for_file: non_constant_identifier_names +import 'package:foundation_fluttify/foundation_fluttify.dart'; + +class NSURL extends NSObject { + @override + final String tag__ = 'platform'; +} diff --git a/lib/src/type/platform/ios_type/ns_user_activity.dart b/lib/src/type/platform/ios_type/ns_user_activity.dart new file mode 100644 index 0000000..c3e8419 --- /dev/null +++ b/lib/src/type/platform/ios_type/ns_user_activity.dart @@ -0,0 +1,7 @@ +// ignore_for_file: non_constant_identifier_names +import 'package:foundation_fluttify/foundation_fluttify.dart'; + +class NSUserActivity extends NSObject { + @override + final String tag__ = 'platform'; +} diff --git a/lib/src/type/platform/ios_type/ns_value.dart b/lib/src/type/platform/ios_type/ns_value.dart new file mode 100644 index 0000000..030b7b2 --- /dev/null +++ b/lib/src/type/platform/ios_type/ns_value.dart @@ -0,0 +1,7 @@ +// ignore_for_file: non_constant_identifier_names +import 'package:foundation_fluttify/foundation_fluttify.dart'; + +class NSValue extends NSObject with NSCopying { + @override + final String tag__ = 'platform'; +} diff --git a/lib/src/type/platform/ios_type/ui_application.dart b/lib/src/type/platform/ios_type/ui_application.dart new file mode 100644 index 0000000..5dd4780 --- /dev/null +++ b/lib/src/type/platform/ios_type/ui_application.dart @@ -0,0 +1,7 @@ +// ignore_for_file: non_constant_identifier_names +import 'package:foundation_fluttify/foundation_fluttify.dart'; + +class UIApplication extends NSObject { + @override + final String tag__ = 'platform'; +} diff --git a/lib/src/type/platform/ios_type/ui_application_shortcut_item.dart b/lib/src/type/platform/ios_type/ui_application_shortcut_item.dart new file mode 100644 index 0000000..5452a45 --- /dev/null +++ b/lib/src/type/platform/ios_type/ui_application_shortcut_item.dart @@ -0,0 +1,7 @@ +// ignore_for_file: non_constant_identifier_names +import 'package:foundation_fluttify/foundation_fluttify.dart'; + +class UIApplicationShortcutItem extends NSObject { + @override + final String tag__ = 'platform'; +} diff --git a/lib/src/type/platform/ios_type/ui_bar_style.dart b/lib/src/type/platform/ios_type/ui_bar_style.dart new file mode 100644 index 0000000..5c898fa --- /dev/null +++ b/lib/src/type/platform/ios_type/ui_bar_style.dart @@ -0,0 +1,4 @@ +enum UIBarStyle { + UIBarStyleDefault, + UIBarStyleBlack, +} diff --git a/lib/src/type/platform/ios_type/ui_color.dart b/lib/src/type/platform/ios_type/ui_color.dart new file mode 100644 index 0000000..4997a21 --- /dev/null +++ b/lib/src/type/platform/ios_type/ui_color.dart @@ -0,0 +1,19 @@ +// ignore_for_file: non_constant_identifier_names + +import 'dart:ui'; + +import 'package:foundation_fluttify/foundation_fluttify.dart'; +import 'package:foundation_fluttify/src/object/obejcts.dart'; + +import 'ns_object.dart'; + +class UIColor extends NSObject { + @override + final String tag__ = 'platform'; + + static Future create(Color color) async { + final result = await kMethodChannel + .invokeMethod('UIColor::create', {'colorValue': color.value}); + return UIColor()..refId = result?.refId; + } +} diff --git a/lib/src/type/platform/ios_type/ui_control.dart b/lib/src/type/platform/ios_type/ui_control.dart new file mode 100644 index 0000000..d3f6de1 --- /dev/null +++ b/lib/src/type/platform/ios_type/ui_control.dart @@ -0,0 +1,7 @@ +// ignore_for_file: non_constant_identifier_names +import 'ns_object.dart'; + +class UIControl extends NSObject { + @override + final String tag__ = 'platform'; +} diff --git a/lib/src/type/platform/ios_type/ui_edge_insets.dart b/lib/src/type/platform/ios_type/ui_edge_insets.dart new file mode 100644 index 0000000..70af4cd --- /dev/null +++ b/lib/src/type/platform/ios_type/ui_edge_insets.dart @@ -0,0 +1,45 @@ +// ignore_for_file: non_constant_identifier_names + +import 'package:foundation_fluttify/foundation_fluttify.dart'; +import 'package:foundation_fluttify/src/object/obejcts.dart'; + +class UIEdgeInsets extends Ref { + @override + final String tag__ = 'platform'; + + static Future create( + double top, + double left, + double bottom, + double right, + ) async { + final result = + await kMethodChannel.invokeMethod('UIEdgeInsets::create', { + 'top': top, + 'left': left, + 'bottom': bottom, + 'right': right, + }); + return UIEdgeInsets()..refId = result?.refId; + } + + Future get top { + return kMethodChannel + .invokeMethod('UIEdgeInsets::getTop', {'__this__': this}); + } + + Future get left { + return kMethodChannel + .invokeMethod('UIEdgeInsets::getLeft', {'__this__': this}); + } + + Future get bottom { + return kMethodChannel + .invokeMethod('UIEdgeInsets::getBottom', {'__this__': this}); + } + + Future get right { + return kMethodChannel + .invokeMethod('UIEdgeInsets::getRight', {'__this__': this}); + } +} diff --git a/lib/src/type/platform/ios_type/ui_image.dart b/lib/src/type/platform/ios_type/ui_image.dart new file mode 100644 index 0000000..cca0a80 --- /dev/null +++ b/lib/src/type/platform/ios_type/ui_image.dart @@ -0,0 +1,53 @@ +// ignore_for_file: non_constant_identifier_names, camel_case_types, missing_return, unused_import + +import 'dart:typed_data'; + +import 'package:foundation_fluttify/foundation_fluttify.dart'; +import 'package:foundation_fluttify/src/object/obejcts.dart'; + +import 'ns_object.dart'; + +class UIImage extends NSObject { + @override + final String tag__ = 'platform'; + + static Future create(Uint8List bitmapBytes) async { + final result = await kMethodChannel.invokeMethod( + 'UIImage::createUIImage', + {'bitmapBytes': bitmapBytes}, + ); + return UIImage()..refId = result?.refId; + } + + static Future createWithPath( + String resource, + String type, + String fileName, + ) async { + final result = await kMethodChannel.invokeMethod( + 'UIImage::createWithPath', + { + 'resource': resource, + 'type': type, + 'fileName': fileName, + }, + ); + return UIImage()..refId = result?.refId; + } + + static Future> create_batch( + List bitmapBytesBatch, + ) async { + final resultBatch = await kMethodChannel.invokeListMethod( + 'UIImage::createUIImage_batch', + [ + for (final bitmapBytes in bitmapBytesBatch) {'bitmapBytes': bitmapBytes} + ], + ); + return resultBatch?.map((it) => UIImage()..refId = it.refId).toList() ?? []; + } + + Future get data { + return kMethodChannel.invokeMethod('UIImage::getData', {'__this__': this}); + } +} diff --git a/lib/src/type/platform/ios_type/ui_image_view.dart b/lib/src/type/platform/ios_type/ui_image_view.dart new file mode 100644 index 0000000..611cd58 --- /dev/null +++ b/lib/src/type/platform/ios_type/ui_image_view.dart @@ -0,0 +1,19 @@ +// ignore_for_file: non_constant_identifier_names + +import 'package:foundation_fluttify/foundation_fluttify.dart'; +import 'package:foundation_fluttify/src/object/obejcts.dart'; + +import 'ui_view.dart'; + +class UIImageView extends UIView { + @override + final String tag__ = 'platform'; + + static Future create(UIImage image) async { + final result = await kMethodChannel.invokeMethod( + 'UIImageView::create', + {'image': image}, + ); + return UIImageView()..refId = result?.refId; + } +} diff --git a/lib/src/type/platform/ios_type/ui_status_bar_style.dart b/lib/src/type/platform/ios_type/ui_status_bar_style.dart new file mode 100644 index 0000000..a5bf4c8 --- /dev/null +++ b/lib/src/type/platform/ios_type/ui_status_bar_style.dart @@ -0,0 +1,5 @@ +enum UIStatusBarStyle { + UIStatusBarStyleDefault, + UIStatusBarStyleLightContent, + UIStatusBarStyleDarkContent, +} diff --git a/lib/src/type/platform/ios_type/ui_user_notification_settings.dart b/lib/src/type/platform/ios_type/ui_user_notification_settings.dart new file mode 100644 index 0000000..6d4c369 --- /dev/null +++ b/lib/src/type/platform/ios_type/ui_user_notification_settings.dart @@ -0,0 +1,7 @@ +// ignore_for_file: non_constant_identifier_names +import 'package:foundation_fluttify/foundation_fluttify.dart'; + +class UIUserNotificationSettings extends NSObject { + @override + final String tag__ = 'platform'; +} diff --git a/lib/src/type/platform/ios_type/ui_view.dart b/lib/src/type/platform/ios_type/ui_view.dart new file mode 100644 index 0000000..df964e9 --- /dev/null +++ b/lib/src/type/platform/ios_type/ui_view.dart @@ -0,0 +1,163 @@ +// ignore_for_file: non_constant_identifier_names + +import 'dart:math'; + +import 'package:foundation_fluttify/foundation_fluttify.dart'; +import 'package:foundation_fluttify/src/object/obejcts.dart'; +import 'package:foundation_fluttify/src/type/platform/ios_type/cg_point.dart'; + +import 'cg_rect.dart'; +import 'ns_object.dart'; + +class UIView extends NSObject { + @override + final String tag__ = 'platform'; + + static Future create() async { + final result = await kMethodChannel.invokeMethod('UIView::create'); + return UIView()..refId = result?.refId; + } + + /// 旋转 + /// + /// 单位为度 + Future rotate(double angle) async { + await kMethodChannel.invokeMethod('UIView::rotate', { + '__this__': this, + 'angle': angle, + }); + } + + /// 执行缩放动画 + Future scaleWithDuration({ + Duration duration = const Duration(seconds: 1), + double fromValue = 0, + required double toValue, + int repeatCount = 0, + int repeatMode = 1, + }) async { + assert(fromValue >= 0); + assert(toValue >= 0); + await kMethodChannel.invokeMethod('UIView::scaleWithDuration', { + '__this__': this, + 'duration': duration.inMilliseconds / 1000, + 'fromValue': fromValue, + 'toValue': toValue, + 'repeatCount': repeatCount, + 'repeatMode': repeatMode, + }); + } + + /// 执行移动动画 + Future translateWithDuration({ + Duration duration = const Duration(seconds: 1), + required CGPoint toValue, + int repeatCount = 0, + int repeatMode = 1, + }) async { + await kMethodChannel.invokeMethod('UIView::translateWithDuration', { + '__this__': this, + 'duration': duration.inMilliseconds / 1000, + 'toX': await toValue.x, + 'toY': await toValue.y, + 'repeatCount': repeatCount, + 'repeatMode': repeatMode, + }); + } + + /// 执行透明度动画 + /// + /// 范围为0-1 + Future alphaWithDuration({ + Duration duration = const Duration(seconds: 1), + double fromValue = 0, + required double toValue, + int repeatCount = 0, + int repeatMode = 0, + }) async { + assert(fromValue >= 0 && fromValue <= 1); + assert(toValue >= 0 && toValue <= 1); + await kMethodChannel.invokeMethod('UIView::alphaWithDuration', { + '__this__': this, + 'duration': duration.inMilliseconds / 1000, + 'fromValue': fromValue, + 'toValue': toValue, + 'repeatCount': repeatCount, + 'repeatMode': repeatMode, + }); + } + + /// 执行旋转动画 + /// + /// 单位为度, 逆时针旋转 + Future rotateWithDuration({ + Duration duration = const Duration(seconds: 1), + double fromValue = 0, + required double toValue, + int repeatCount = 0, + int repeatMode = 0, + }) async { + await kMethodChannel.invokeMethod('UIView::rotateWithDuration', { + '__this__': this, + 'duration': duration.inMilliseconds / 1000, + 'fromValue': fromValue / 180 * pi, + 'toValue': -toValue / 180 * pi, + 'repeatCount': repeatCount, + 'repeatMode': repeatMode, + }); + } + + /// 执行组合动画 + /// + /// [keyPath]为构造CABasicAnimation时的[CABasicAnimation animationWithKeyPath:keyPath]; + /// 缩放为`transform.scale`, 透明度为`opacity`, 旋转为`transform.rotation` + /// + /// [fromValue], [toValue]和[keyPath]的长度必须相等 + Future groupWithDuration({ + Duration duration = const Duration(seconds: 1), + required List fromValue, + required List toValue, + required List keyPath, + int repeatCount = 0, + int repeatMode = 0, + }) async { + assert(fromValue.length == toValue.length); + assert(toValue.length == keyPath.length); + await kMethodChannel.invokeMethod('UIView::groupWithDuration', { + '__this__': this, + 'duration': duration.inMilliseconds / 1000, + 'fromValue': [for (final item in fromValue) item / 180 * pi], + 'toValue': [for (final item in fromValue) -item / 180 * pi], + 'keyPath': keyPath, + 'repeatCount': repeatCount, + 'repeatMode': repeatMode, + }); + } + + Future get frame async { + final result = await kMethodChannel + .invokeMethod('UIView::getFrame', {'__this__': this}); + return CGRect()..refId = result?.refId; + } + + Future get hidden async { + final result = await kMethodChannel + .invokeMethod('UIView::getHidden', {'__this__': this}); + return result; + } + + Future setHidden(bool hidden) async { + await kMethodChannel.invokeMethod('UIView::setHidden', { + '__this__': this, + 'hidden': hidden, + }); + } + + Future setAnchorPoint(double anchorU, double anchorV) async { + await kMethodChannel.invokeMethod('UIView::setAnchorPoint', { + '__this__': this, + 'anchorU': anchorU, + 'anchorV': anchorV, + }); + } +} diff --git a/lib/src/type/platform/ios_type/ui_view_controller.dart b/lib/src/type/platform/ios_type/ui_view_controller.dart new file mode 100644 index 0000000..f73e9bb --- /dev/null +++ b/lib/src/type/platform/ios_type/ui_view_controller.dart @@ -0,0 +1,16 @@ +// ignore_for_file: non_constant_identifier_names + +import 'package:foundation_fluttify/foundation_fluttify.dart'; + +import 'ns_object.dart'; + +class UIViewController extends NSObject { + @override + final String tag__ = 'platform'; + + static Future get() async { + final result = + await kMethodChannel.invokeMethod('UIViewController::get'); + return UIViewController()..refId = result?.refId; + } +} diff --git a/lib/src/type/widget/android_opengl_GLSurfaceView.widget.dart b/lib/src/type/widget/android_opengl_GLSurfaceView.widget.dart new file mode 100644 index 0000000..eefbbfd --- /dev/null +++ b/lib/src/type/widget/android_opengl_GLSurfaceView.widget.dart @@ -0,0 +1,75 @@ +// ignore_for_file: non_constant_identifier_names, camel_case_types, missing_return, unused_import + + + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:foundation_fluttify/foundation_fluttify.dart'; +import 'package:foundation_fluttify/src/type/platform/ios_type/ui_view.dart'; + +typedef _OnViewCreated = Future Function( + android_opengl_GLSurfaceView? controller, +); +typedef _OnViewDispose = Future Function(); + +class android_opengl_GLSurfaceViewWidget extends StatefulWidget { + const android_opengl_GLSurfaceViewWidget({ + Key? key, + this.onGLSurfaceViewCreated, + this.onDispose, + this.gestureRecognizers, + }) : super(key: key); + + final _OnViewCreated? onGLSurfaceViewCreated; + final _OnViewDispose? onDispose; + final Set>? gestureRecognizers; + + @override + _android_opengl_GLSurfaceViewWidgetState createState() => + _android_opengl_GLSurfaceViewWidgetState(); +} + +class _android_opengl_GLSurfaceViewWidgetState + extends State { + android_opengl_GLSurfaceView? _view; + + @override + Widget build(BuildContext context) { + if (Platform.isAndroid) { + final gestureRecognizers = widget.gestureRecognizers ?? + >{ + Factory( + () => EagerGestureRecognizer()), + }; + final messageCodec = FluttifyMessageCodec(tag: 'platform'); + return AndroidView( + viewType: 'me.yohom/foundation_fluttify/android.opengl.GLSurfaceView', + creationParamsCodec: messageCodec, + gestureRecognizers: gestureRecognizers, + onPlatformViewCreated: (viewId) async { + final refId = await viewId2RefId((2147483647 - viewId).toString()); + _view = android_opengl_GLSurfaceView() + ..refId = 'android.opengl.GLSurfaceView:$refId'; + if (widget.onGLSurfaceViewCreated != null) { + await widget.onGLSurfaceViewCreated!(_view); + } + }, + ); + } else { + return Center(child: Text('不支持的平台')); + } + } + + @override + void dispose() { + if (widget.onDispose != null) { + widget.onDispose!().then((_) => _view!.release__()); + } else { + _view!.release__(); + } + super.dispose(); + } +} diff --git a/lib/src/type/widget/android_view_SurfaceView.widget.dart b/lib/src/type/widget/android_view_SurfaceView.widget.dart new file mode 100644 index 0000000..ce26a6d --- /dev/null +++ b/lib/src/type/widget/android_view_SurfaceView.widget.dart @@ -0,0 +1,128 @@ +// ignore_for_file: non_constant_identifier_names, camel_case_types, missing_return, unused_import + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:foundation_fluttify/foundation_fluttify.dart'; +import 'package:foundation_fluttify/src/type/platform/ios_type/ui_view.dart'; + +typedef _OnViewCreated = Future Function( + android_view_SurfaceView? controller, +); +typedef _OnViewDispose = Future Function(); + +class android_view_SurfaceViewWidget extends StatefulWidget { + const android_view_SurfaceViewWidget({ + Key? key, + this.onSurfaceViewCreated, + this.surfaceCreated, + this.surfaceChanged, + this.surfaceDestroyed, + this.onDispose, + this.gestureRecognizers, + }) : super(key: key); + + final _OnViewCreated? onSurfaceViewCreated; + final ValueChanged? surfaceCreated; + final void Function(android_view_SurfaceHolder, int?, int?, int?)? + surfaceChanged; + final ValueChanged? surfaceDestroyed; + final _OnViewDispose? onDispose; + final Set>? gestureRecognizers; + + @override + _android_view_SurfaceViewWidgetState createState() => + _android_view_SurfaceViewWidgetState(); +} + +class _android_view_SurfaceViewWidgetState + extends State { + android_view_SurfaceView? _view; + + @override + void initState() { + super.initState(); + MethodChannel( + 'android.view.SurfaceHolder::addCallback::Callback', + kMethodCodec, + ).setMethodCallHandler((methodCall) async { + try { + final args = methodCall.arguments as Map?; + switch (methodCall.method) { + case 'Callback::android.view.SurfaceHolder.Callback::surfaceCreated': + if (widget.surfaceCreated != null) { + final ref = args!['holder'] as Ref; + widget.surfaceCreated!( + android_view_SurfaceHolder.subInstance()..refId = ref.refId, + ); + } + break; + case 'Callback::android.view.SurfaceHolder.Callback::surfaceChanged': + if (widget.surfaceChanged != null) { + final ref = args!['holder'] as Ref; + widget.surfaceChanged!( + android_view_SurfaceHolder.subInstance()..refId = ref.refId, + args['format'], + args['width'], + args['height'], + ); + } + break; + case 'Callback::android.view.SurfaceHolder.Callback::surfaceDestroyed': + if (widget.surfaceDestroyed != null) { + final ref = args!['holder'] as Ref; + widget.surfaceDestroyed!( + android_view_SurfaceHolder.subInstance()..refId = ref.refId, + ); + } + break; + default: + throw MissingPluginException('方法${methodCall.method}未实现'); + } + } catch (e) { + debugPrint(e.toString()); + rethrow; + } + }); + } + + @override + Widget build(BuildContext context) { + if (Platform.isAndroid) { + final gestureRecognizers = widget.gestureRecognizers ?? + >{ + Factory( + () => EagerGestureRecognizer()), + }; + final messageCodec = FluttifyMessageCodec(); + return AndroidView( + viewType: 'me.yohom/foundation_fluttify/android.view.SurfaceView', + creationParamsCodec: messageCodec, + gestureRecognizers: gestureRecognizers, + onPlatformViewCreated: (viewId) async { + final refId = await viewId2RefId((2147483647 - viewId).toString()); + _view = android_view_SurfaceView() + ..refId = 'android.view.SurfaceView:$refId'; + if (widget.onSurfaceViewCreated != null) { + await widget.onSurfaceViewCreated!(_view); + } + }, + ); + } else { + return Center(child: Text('不支持的平台')); + } + } + + @override + void dispose() { + if (widget.onDispose != null) { + widget.onDispose!().then((_) => _view!.release__()); + } else { + _view!.release__(); + } + super.dispose(); + } +} diff --git a/lib/src/type/widget/android_widget_FrameLayout.widget.dart b/lib/src/type/widget/android_widget_FrameLayout.widget.dart new file mode 100644 index 0000000..906890e --- /dev/null +++ b/lib/src/type/widget/android_widget_FrameLayout.widget.dart @@ -0,0 +1,74 @@ +// ignore_for_file: non_constant_identifier_names, camel_case_types, missing_return, unused_import + + + +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:foundation_fluttify/foundation_fluttify.dart'; +import 'package:foundation_fluttify/src/type/platform/ios_type/ui_view.dart'; + +typedef _OnViewCreated = Future Function( + android_widget_FrameLayout? controller); +typedef _OnViewDispose = Future Function(); + +class android_view_FrameLayoutWidget extends StatefulWidget { + const android_view_FrameLayoutWidget({ + Key? key, + this.onFrameLayoutCreated, + this.onDispose, + this.gestureRecognizers, + }) : super(key: key); + + final _OnViewCreated? onFrameLayoutCreated; + final _OnViewDispose? onDispose; + final Set>? gestureRecognizers; + + @override + _android_view_FrameLayoutWidgetState createState() => + _android_view_FrameLayoutWidgetState(); +} + +class _android_view_FrameLayoutWidgetState + extends State { + android_widget_FrameLayout? _view; + + @override + Widget build(BuildContext context) { + if (Platform.isAndroid) { + final gestureRecognizers = widget.gestureRecognizers ?? + >{ + Factory( + () => EagerGestureRecognizer()), + }; + final messageCodec = FluttifyMessageCodec(); + return AndroidView( + viewType: 'me.yohom/foundation_fluttify/android.widget.FrameLayout', + creationParamsCodec: messageCodec, + gestureRecognizers: gestureRecognizers, + onPlatformViewCreated: (viewId) async { + final refId = await viewId2RefId((2147483647 - viewId).toString()); + _view = android_widget_FrameLayout() + ..refId = 'android.widget.FrameLayout:$refId'; + if (widget.onFrameLayoutCreated != null) { + await widget.onFrameLayoutCreated!(_view); + } + }, + ); + } else { + return Center(child: Text('不支持的平台')); + } + } + + @override + void dispose() { + if (widget.onDispose != null) { + widget.onDispose!().then((_) => _view!.release__()); + } else { + _view!.release__(); + } + super.dispose(); + } +} diff --git a/lib/src/type/widget/scoped_release_pool.widget.dart b/lib/src/type/widget/scoped_release_pool.widget.dart new file mode 100644 index 0000000..ee42330 --- /dev/null +++ b/lib/src/type/widget/scoped_release_pool.widget.dart @@ -0,0 +1,52 @@ +import 'package:flutter/material.dart'; +import 'package:foundation_fluttify/foundation_fluttify.dart'; +import 'package:foundation_fluttify/src/type/core/ref.dart'; + +class ScopedReleasePool extends StatefulWidget { + const ScopedReleasePool({ + Key? key, + required this.child, + required this.tag, + }) : super(key: key); + + final Widget child; + + /// 标记一类对象 + /// + /// 如果设置了, 则释放时根据这个tag进行释放, 防止误伤 + final String tag; + + @override + ScopedReleasePoolState createState() => ScopedReleasePoolState(); +} + +class ScopedReleasePoolState extends State { + final Set _releasePool = {}; + + @override + void initState() { + super.initState(); + gReleasePoolStack.push(this); + } + + @override + Widget build(BuildContext context) { + return widget.child; + } + + @override + void dispose() { + log('ScopedReleasePool释放对象: $_releasePool'); + gReleasePoolStack.pop(); + _releasePool + // 过滤出tag为目标tag的对象进行释放 或 tag为null表示不过滤 + .where((e) => e.tag__ == widget.tag) + .release_batch() + .then((value) => _releasePool.clear()); + super.dispose(); + } + + void add(Ref ref) { + _releasePool.add(ref); + } +} diff --git a/lib/src/type/widget/ui_view.widget.dart b/lib/src/type/widget/ui_view.widget.dart new file mode 100644 index 0000000..537cddc --- /dev/null +++ b/lib/src/type/widget/ui_view.widget.dart @@ -0,0 +1,65 @@ +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/gestures.dart'; +import 'package:flutter/material.dart'; +import 'package:foundation_fluttify/foundation_fluttify.dart'; + +typedef OnUIViewCreated = Future Function(UIView? controller); +typedef _OnUiKitViewDispose = Future Function(); + +class UIViewWidget extends StatefulWidget { + const UIViewWidget({ + Key? key, + this.onUIViewCreated, + this.onDispose, + this.gestureRecognizers, + }) : super(key: key); + + final OnUIViewCreated? onUIViewCreated; + final _OnUiKitViewDispose? onDispose; + final Set>? gestureRecognizers; + + @override + _UIViewWidgetState createState() => _UIViewWidgetState(); +} + +class _UIViewWidgetState extends State { + UIView? _view; + + @override + Widget build(BuildContext context) { + if (Platform.isIOS) { + final gestureRecognizers = widget.gestureRecognizers ?? + >{ + Factory( + () => EagerGestureRecognizer()), + }; + final messageCodec = FluttifyMessageCodec(); + return UiKitView( + viewType: 'me.yohom/foundation_fluttify/UIView', + creationParamsCodec: messageCodec, + gestureRecognizers: gestureRecognizers, + onPlatformViewCreated: (viewId) async { + final refId = await viewId2RefId((2147483647 - viewId).toString()); + _view = UIView()..refId = 'UIView:$refId'; + if (widget.onUIViewCreated != null) { + await widget.onUIViewCreated!(_view); + } + }, + ); + } else { + return Center(child: Text('不支持的平台')); + } + } + + @override + void dispose() { + if (widget.onDispose != null) { + widget.onDispose!().then((_) => _view?.release__()); + } else { + _view?.release__(); + } + super.dispose(); + } +} diff --git a/pubspec.lock b/pubspec.lock new file mode 100644 index 0000000..4838d6b --- /dev/null +++ b/pubspec.lock @@ -0,0 +1,189 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + async: + dependency: transitive + description: + name: async + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + url: "https://pub.dev" + source: hosted + version: "2.11.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + characters: + dependency: transitive + description: + name: characters + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + url: "https://pub.dev" + source: hosted + version: "1.3.0" + clock: + dependency: transitive + description: + name: clock + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev" + source: hosted + version: "1.1.1" + collection: + dependency: transitive + description: + name: collection + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a + url: "https://pub.dev" + source: hosted + version: "1.18.0" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.dev" + source: hosted + version: "1.3.1" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" + url: "https://pub.dev" + source: hosted + version: "10.0.5" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" + url: "https://pub.dev" + source: hosted + version: "3.0.5" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" + url: "https://pub.dev" + source: hosted + version: "3.0.1" + matcher: + dependency: transitive + description: + name: matcher + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb + url: "https://pub.dev" + source: hosted + version: "0.12.16+1" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + url: "https://pub.dev" + source: hosted + version: "0.11.1" + meta: + dependency: transitive + description: + name: meta + sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 + url: "https://pub.dev" + source: hosted + version: "1.15.0" + path: + dependency: transitive + description: + name: path + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" + url: "https://pub.dev" + source: hosted + version: "1.9.0" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.99" + source_span: + dependency: transitive + description: + name: source_span + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + url: "https://pub.dev" + source: hosted + version: "1.10.0" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" + url: "https://pub.dev" + source: hosted + version: "1.11.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + url: "https://pub.dev" + source: hosted + version: "2.1.2" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" + source: hosted + version: "1.2.1" + test_api: + dependency: transitive + description: + name: test_api + sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" + url: "https://pub.dev" + source: hosted + version: "0.7.2" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" + url: "https://pub.dev" + source: hosted + version: "14.2.5" +sdks: + dart: ">=3.5.3 <4.0.0" + flutter: ">=3.18.0-18.0.pre.54" diff --git a/pubspec.yaml b/pubspec.yaml new file mode 100644 index 0000000..e081ddd --- /dev/null +++ b/pubspec.yaml @@ -0,0 +1,25 @@ +name: foundation_fluttify +description: Foundation for `Fluttify`. +version: 0.13.0+1 +homepage: https://github.com/fluttify-project/foundation_fluttify + +environment: + sdk: ^3.5.3 + flutter: '>=3.3.0' + +dependencies: + flutter: + sdk: flutter + +dev_dependencies: + flutter_test: + sdk: flutter + +flutter: + plugin: + platforms: + android: + package: me.yohom.foundation_fluttify + pluginClass: FoundationFluttifyPlugin + ios: + pluginClass: FoundationFluttifyPlugin \ No newline at end of file diff --git a/test/foundation_fluttify_test.dart b/test/foundation_fluttify_test.dart new file mode 100644 index 0000000..ab73b3a --- /dev/null +++ b/test/foundation_fluttify_test.dart @@ -0,0 +1 @@ +void main() {}