From 37bd2eae7cea3dbf0d7e6b4c523f91c39c020f07 Mon Sep 17 00:00:00 2001 From: Aziz Marashly Date: Sun, 24 Oct 2021 20:46:41 +0300 Subject: [PATCH 1/2] Migrate to null safety And Android embedding v2 --- .idea/libraries/Dart_SDK.xml | 22 +- .idea/libraries/Flutter_for_Android.xml | 9 - .metadata | 2 +- CHANGELOG.md | 24 +- analysis_options.yaml | 4 + android/.idea/.gitignore | 3 + android/.idea/.name | 1 + android/.idea/compiler.xml | 6 + android/.idea/gradle.xml | 19 + android/.idea/jarRepositories.xml | 25 + android/.idea/misc.xml | 9 + android/.idea/modules.xml | 8 + android/build.gradle | 21 +- android/gradle.properties | 3 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- android/src/main/AndroidManifest.xml | 1 - .../FlutterSerialPortPlugin.java | 44 +- example/.gitignore | 53 +- example/.metadata | 2 +- example/analysis_options.yaml | 29 + example/android/.gitignore | 13 + example/android/app/build.gradle | 18 +- .../android/app/src/debug/AndroidManifest.xml | 2 +- .../android/app/src/main/AndroidManifest.xml | 40 +- .../MainActivity.java | 23 - .../com/example/ttt_example/MainActivity.java | 6 + .../res/drawable-v21/launch_background.xml | 12 + .../app/src/main/res/values-night/styles.xml | 18 + .../app/src/main/res/values/styles.xml | 12 +- .../app/src/profile/AndroidManifest.xml | 2 +- example/android/build.gradle | 8 +- example/android/gradle.properties | 3 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- example/android/settings.gradle | 18 +- example/ios/Flutter/AppFrameworkInfo.plist | 26 - example/ios/Flutter/Debug.xcconfig | 1 - example/ios/Flutter/Release.xcconfig | 1 - example/ios/Runner.xcodeproj/project.pbxproj | 519 ------------------ .../contents.xcworkspacedata | 7 - .../xcshareddata/xcschemes/Runner.xcscheme | 91 --- .../contents.xcworkspacedata | 7 - example/ios/Runner/AppDelegate.swift | 13 - .../AppIcon.appiconset/Contents.json | 122 ---- .../Icon-App-1024x1024@1x.png | Bin 10932 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 564 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 1283 -> 0 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 1588 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 1025 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 1716 -> 0 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 1920 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 1283 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 1895 -> 0 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 2665 -> 0 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 2665 -> 0 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 3831 -> 0 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 1888 -> 0 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 3294 -> 0 bytes .../Icon-App-83.5x83.5@2x.png | Bin 3612 -> 0 bytes .../LaunchImage.imageset/Contents.json | 23 - .../LaunchImage.imageset/LaunchImage.png | Bin 68 -> 0 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 68 -> 0 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 68 -> 0 bytes .../LaunchImage.imageset/README.md | 5 - .../Runner/Base.lproj/LaunchScreen.storyboard | 37 -- example/ios/Runner/Base.lproj/Main.storyboard | 26 - example/ios/Runner/Info.plist | 45 -- example/ios/Runner/Runner-Bridging-Header.h | 1 - example/lib/main.dart | 2 +- example/lib/pages/home.dart | 42 +- example/lib/pages/setting_device.dart | 14 +- example/lib/stores/app.dart | 6 +- example/pubspec.lock | 79 +-- example/pubspec.yaml | 7 +- example/test/widget_test.dart | 3 +- ios/.gitignore | 37 -- ios/Assets/.gitkeep | 0 ios/Classes/FlutterSerialPortPlugin.h | 4 - ios/Classes/FlutterSerialPortPlugin.m | 8 - .../SwiftFlutterSerialPortPlugin.swift | 14 - ios/flutter_serial_port.podspec | 21 - lib/serial_port_flutter.dart | 45 +- pubspec.lock | 82 ++- pubspec.yaml | 18 +- test/flutter_serial_port_test.dart | 23 + 84 files changed, 464 insertions(+), 1329 deletions(-) delete mode 100644 .idea/libraries/Flutter_for_Android.xml create mode 100644 analysis_options.yaml create mode 100644 android/.idea/.gitignore create mode 100644 android/.idea/.name create mode 100644 android/.idea/compiler.xml create mode 100644 android/.idea/gradle.xml create mode 100644 android/.idea/jarRepositories.xml create mode 100644 android/.idea/misc.xml create mode 100644 android/.idea/modules.xml create mode 100644 example/analysis_options.yaml create mode 100644 example/android/.gitignore delete mode 100644 example/android/app/src/main/java/com/example/flutter_serial_port_example/MainActivity.java create mode 100644 example/android/app/src/main/java/com/example/ttt_example/MainActivity.java create mode 100644 example/android/app/src/main/res/drawable-v21/launch_background.xml create mode 100644 example/android/app/src/main/res/values-night/styles.xml delete mode 100644 example/ios/Flutter/AppFrameworkInfo.plist delete mode 100644 example/ios/Flutter/Debug.xcconfig delete mode 100644 example/ios/Flutter/Release.xcconfig delete mode 100644 example/ios/Runner.xcodeproj/project.pbxproj delete mode 100644 example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme delete mode 100644 example/ios/Runner.xcworkspace/contents.xcworkspacedata delete mode 100644 example/ios/Runner/AppDelegate.swift delete mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png delete mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png delete mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png delete mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png delete mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png delete mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png delete mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png delete mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png delete mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png delete mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png delete mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png delete mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png delete mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png delete mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png delete mode 100644 example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png delete mode 100644 example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json delete mode 100644 example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png delete mode 100644 example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png delete mode 100644 example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png delete mode 100644 example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md delete mode 100644 example/ios/Runner/Base.lproj/LaunchScreen.storyboard delete mode 100644 example/ios/Runner/Base.lproj/Main.storyboard delete mode 100644 example/ios/Runner/Info.plist delete mode 100644 example/ios/Runner/Runner-Bridging-Header.h delete mode 100644 ios/.gitignore delete mode 100644 ios/Assets/.gitkeep delete mode 100644 ios/Classes/FlutterSerialPortPlugin.h delete mode 100644 ios/Classes/FlutterSerialPortPlugin.m delete mode 100644 ios/Classes/SwiftFlutterSerialPortPlugin.swift delete mode 100644 ios/flutter_serial_port.podspec create mode 100644 test/flutter_serial_port_test.dart diff --git a/.idea/libraries/Dart_SDK.xml b/.idea/libraries/Dart_SDK.xml index 01c373d..b347ff6 100644 --- a/.idea/libraries/Dart_SDK.xml +++ b/.idea/libraries/Dart_SDK.xml @@ -1,17 +1,17 @@ - - - - - - - - - - - + + + + + + + + + + + diff --git a/.idea/libraries/Flutter_for_Android.xml b/.idea/libraries/Flutter_for_Android.xml deleted file mode 100644 index 2a03dad..0000000 --- a/.idea/libraries/Flutter_for_Android.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/.metadata b/.metadata index ab3727a..2a46ab9 100644 --- a/.metadata +++ b/.metadata @@ -4,7 +4,7 @@ # This file should be version controlled and should not be manually edited. version: - revision: 1aedbb1835bd6eb44550293d57d4d124f19901f0 + revision: ffb2ecea5223acdd139a5039be2f9c796962833d channel: stable project_type: plugin diff --git a/CHANGELOG.md b/CHANGELOG.md index 752d71d..41cc7d8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,25 +1,3 @@ -## 0.1.0 - -* Add constants.dart. -* Fix Android build failed. -* Complete README.md for 0.1.0 -* Complete doc strings. - ---- - -## 0.0.4 - -* Add functions for String / Hex exchanging. (`utils.dart`) - -## 0.0.3 - -* Remove debug messages from `FlutterSerialPortPlugin.java` - -## 0.0.2 - -* Add `baudrate` parameter in `FlutterSerialPort.createSerialPort` - ## 0.0.1 -* Integrate Android-SerialPort-API functions. -* Implement class `SerialPort` and `Device`. +* TODO: Describe initial release. diff --git a/analysis_options.yaml b/analysis_options.yaml new file mode 100644 index 0000000..a5744c1 --- /dev/null +++ b/analysis_options.yaml @@ -0,0 +1,4 @@ +include: package:flutter_lints/flutter.yaml + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/android/.idea/.gitignore b/android/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/android/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/android/.idea/.name b/android/.idea/.name new file mode 100644 index 0000000..960a71d --- /dev/null +++ b/android/.idea/.name @@ -0,0 +1 @@ +flutter_serial_port \ No newline at end of file diff --git a/android/.idea/compiler.xml b/android/.idea/compiler.xml new file mode 100644 index 0000000..fb7f4a8 --- /dev/null +++ b/android/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/android/.idea/gradle.xml b/android/.idea/gradle.xml new file mode 100644 index 0000000..c2db994 --- /dev/null +++ b/android/.idea/gradle.xml @@ -0,0 +1,19 @@ + + + + + + \ No newline at end of file diff --git a/android/.idea/jarRepositories.xml b/android/.idea/jarRepositories.xml new file mode 100644 index 0000000..d2ce72d --- /dev/null +++ b/android/.idea/jarRepositories.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/android/.idea/misc.xml b/android/.idea/misc.xml new file mode 100644 index 0000000..2a4d5b5 --- /dev/null +++ b/android/.idea/misc.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/android/.idea/modules.xml b/android/.idea/modules.xml new file mode 100644 index 0000000..7be7dcf --- /dev/null +++ b/android/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/android/build.gradle b/android/build.gradle index 7c515d7..d7ab229 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -4,36 +4,37 @@ version '1.0' buildscript { repositories { google() - jcenter() + mavenCentral() + maven { url 'https://jitpack.io' } } dependencies { - classpath 'com.android.tools.build:gradle:3.2.1' + classpath 'com.android.tools.build:gradle:4.1.0' } } rootProject.allprojects { repositories { google() - jcenter() - maven { url "https://jitpack.io" } + mavenCentral() + maven { url 'https://jitpack.io' } } } apply plugin: 'com.android.library' android { - compileSdkVersion 28 + compileSdkVersion 30 + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } defaultConfig { minSdkVersion 16 - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" - } - lintOptions { - disable 'InvalidPackage' } } - dependencies { implementation 'com.github.licheedev.Android-SerialPort-API:serialport:1.0.1' } diff --git a/android/gradle.properties b/android/gradle.properties index 2bd6f4f..94adc3a 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,2 +1,3 @@ org.gradle.jvmargs=-Xmx1536M - +android.useAndroidX=true +android.enableJetifier=true diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 019065d..3c9d085 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip diff --git a/android/src/main/AndroidManifest.xml b/android/src/main/AndroidManifest.xml index ca91c72..c649f3b 100644 --- a/android/src/main/AndroidManifest.xml +++ b/android/src/main/AndroidManifest.xml @@ -1,4 +1,3 @@ diff --git a/android/src/main/java/com/example/flutter_serial_port/FlutterSerialPortPlugin.java b/android/src/main/java/com/example/flutter_serial_port/FlutterSerialPortPlugin.java index 5ecdc50..080100d 100644 --- a/android/src/main/java/com/example/flutter_serial_port/FlutterSerialPortPlugin.java +++ b/android/src/main/java/com/example/flutter_serial_port/FlutterSerialPortPlugin.java @@ -13,18 +13,28 @@ import android.os.Looper; import android.util.Log; -import android.serialport.SerialPort; -import android.serialport.SerialPortFinder; +import androidx.annotation.NonNull; +import io.flutter.embedding.engine.plugins.FlutterPlugin; 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.EventChannel; -import io.flutter.plugin.common.PluginRegistry.Registrar; + + +import android.serialport.SerialPort; +import android.serialport.SerialPortFinder; /** FlutterSerialPortPlugin */ -public class FlutterSerialPortPlugin implements MethodCallHandler, EventChannel.StreamHandler { +public class FlutterSerialPortPlugin implements FlutterPlugin, MethodCallHandler, EventChannel.StreamHandler { + /// The MethodChannel that will the communication between Flutter and native Android + /// + /// This local reference serves to register the plugin with the Flutter Engine and unregister it + /// when the Flutter Engine is detached from the Activity + private MethodChannel channel; + private EventChannel eventChannel; private static final String TAG = "FlutterSerialPortPlugin"; private SerialPortFinder mSerialPortFinder = new SerialPortFinder(); @@ -70,16 +80,8 @@ public void run() { } } - FlutterSerialPortPlugin(Registrar registrar) { - final EventChannel eventChannel = new EventChannel(registrar.messenger(), "serial_port/event"); - eventChannel.setStreamHandler(this); - } - /** Plugin registration. */ - public static void registerWith(Registrar registrar) { - final MethodChannel channel = new MethodChannel(registrar.messenger(), "serial_port"); - channel.setMethodCallHandler(new FlutterSerialPortPlugin(registrar)); - } + @Override public void onMethodCall(MethodCall call, Result result) { @@ -178,4 +180,18 @@ private void writeData(byte[] data) { Log.e(TAG, e.toString()); } } -} + @Override + public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) { + final EventChannel eventChannel = new EventChannel(flutterPluginBinding.getBinaryMessenger(), "serial_port/event"); + final MethodChannel channel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), "serial_port"); + channel.setMethodCallHandler(this); + eventChannel.setStreamHandler(this); + } + + @Override + public void onDetachedFromEngine(@NonNull FlutterPluginBinding binding) { + channel.setMethodCallHandler(null); + eventChannel.setStreamHandler(null); + + } +} \ No newline at end of file diff --git a/example/.gitignore b/example/.gitignore index 2ddde2a..0fa6b67 100644 --- a/example/.gitignore +++ b/example/.gitignore @@ -22,52 +22,25 @@ # Flutter/Dart/Pub related **/doc/api/ +**/ios/Flutter/.last_build_id .dart_tool/ .flutter-plugins +.flutter-plugins-dependencies .packages .pub-cache/ .pub/ /build/ -# Android related -**/android/**/gradle-wrapper.jar -**/android/.gradle -**/android/captures/ -**/android/gradlew -**/android/gradlew.bat -**/android/local.properties -**/android/**/GeneratedPluginRegistrant.java +# Web related +lib/generated_plugin_registrant.dart -# iOS/XCode related -**/ios/**/*.mode1v3 -**/ios/**/*.mode2v3 -**/ios/**/*.moved-aside -**/ios/**/*.pbxuser -**/ios/**/*.perspectivev3 -**/ios/**/*sync/ -**/ios/**/.sconsign.dblite -**/ios/**/.tags* -**/ios/**/.vagrant/ -**/ios/**/DerivedData/ -**/ios/**/Icon? -**/ios/**/Pods/ -**/ios/**/.symlinks/ -**/ios/**/profile -**/ios/**/xcuserdata -**/ios/.generated/ -**/ios/Flutter/App.framework -**/ios/Flutter/Flutter.framework -**/ios/Flutter/Generated.xcconfig -**/ios/Flutter/app.flx -**/ios/Flutter/app.zip -**/ios/Flutter/flutter_assets/ -**/ios/Flutter/flutter_export_environment.sh -**/ios/ServiceDefinitions.json -**/ios/Runner/GeneratedPluginRegistrant.* +# Symbolication related +app.*.symbols -# Exceptions to above rules. -!**/ios/**/default.mode1v3 -!**/ios/**/default.mode2v3 -!**/ios/**/default.pbxuser -!**/ios/**/default.perspectivev3 -!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages +# 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/.metadata b/example/.metadata index 386075d..0f055bf 100644 --- a/example/.metadata +++ b/example/.metadata @@ -4,7 +4,7 @@ # This file should be version controlled and should not be manually edited. version: - revision: 1aedbb1835bd6eb44550293d57d4d124f19901f0 + revision: ffb2ecea5223acdd139a5039be2f9c796962833d channel: stable project_type: app diff --git a/example/analysis_options.yaml b/example/analysis_options.yaml new file mode 100644 index 0000000..61b6c4d --- /dev/null +++ b/example/analysis_options.yaml @@ -0,0 +1,29 @@ +# This file configures the analyzer, which statically analyzes Dart code to +# check for errors, warnings, and lints. +# +# The issues identified by the analyzer are surfaced in the UI of Dart-enabled +# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be +# invoked from the command line by running `flutter analyze`. + +# The following line activates a set of recommended lints for Flutter apps, +# packages, and plugins designed to encourage good coding practices. +include: package:flutter_lints/flutter.yaml + +linter: + # The lint rules applied to this project can be customized in the + # section below to disable rules from the `package:flutter_lints/flutter.yaml` + # included above or to enable additional rules. A list of all available lints + # and their documentation is published at + # https://dart-lang.github.io/linter/lints/index.html. + # + # Instead of disabling a lint rule for the entire project in the + # section below, it can also be suppressed for a single line of code + # or a specific dart file by using the `// ignore: name_of_lint` and + # `// ignore_for_file: name_of_lint` syntax on the line or in the file + # producing the lint. + rules: + # avoid_print: false # Uncomment to disable the `avoid_print` rule + # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/example/android/.gitignore b/example/android/.gitignore new file mode 100644 index 0000000..6f56801 --- /dev/null +++ b/example/android/.gitignore @@ -0,0 +1,13 @@ +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +GeneratedPluginRegistrant.java + +# Remember to never publicly share your keystore. +# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app +key.properties +**/*.keystore +**/*.jks diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle index 7f8f914..6bbf52b 100644 --- a/example/android/app/build.gradle +++ b/example/android/app/build.gradle @@ -25,20 +25,20 @@ apply plugin: 'com.android.application' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" android { - compileSdkVersion 28 + compileSdkVersion 30 - lintOptions { - disable 'InvalidPackage' + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 } defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId "com.example.flutter_serial_port_example" + applicationId "com.example.ttt_example" minSdkVersion 16 - targetSdkVersion 28 + targetSdkVersion 30 versionCode flutterVersionCode.toInteger() versionName flutterVersionName - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { @@ -53,9 +53,3 @@ android { flutter { source '../..' } - -dependencies { - testImplementation 'junit:junit:4.12' - androidTestImplementation 'com.android.support.test:runner:1.0.2' - androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' -} diff --git a/example/android/app/src/debug/AndroidManifest.xml b/example/android/app/src/debug/AndroidManifest.xml index 1d7fe86..9461e24 100644 --- a/example/android/app/src/debug/AndroidManifest.xml +++ b/example/android/app/src/debug/AndroidManifest.xml @@ -1,5 +1,5 @@ + package="com.example.ttt_example"> diff --git a/example/android/app/src/main/AndroidManifest.xml b/example/android/app/src/main/AndroidManifest.xml index 276ace3..598a209 100644 --- a/example/android/app/src/main/AndroidManifest.xml +++ b/example/android/app/src/main/AndroidManifest.xml @@ -1,33 +1,41 @@ - - - + - + + android:name="io.flutter.embedding.android.NormalTheme" + android:resource="@style/NormalTheme" + /> + + + + diff --git a/example/android/app/src/main/java/com/example/flutter_serial_port_example/MainActivity.java b/example/android/app/src/main/java/com/example/flutter_serial_port_example/MainActivity.java deleted file mode 100644 index 7e3e590..0000000 --- a/example/android/app/src/main/java/com/example/flutter_serial_port_example/MainActivity.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.example.flutter_serial_port_example; - -import android.os.Bundle; -import android.os.Build; -import android.util.Log; - -import io.flutter.app.FlutterActivity; -import io.flutter.plugins.GeneratedPluginRegistrant; - -public class MainActivity extends FlutterActivity { - @Override - protected void onCreate(Bundle savedInstanceState) { - - Log.d("MainActivity", "VERSION.SDK_INT: " + Build.VERSION.SDK_INT); - if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT_WATCH) { - // use software rendering (ideally only when you need to) - getIntent().putExtra("enable-software-rendering", true); - } - - super.onCreate(savedInstanceState); - GeneratedPluginRegistrant.registerWith(this); - } -} diff --git a/example/android/app/src/main/java/com/example/ttt_example/MainActivity.java b/example/android/app/src/main/java/com/example/ttt_example/MainActivity.java new file mode 100644 index 0000000..bad9fdb --- /dev/null +++ b/example/android/app/src/main/java/com/example/ttt_example/MainActivity.java @@ -0,0 +1,6 @@ +package com.example.ttt_example; + +import io.flutter.embedding.android.FlutterActivity; + +public class MainActivity extends FlutterActivity { +} diff --git a/example/android/app/src/main/res/drawable-v21/launch_background.xml b/example/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 0000000..f74085f --- /dev/null +++ b/example/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/example/android/app/src/main/res/values-night/styles.xml b/example/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 0000000..449a9f9 --- /dev/null +++ b/example/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/example/android/app/src/main/res/values/styles.xml b/example/android/app/src/main/res/values/styles.xml index 00fa441..d74aa35 100644 --- a/example/android/app/src/main/res/values/styles.xml +++ b/example/android/app/src/main/res/values/styles.xml @@ -1,8 +1,18 @@ - + + diff --git a/example/android/app/src/profile/AndroidManifest.xml b/example/android/app/src/profile/AndroidManifest.xml index 1d7fe86..9461e24 100644 --- a/example/android/app/src/profile/AndroidManifest.xml +++ b/example/android/app/src/profile/AndroidManifest.xml @@ -1,5 +1,5 @@ + package="com.example.ttt_example"> diff --git a/example/android/build.gradle b/example/android/build.gradle index bb8a303..622ddc5 100644 --- a/example/android/build.gradle +++ b/example/android/build.gradle @@ -1,26 +1,24 @@ buildscript { repositories { google() - jcenter() + mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:3.2.1' + classpath 'com.android.tools.build:gradle:4.1.0' } } allprojects { repositories { google() - jcenter() + mavenCentral() } } rootProject.buildDir = '../build' subprojects { project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { project.evaluationDependsOn(':app') } diff --git a/example/android/gradle.properties b/example/android/gradle.properties index 2bd6f4f..94adc3a 100644 --- a/example/android/gradle.properties +++ b/example/android/gradle.properties @@ -1,2 +1,3 @@ org.gradle.jvmargs=-Xmx1536M - +android.useAndroidX=true +android.enableJetifier=true diff --git a/example/android/gradle/wrapper/gradle-wrapper.properties b/example/android/gradle/wrapper/gradle-wrapper.properties index 2819f02..bc6a58a 100644 --- a/example/android/gradle/wrapper/gradle-wrapper.properties +++ b/example/android/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip diff --git a/example/android/settings.gradle b/example/android/settings.gradle index 5a2f14f..44e62bc 100644 --- a/example/android/settings.gradle +++ b/example/android/settings.gradle @@ -1,15 +1,11 @@ include ':app' -def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() +def localPropertiesFile = new File(rootProject.projectDir, "local.properties") +def properties = new Properties() -def plugins = new Properties() -def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') -if (pluginsFile.exists()) { - pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } -} +assert localPropertiesFile.exists() +localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } -plugins.each { name, path -> - def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() - include ":$name" - project(":$name").projectDir = pluginDirectory -} +def flutterSdkPath = properties.getProperty("flutter.sdk") +assert flutterSdkPath != null, "flutter.sdk not set in local.properties" +apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" diff --git a/example/ios/Flutter/AppFrameworkInfo.plist b/example/ios/Flutter/AppFrameworkInfo.plist deleted file mode 100644 index 6b4c0f7..0000000 --- a/example/ios/Flutter/AppFrameworkInfo.plist +++ /dev/null @@ -1,26 +0,0 @@ - - - - - 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 - 8.0 - - diff --git a/example/ios/Flutter/Debug.xcconfig b/example/ios/Flutter/Debug.xcconfig deleted file mode 100644 index 592ceee..0000000 --- a/example/ios/Flutter/Debug.xcconfig +++ /dev/null @@ -1 +0,0 @@ -#include "Generated.xcconfig" diff --git a/example/ios/Flutter/Release.xcconfig b/example/ios/Flutter/Release.xcconfig deleted file mode 100644 index 592ceee..0000000 --- a/example/ios/Flutter/Release.xcconfig +++ /dev/null @@ -1 +0,0 @@ -#include "Generated.xcconfig" diff --git a/example/ios/Runner.xcodeproj/project.pbxproj b/example/ios/Runner.xcodeproj/project.pbxproj deleted file mode 100644 index 7cceaea..0000000 --- a/example/ios/Runner.xcodeproj/project.pbxproj +++ /dev/null @@ -1,519 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - 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 */; }; - 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; - 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; - 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; - 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; - 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 = ( - 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */, - 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */, - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 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 = ""; }; - 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; - 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; - 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.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 = ""; }; - 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; sourceTree = ""; }; - 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 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 = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 97C146EB1CF9000F007C117D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */, - 3B80C3941E831B6300D905FE /* App.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 9740EEB11CF90186004384FC /* Flutter */ = { - isa = PBXGroup; - children = ( - 3B80C3931E831B6300D905FE /* App.framework */, - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, - 9740EEBA1CF902C7004384FC /* Flutter.framework */, - 9740EEB21CF90195004384FC /* Debug.xcconfig */, - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, - 9740EEB31CF90195004384FC /* Generated.xcconfig */, - ); - name = Flutter; - sourceTree = ""; - }; - 97C146E51CF9000F007C117D = { - isa = PBXGroup; - children = ( - 9740EEB11CF90186004384FC /* Flutter */, - 97C146F01CF9000F007C117D /* Runner */, - 97C146EF1CF9000F007C117D /* Products */, - ); - sourceTree = ""; - }; - 97C146EF1CF9000F007C117D /* Products */ = { - isa = PBXGroup; - children = ( - 97C146EE1CF9000F007C117D /* Runner.app */, - ); - name = Products; - sourceTree = ""; - }; - 97C146F01CF9000F007C117D /* Runner */ = { - isa = PBXGroup; - children = ( - 97C146FA1CF9000F007C117D /* Main.storyboard */, - 97C146FD1CF9000F007C117D /* Assets.xcassets */, - 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, - 97C147021CF9000F007C117D /* Info.plist */, - 97C146F11CF9000F007C117D /* Supporting Files */, - 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, - 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, - 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, - 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, - ); - path = Runner; - sourceTree = ""; - }; - 97C146F11CF9000F007C117D /* Supporting Files */ = { - isa = PBXGroup; - children = ( - ); - name = "Supporting Files"; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 97C146ED1CF9000F007C117D /* Runner */ = { - isa = PBXNativeTarget; - buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; - buildPhases = ( - 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 = 1020; - ORGANIZATIONNAME = "The Chromium Authors"; - TargetAttributes = { - 97C146ED1CF9000F007C117D = { - CreatedOnToolsVersion = 7.3.1; - LastSwiftMigration = 0910; - }; - }; - }; - 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\" thin"; - }; - 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 = ( - 74858FAF1ED2DC5600515810 /* AppDelegate.swift 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; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - 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 = 8.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; - CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - 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 = com.example.flutterSerialPortExample; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_VERSION = 4.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Profile; - }; - 97C147031CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - 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 = 8.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 97C147041CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - 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 = 8.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 97C147061CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - 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 = com.example.flutterSerialPortExample; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 4.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Debug; - }; - 97C147071CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - 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 = com.example.flutterSerialPortExample; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_VERSION = 4.0; - 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 deleted file mode 100644 index 1d526a1..0000000 --- a/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme deleted file mode 100644 index a28140c..0000000 --- a/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/example/ios/Runner.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 1d526a1..0000000 --- a/example/ios/Runner.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/example/ios/Runner/AppDelegate.swift b/example/ios/Runner/AppDelegate.swift deleted file mode 100644 index 70693e4..0000000 --- a/example/ios/Runner/AppDelegate.swift +++ /dev/null @@ -1,13 +0,0 @@ -import UIKit -import Flutter - -@UIApplicationMain -@objc class AppDelegate: FlutterAppDelegate { - override func application( - _ application: UIApplication, - didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? - ) -> Bool { - GeneratedPluginRegistrant.register(with: self) - return super.application(application, didFinishLaunchingWithOptions: launchOptions) - } -} diff --git a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index d36b1fa..0000000 --- a/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,122 +0,0 @@ -{ - "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 deleted file mode 100644 index dc9ada4725e9b0ddb1deab583e5b5102493aa332..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10932 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 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 deleted file mode 100644 index f091b6b0bca859a3f474b03065bef75ba58a9e4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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{ 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 deleted file mode 100644 index d0ef06e7edb86cdfe0d15b4b0d98334a86163658..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1716 zcmds$`#;kQ7{|XelZftyR5~xW7?MLxS4^|Hw3&P7^y)@A9Fj{Xm1~_CIV^XZ%SLBn zA;!r`GqGHg=7>xrB{?psZQs88ZaedDoagm^KF{a*>G|dJWRSe^I$DNW008I^+;Kjt z>9p3GNR^I;v>5_`+91i(*G;u5|L+Bu6M=(afLjtkya#yZ175|z$pU~>2#^Z_pCZ7o z1c6UNcv2B3?; zX%qdxCXQpdKRz=#b*q0P%b&o)5ZrNZt7$fiETSK_VaY=mb4GK`#~0K#~9^ zcY!`#Af+4h?UMR-gMKOmpuYeN5P*RKF!(tb`)oe0j2BH1l?=>y#S5pMqkx6i{*=V9JF%>N8`ewGhRE(|WohnD59R^$_36{4>S zDFlPC5|k?;SPsDo87!B{6*7eqmMdU|QZ84>6)Kd9wNfh90=y=TFQay-0__>=<4pk& zYDjgIhL-jQ9o>z32K)BgAH+HxamL{ZL~ozu)Qqe@a`FpH=oQRA8=L-m-1dam(Ix2V z?du;LdMO+ooBelr^_y4{|44tmgH^2hSzPFd;U^!1p>6d|o)(-01z{i&Kj@)z-yfWQ)V#3Uo!_U}q3u`(fOs`_f^ueFii1xBNUB z6MecwJN$CqV&vhc+)b(p4NzGGEgwWNs z@*lUV6LaduZH)4_g!cE<2G6#+hJrWd5(|p1Z;YJ7ifVHv+n49btR}dq?HHDjl{m$T z!jLZcGkb&XS2OG~u%&R$(X+Z`CWec%QKt>NGYvd5g20)PU(dOn^7%@6kQb}C(%=vr z{?RP(z~C9DPnL{q^@pVw@|Vx~@3v!9dCaBtbh2EdtoNHm4kGxp>i#ct)7p|$QJs+U z-a3qtcPvhihub?wnJqEt>zC@)2suY?%-96cYCm$Q8R%-8$PZYsx3~QOLMDf(piXMm zB=<63yQk1AdOz#-qsEDX>>c)EES%$owHKue;?B3)8aRd}m~_)>SL3h2(9X;|+2#7X z+#2)NpD%qJvCQ0a-uzZLmz*ms+l*N}w)3LRQ*6>|Ub-fyptY(keUxw+)jfwF5K{L9 z|Cl_w=`!l_o><384d&?)$6Nh(GAm=4p_;{qVn#hI8lqewW7~wUlyBM-4Z|)cZr?Rh z=xZ&Ol>4(CU85ea(CZ^aO@2N18K>ftl8>2MqetAR53_JA>Fal`^)1Y--Am~UDa4th zKfCYpcXky$XSFDWBMIl(q=Mxj$iMBX=|j9P)^fDmF(5(5$|?Cx}DKEJa&XZP%OyE`*GvvYQ4PV&!g2|L^Q z?YG}tx;sY@GzMmsY`7r$P+F_YLz)(e}% zyakqFB<6|x9R#TdoP{R$>o7y(-`$$p0NxJ6?2B8tH)4^yF(WhqGZlM3=9Ibs$%U1w zWzcss*_c0=v_+^bfb`kBFsI`d;ElwiU%frgRB%qBjn@!0U2zZehBn|{%uNIKBA7n= zzE`nnwTP85{g;8AkYxA68>#muXa!G>xH22D1I*SiD~7C?7Za+9y7j1SHiuSkKK*^O zsZ==KO(Ua#?YUpXl{ViynyT#Hzk=}5X$e04O@fsMQjb}EMuPWFO0e&8(2N(29$@Vd zn1h8Yd>6z(*p^E{c(L0Lg=wVdupg!z@WG;E0k|4a%s7Up5C0c)55XVK*|x9RQeZ1J@1v9MX;>n34(i>=YE@Iur`0Vah(inE3VUFZNqf~tSz{1fz3Fsn_x4F>o(Yo;kpqvBe-sbwH(*Y zu$JOl0b83zu$JMvy<#oH^Wl>aWL*?aDwnS0iEAwC?DK@aT)GHRLhnz2WCvf3Ba;o=aY7 z2{Asu5MEjGOY4O#Ggz@@J;q*0`kd2n8I3BeNuMmYZf{}pg=jTdTCrIIYuW~luKecn z+E-pHY%ohj@uS0%^ z&(OxwPFPD$+#~`H?fMvi9geVLci(`K?Kj|w{rZ9JgthFHV+=6vMbK~0)Ea<&WY-NC zy-PnZft_k2tfeQ*SuC=nUj4H%SQ&Y$gbH4#2sT0cU0SdFs=*W*4hKGpuR1{)mV;Qf5pw4? zfiQgy0w3fC*w&Bj#{&=7033qFR*<*61B4f9K%CQvxEn&bsWJ{&winp;FP!KBj=(P6 z4Z_n4L7cS;ao2)ax?Tm|I1pH|uLpDSRVghkA_UtFFuZ0b2#>!8;>-_0ELjQSD-DRd z4im;599VHDZYtnWZGAB25W-e(2VrzEh|etsv2YoP#VbIZ{aFkwPrzJ#JvCvA*mXS& z`}Q^v9(W4GiSs}#s7BaN!WA2bniM$0J(#;MR>uIJ^uvgD3GS^%*ikdW6-!VFUU?JV zZc2)4cMsX@j z5HQ^e3BUzOdm}yC-xA%SY``k$rbfk z;CHqifhU*jfGM@DkYCecD9vl*qr58l6x<8URB=&%{!Cu3RO*MrKZ4VO}V6R0a zZw3Eg^0iKWM1dcTYZ0>N899=r6?+adUiBKPciJw}L$=1f4cs^bio&cr9baLF>6#BM z(F}EXe-`F=f_@`A7+Q&|QaZ??Txp_dB#lg!NH=t3$G8&06MFhwR=Iu*Im0s_b2B@| znW>X}sy~m#EW)&6E&!*0%}8UAS)wjt+A(io#wGI@Z2S+Ms1Cxl%YVE800007ip7{`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 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 deleted file mode 100644 index c8f9ed8f5cee1c98386d13b17e89f719e83555b2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 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 deleted file mode 100644 index a6d6b8609df07bf62e5100a53a01510388bd2b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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^ 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 deleted file mode 100644 index a6d6b8609df07bf62e5100a53a01510388bd2b22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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^ 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 deleted file mode 100644 index 75b2d164a5a98e212cca15ea7bf2ab5de5108680..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3831 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 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 deleted file mode 100644 index c4df70d39da7941ef3f6dcb7f06a192d8dcb308d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1888 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 iW8Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v diff --git a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png deleted file mode 100644 index 9da19eacad3b03bb08bbddbbf4ac48dd78b3d838..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v diff --git a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png deleted file mode 100644 index 9da19eacad3b03bb08bbddbbf4ac48dd78b3d838..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v diff --git a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md deleted file mode 100644 index 89c2725..0000000 --- a/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# 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 deleted file mode 100644 index f2e259c..0000000 --- a/example/ios/Runner/Base.lproj/LaunchScreen.storyboard +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/example/ios/Runner/Base.lproj/Main.storyboard b/example/ios/Runner/Base.lproj/Main.storyboard deleted file mode 100644 index f3c2851..0000000 --- a/example/ios/Runner/Base.lproj/Main.storyboard +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/example/ios/Runner/Info.plist b/example/ios/Runner/Info.plist deleted file mode 100644 index f11bb4c..0000000 --- a/example/ios/Runner/Info.plist +++ /dev/null @@ -1,45 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - flutter_serial_port_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 - - - diff --git a/example/ios/Runner/Runner-Bridging-Header.h b/example/ios/Runner/Runner-Bridging-Header.h deleted file mode 100644 index 7335fdf..0000000 --- a/example/ios/Runner/Runner-Bridging-Header.h +++ /dev/null @@ -1 +0,0 @@ -#import "GeneratedPluginRegistrant.h" \ No newline at end of file diff --git a/example/lib/main.dart b/example/lib/main.dart index a640c9f..4837f25 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -10,7 +10,7 @@ import 'package:provider/provider.dart'; void main() { runApp( ChangeNotifierProvider( - builder: (context) => AppModel(), + create: (context) => AppModel(), child: MyApp(), ), ); diff --git a/example/lib/pages/home.dart b/example/lib/pages/home.dart index d0e2d34..5e452bd 100644 --- a/example/lib/pages/home.dart +++ b/example/lib/pages/home.dart @@ -18,8 +18,8 @@ class HomePage extends StatefulWidget { class _HomePageState extends State { TextEditingController _dataController = TextEditingController(); ScrollController _scrollController = ScrollController(); - SerialPort _serialPort; - StreamSubscription _subscription; + SerialPort? _serialPort; + StreamSubscription? _subscription; bool isPortOpened = false; bool isHexMode = false; List _historyData = []; @@ -95,7 +95,7 @@ class _HomePageState extends State { Column( children: [ store.device != null - ? Text("${store.device.name} , ${store.device.path}") + ? Text("${store.device!.name} , ${store.device!.path}") : Text("Please select device"), Text("Baudrate: ${store.baudrate}"), Row( @@ -104,35 +104,27 @@ class _HomePageState extends State { child: !isPortOpened ? Text("Open") : Text("Close"), onPressed: store.device != null ? () async { - final debounceTransformer = - StreamTransformer.fromBind( - (s) => s.transform(debounceBuffer( - const Duration( - milliseconds: 500)))); + final debounceTransformer = StreamTransformer.fromBind( + (s) => s.debounceBuffer(const Duration(milliseconds: 500))); if (!isPortOpened) { - var serialPort = await FlutterSerialPort - .createSerialPort(store.device, store.baudrate); + var serialPort = + await FlutterSerialPort.createSerialPort(store.device!, store.baudrate); bool openResult = await serialPort.open(); setState(() { _serialPort = serialPort; isPortOpened = openResult; }); - _subscription = _serialPort.receiveStream - .transform(debounceTransformer) - .listen((recv) { + _subscription = + _serialPort!.receiveStream.transform(debounceTransformer).listen((recv) { print("Receive: $recv"); - String recvData = - formatReceivedData(recv); + String recvData = formatReceivedData(recv); setState(() { - _historyData - .add(Text(">>> $recvData")); + _historyData.add(Text(">>> $recvData")); }); }); print("openResult: $openResult"); } else { - bool closeResult = - await _serialPort.close(); + bool closeResult = await _serialPort!.close(); setState(() { _serialPort = null; isPortOpened = !closeResult; @@ -150,7 +142,7 @@ class _HomePageState extends State { ? () { var sentData = formatSentData(_dataController.text); print("Send: $sentData"); - _serialPort.write(Uint8List.fromList(sentData)); + _serialPort!.write(Uint8List.fromList(sentData)); setState(() { _historyData.add(Text("<<< ${_dataController.text}")); }); @@ -162,9 +154,9 @@ class _HomePageState extends State { Row( children: [ Checkbox( - onChanged: (bool value) { + onChanged: (bool? value) { setState(() { - isHexMode = value; + isHexMode = value!; }); }, value: isHexMode, @@ -203,9 +195,7 @@ class _HomePageState extends State { String formatReceivedData(recv) { if (isHexMode) { - return recv - .map((List char) => char.map((c) => intToHex(c)).join()) - .join(); + return recv.map((List char) => char.map((c) => intToHex(c)).join()).join(); } else { return recv.map((List char) => String.fromCharCodes(char)).join(); } diff --git a/example/lib/pages/setting_device.dart b/example/lib/pages/setting_device.dart index 1668065..c61634a 100644 --- a/example/lib/pages/setting_device.dart +++ b/example/lib/pages/setting_device.dart @@ -10,7 +10,7 @@ class SettingDevicePage extends StatefulWidget { } class _SettingDevicePageState extends State { - List deviceList; + List deviceList = []; @override void initState() { @@ -33,20 +33,18 @@ class _SettingDevicePageState extends State { case ConnectionState.done: if (snapshot.hasError) return Text('Error: ${snapshot.error}'); return ListView.separated( - itemCount: snapshot.data.length, + itemCount: snapshot.data?.length ?? 0, itemBuilder: (BuildContext context, int index) { return ListTile( - title: Text(snapshot.data[index].name), - subtitle: Text(snapshot.data[index].path), + title: Text(snapshot.data![index].name), + subtitle: Text(snapshot.data![index].path), onTap: () { - Provider.of(context, listen: false) - .updateDevice(snapshot.data[index]); + Provider.of(context, listen: false).updateDevice(snapshot.data![index]); Navigator.of(context).popUntil(ModalRoute.withName("/")); }, ); }, - separatorBuilder: (BuildContext context, int index) => - const Divider(height: 0.0), + separatorBuilder: (BuildContext context, int index) => const Divider(height: 0.0), ); } }, diff --git a/example/lib/stores/app.dart b/example/lib/stores/app.dart index 013100a..4d41b5e 100644 --- a/example/lib/stores/app.dart +++ b/example/lib/stores/app.dart @@ -2,10 +2,10 @@ import 'package:flutter/material.dart'; import 'package:serial_port_flutter/serial_port_flutter.dart'; class AppModel extends ChangeNotifier { - Device _device; + Device? _device; int _baudrate = 9600; - Device get device => _device; + Device? get device => _device; int get baudrate => _baudrate; void updateDevice(Device device) { @@ -17,4 +17,4 @@ class AppModel extends ChangeNotifier { _baudrate = baudrate; notifyListeners(); } -} \ No newline at end of file +} diff --git a/example/pubspec.lock b/example/pubspec.lock index f214c56..ec2854b 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -7,35 +7,56 @@ packages: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.3.0" + version: "2.8.1" boolean_selector: dependency: transitive description: name: boolean_selector url: "https://pub.dartlang.org" source: hosted - version: "1.0.5" + version: "2.1.0" + characters: + dependency: transitive + description: + name: characters + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" charcode: dependency: transitive description: name: charcode url: "https://pub.dartlang.org" source: hosted - version: "1.1.2" + version: "1.3.1" + clock: + dependency: transitive + description: + name: clock + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" collection: dependency: transitive description: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.14.11" + version: "1.15.0" cupertino_icons: dependency: "direct main" description: name: cupertino_icons url: "https://pub.dartlang.org" source: hosted - version: "0.1.2" + version: "0.1.3" + fake_async: + dependency: transitive + description: + name: fake_async + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" flutter: dependency: "direct main" description: flutter @@ -52,49 +73,42 @@ packages: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.5" + version: "0.12.10" meta: dependency: transitive description: name: meta url: "https://pub.dartlang.org" source: hosted - version: "1.1.7" - path: + version: "1.7.0" + nested: dependency: transitive description: - name: path + name: nested url: "https://pub.dartlang.org" source: hosted - version: "1.6.4" - pedantic: + version: "1.0.0" + path: dependency: transitive description: - name: pedantic + name: path url: "https://pub.dartlang.org" source: hosted - version: "1.8.0+1" + version: "1.8.0" provider: dependency: "direct main" description: name: provider url: "https://pub.dartlang.org" source: hosted - version: "3.1.0+1" - quiver: - dependency: transitive - description: - name: quiver - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.5" + version: "5.0.0" serial_port_flutter: dependency: "direct dev" description: path: ".." relative: true source: path - version: "0.1.0" + version: "0.1.0-nullsafety" sky_engine: dependency: transitive description: flutter @@ -106,62 +120,63 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.5.5" + version: "1.8.1" stack_trace: dependency: transitive description: name: stack_trace url: "https://pub.dartlang.org" source: hosted - version: "1.9.3" + version: "1.10.0" stream_channel: dependency: transitive description: name: stream_channel url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "2.1.0" stream_transform: dependency: "direct main" description: name: stream_transform url: "https://pub.dartlang.org" source: hosted - version: "0.0.19" + version: "2.0.0" string_scanner: dependency: transitive description: name: string_scanner url: "https://pub.dartlang.org" source: hosted - version: "1.0.5" + version: "1.1.0" term_glyph: dependency: transitive description: name: term_glyph url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.2.0" test_api: dependency: transitive description: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.2.5" + version: "0.4.2" typed_data: dependency: transitive description: name: typed_data url: "https://pub.dartlang.org" source: hosted - version: "1.1.6" + version: "1.3.0" vector_math: dependency: transitive description: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.0.8" + version: "2.1.0" sdks: - dart: ">=2.2.2 <3.0.0" + dart: ">=2.12.0 <3.0.0" + flutter: ">=1.20.0" diff --git a/example/pubspec.yaml b/example/pubspec.yaml index f10d0f7..ca1c7d6 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -3,7 +3,7 @@ description: Demonstrates how to use the serial_port_flutter plugin. publish_to: 'none' environment: - sdk: ">=2.1.0 <3.0.0" + sdk: ">=2.12.0 <3.0.0" dependencies: flutter: @@ -14,10 +14,9 @@ dependencies: cupertino_icons: ^0.1.2 # State Management - provider: ^3.1.0 - + provider: ^5.0.0 # Stream Utility - stream_transform: ^0.0.19 + stream_transform: ^2.0.0 dev_dependencies: flutter_test: diff --git a/example/test/widget_test.dart b/example/test/widget_test.dart index 47b9feb..00e045c 100644 --- a/example/test/widget_test.dart +++ b/example/test/widget_test.dart @@ -18,8 +18,7 @@ void main() { // Verify that platform version is retrieved. expect( find.byWidgetPredicate( - (Widget widget) => - widget is Text && widget.data.startsWith('Running on:'), + (Widget widget) => widget is Text && widget.data!.startsWith('Running on:'), ), findsOneWidget, ); diff --git a/ios/.gitignore b/ios/.gitignore deleted file mode 100644 index aa479fd..0000000 --- a/ios/.gitignore +++ /dev/null @@ -1,37 +0,0 @@ -.idea/ -.vagrant/ -.sconsign.dblite -.svn/ - -.DS_Store -*.swp -profile - -DerivedData/ -build/ -GeneratedPluginRegistrant.h -GeneratedPluginRegistrant.m - -.generated/ - -*.pbxuser -*.mode1v3 -*.mode2v3 -*.perspectivev3 - -!default.pbxuser -!default.mode1v3 -!default.mode2v3 -!default.perspectivev3 - -xcuserdata - -*.moved-aside - -*.pyc -*sync/ -Icon? -.tags* - -/Flutter/Generated.xcconfig -/Flutter/flutter_export_environment.sh \ No newline at end of file diff --git a/ios/Assets/.gitkeep b/ios/Assets/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/ios/Classes/FlutterSerialPortPlugin.h b/ios/Classes/FlutterSerialPortPlugin.h deleted file mode 100644 index e71b230..0000000 --- a/ios/Classes/FlutterSerialPortPlugin.h +++ /dev/null @@ -1,4 +0,0 @@ -#import - -@interface FlutterSerialPortPlugin : NSObject -@end diff --git a/ios/Classes/FlutterSerialPortPlugin.m b/ios/Classes/FlutterSerialPortPlugin.m deleted file mode 100644 index c3c800b..0000000 --- a/ios/Classes/FlutterSerialPortPlugin.m +++ /dev/null @@ -1,8 +0,0 @@ -#import "FlutterSerialPortPlugin.h" -#import - -@implementation FlutterSerialPortPlugin -+ (void)registerWithRegistrar:(NSObject*)registrar { - [SwiftFlutterSerialPortPlugin registerWithRegistrar:registrar]; -} -@end diff --git a/ios/Classes/SwiftFlutterSerialPortPlugin.swift b/ios/Classes/SwiftFlutterSerialPortPlugin.swift deleted file mode 100644 index 9dce055..0000000 --- a/ios/Classes/SwiftFlutterSerialPortPlugin.swift +++ /dev/null @@ -1,14 +0,0 @@ -import Flutter -import UIKit - -public class SwiftFlutterSerialPortPlugin: NSObject, FlutterPlugin { - public static func register(with registrar: FlutterPluginRegistrar) { - let channel = FlutterMethodChannel(name: "flutter_serial_port", binaryMessenger: registrar.messenger()) - let instance = SwiftFlutterSerialPortPlugin() - registrar.addMethodCallDelegate(instance, channel: channel) - } - - public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { - result("iOS " + UIDevice.current.systemVersion) - } -} diff --git a/ios/flutter_serial_port.podspec b/ios/flutter_serial_port.podspec deleted file mode 100644 index be3fda3..0000000 --- a/ios/flutter_serial_port.podspec +++ /dev/null @@ -1,21 +0,0 @@ -# -# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html -# -Pod::Spec.new do |s| - s.name = 'flutter_serial_port' - s.version = '0.0.1' - s.summary = 'A new flutter plugin project.' - s.description = <<-DESC -A new flutter plugin 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' -end - diff --git a/lib/serial_port_flutter.dart b/lib/serial_port_flutter.dart index aad2fe4..b71d087 100644 --- a/lib/serial_port_flutter.dart +++ b/lib/serial_port_flutter.dart @@ -3,24 +3,24 @@ import 'dart:typed_data'; import 'package:flutter/services.dart'; -/// +/// class FlutterSerialPort { static const MethodChannel _channel = const MethodChannel('serial_port'); /// Default plugin function - static Future get platformVersion async { - final String version = await _channel.invokeMethod('getPlatformVersion'); + static Future get platformVersion async { + final String? version = await _channel.invokeMethod('getPlatformVersion'); return version; } /// List all devices static Future> listDevices() async { - List devices = await _channel.invokeMethod("getAllDevices"); - List devicesPath = await _channel.invokeMethod("getAllDevicesPath"); + List devices = await (_channel.invokeMethod("getAllDevices") as Future) as List; + List? devicesPath = await _channel.invokeMethod("getAllDevicesPath"); - List deviceList = List(); + List deviceList = []; devices.asMap().forEach((index, deviceName) { - deviceList.add(Device(deviceName, devicesPath[index])); + deviceList.add(Device(deviceName, devicesPath![index])); }); return deviceList; } @@ -34,27 +34,24 @@ class FlutterSerialPort { /// [SerialPort] instance manage all channels between Android and Flutter, [Device] object. /// Also provides handy methods, like [open], [close], [write] and [receiveStream]. class SerialPort { - MethodChannel _channel; - EventChannel _eventChannel; - Stream _eventStream; + late MethodChannel _channel; + late EventChannel _eventChannel; + late Stream _eventStream; Device device; int baudrate; - bool _deviceConnected; - - SerialPort(String methodChannelName, Device device, int baudrate) { - this.device = device; - this.baudrate = baudrate; - this._channel = MethodChannel(methodChannelName); - this._eventChannel = EventChannel("$methodChannelName/event"); - this._deviceConnected = false; + bool _deviceConnected = false; + + SerialPort(String methodChannelName, this.device, this.baudrate) { + _channel = MethodChannel(methodChannelName); + _eventChannel = EventChannel("$methodChannelName/event"); + _eventStream = _eventChannel.receiveBroadcastStream().map((dynamic value) => value); } bool get isConnected => _deviceConnected; /// Stream(Event) coming from Android - Stream get receiveStream { - _eventStream = _eventChannel.receiveBroadcastStream().map((dynamic value) => value); - return _eventStream; + Stream get receiveStream { + return _eventStream as Stream; } @override @@ -64,8 +61,8 @@ class SerialPort { /// Open device Future open() async { - bool openResult = await _channel.invokeMethod( - "open", {'devicePath': device.path, 'baudrate': baudrate}); + bool openResult = await (_channel.invokeMethod("open", {'devicePath': device.path, 'baudrate': baudrate}) + as Future) as bool; if (openResult) { _deviceConnected = true; @@ -76,7 +73,7 @@ class SerialPort { /// Close device Future close() async { - bool closeResult = await _channel.invokeMethod("close"); + bool closeResult = await (_channel.invokeMethod("close") as Future) as bool; if (closeResult) { _deviceConnected = false; diff --git a/pubspec.lock b/pubspec.lock index aebdafa..00e6c32 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -7,73 +7,94 @@ packages: name: async url: "https://pub.dartlang.org" source: hosted - version: "2.3.0" + version: "2.8.1" boolean_selector: dependency: transitive description: name: boolean_selector url: "https://pub.dartlang.org" source: hosted - version: "1.0.5" + version: "2.1.0" + characters: + dependency: transitive + description: + name: characters + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" charcode: dependency: transitive description: name: charcode url: "https://pub.dartlang.org" source: hosted - version: "1.1.2" + version: "1.3.1" + clock: + dependency: transitive + description: + name: clock + url: "https://pub.dartlang.org" + source: hosted + version: "1.1.0" collection: dependency: transitive description: name: collection url: "https://pub.dartlang.org" source: hosted - version: "1.14.11" + version: "1.15.0" + fake_async: + dependency: transitive + description: + name: fake_async + url: "https://pub.dartlang.org" + source: hosted + version: "1.2.0" flutter: dependency: "direct main" description: flutter source: sdk version: "0.0.0" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.4" flutter_test: dependency: "direct dev" description: flutter source: sdk version: "0.0.0" + lints: + dependency: transitive + description: + name: lints + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1" matcher: dependency: transitive description: name: matcher url: "https://pub.dartlang.org" source: hosted - version: "0.12.5" + version: "0.12.10" meta: dependency: transitive description: name: meta url: "https://pub.dartlang.org" source: hosted - version: "1.1.7" + version: "1.7.0" path: dependency: transitive description: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.6.4" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.8.0+1" - quiver: - dependency: transitive - description: - name: quiver - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.5" + version: "1.8.0" sky_engine: dependency: transitive description: flutter @@ -85,55 +106,56 @@ packages: name: source_span url: "https://pub.dartlang.org" source: hosted - version: "1.5.5" + version: "1.8.1" stack_trace: dependency: transitive description: name: stack_trace url: "https://pub.dartlang.org" source: hosted - version: "1.9.3" + version: "1.10.0" stream_channel: dependency: transitive description: name: stream_channel url: "https://pub.dartlang.org" source: hosted - version: "2.0.0" + version: "2.1.0" string_scanner: dependency: transitive description: name: string_scanner url: "https://pub.dartlang.org" source: hosted - version: "1.0.5" + version: "1.1.0" term_glyph: dependency: transitive description: name: term_glyph url: "https://pub.dartlang.org" source: hosted - version: "1.1.0" + version: "1.2.0" test_api: dependency: transitive description: name: test_api url: "https://pub.dartlang.org" source: hosted - version: "0.2.5" + version: "0.4.2" typed_data: dependency: transitive description: name: typed_data url: "https://pub.dartlang.org" source: hosted - version: "1.1.6" + version: "1.3.0" vector_math: dependency: transitive description: name: vector_math url: "https://pub.dartlang.org" source: hosted - version: "2.0.8" + version: "2.1.0" sdks: - dart: ">=2.2.2 <3.0.0" + dart: ">=2.12.0 <3.0.0" + flutter: ">=1.20.0" diff --git a/pubspec.yaml b/pubspec.yaml index 408ca09..c890db0 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,11 +1,12 @@ name: serial_port_flutter description: A Flutter plugin integrated with Android-SerialPort-API, for connecting real device by serial port. -version: 0.1.0 +version: 0.1.0-nullsafety author: Bobson Lin homepage: https://github.com/BbsonLin/flutter_serial_port environment: - sdk: ">=2.1.0 <3.0.0" + sdk: ">=2.12.0 <3.0.0" + flutter: ">=1.20.0" dependencies: flutter: @@ -14,6 +15,7 @@ dependencies: dev_dependencies: flutter_test: sdk: flutter + flutter_lints: ^1.0.0 # For information on the generic Dart part of this file, see the # following page: https://dart.dev/tools/pub/pubspec @@ -21,17 +23,19 @@ dev_dependencies: # The following section is specific to Flutter. flutter: # This section identifies this Flutter project as a plugin project. - # The androidPackage and pluginClass identifiers should not ordinarily + # The 'pluginClass' and Android 'package' identifiers should not ordinarily # be modified. They are used by the tooling to maintain consistency when # adding or updating assets for this project. plugin: - androidPackage: com.example.flutter_serial_port - pluginClass: FlutterSerialPortPlugin + platforms: + android: + package: com.example.flutter_serial_port + pluginClass: FlutterSerialPortPlugin # To add assets to your plugin package, add an assets section, like this: # assets: - # - images/a_dot_burr.jpeg - # - images/a_dot_ham.jpeg + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg # # For details regarding assets in packages, see # https://flutter.dev/assets-and-images/#from-packages diff --git a/test/flutter_serial_port_test.dart b/test/flutter_serial_port_test.dart new file mode 100644 index 0000000..f96e5d7 --- /dev/null +++ b/test/flutter_serial_port_test.dart @@ -0,0 +1,23 @@ +import 'package:flutter/services.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:serial_port_flutter/serial_port_flutter.dart'; + +void main() { + const MethodChannel channel = MethodChannel('flutter_serial_port'); + + TestWidgetsFlutterBinding.ensureInitialized(); + + setUp(() { + channel.setMockMethodCallHandler((MethodCall methodCall) async { + return '42'; + }); + }); + + tearDown(() { + channel.setMockMethodCallHandler(null); + }); + + test('getPlatformVersion', () async { + expect(await FlutterSerialPort.platformVersion, '42'); + }); +} From 27601a8438dda30f63210fec371adffc4434729e Mon Sep 17 00:00:00 2001 From: AzizMarashly Date: Fri, 19 Sep 2025 20:29:50 +0300 Subject: [PATCH 2/2] fix: fix licheedev.Android-SerialPort-API dependence and precomplile the lib. --- android/build.gradle | 3 - .../android_serialport_api/SerialPort.java | 113 ++++++++++++++++ .../SerialPortFinder.java | 128 ++++++++++++++++++ .../main/jniLibs/arm64-v8a/libserial_port.so | Bin 0 -> 9904 bytes .../jniLibs/armeabi-v7a/libserial_port.so | Bin 0 -> 9632 bytes .../main/jniLibs/armeabi/libserial_port.so | Bin 0 -> 9628 bytes .../src/main/jniLibs/mips/libserial_port.so | Bin 0 -> 71224 bytes .../src/main/jniLibs/mips64/libserial_port.so | Bin 0 -> 10480 bytes .../src/main/jniLibs/x86/libserial_port.so | Bin 0 -> 5476 bytes .../src/main/jniLibs/x86_64/libserial_port.so | Bin 0 -> 10176 bytes 10 files changed, 241 insertions(+), 3 deletions(-) create mode 100644 android/src/main/java/android_serialport_api/SerialPort.java create mode 100644 android/src/main/java/android_serialport_api/SerialPortFinder.java create mode 100644 android/src/main/jniLibs/arm64-v8a/libserial_port.so create mode 100644 android/src/main/jniLibs/armeabi-v7a/libserial_port.so create mode 100644 android/src/main/jniLibs/armeabi/libserial_port.so create mode 100644 android/src/main/jniLibs/mips/libserial_port.so create mode 100644 android/src/main/jniLibs/mips64/libserial_port.so create mode 100644 android/src/main/jniLibs/x86/libserial_port.so create mode 100644 android/src/main/jniLibs/x86_64/libserial_port.so diff --git a/android/build.gradle b/android/build.gradle index d7ab229..bced149 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -5,7 +5,6 @@ buildscript { repositories { google() mavenCentral() - maven { url 'https://jitpack.io' } } dependencies { @@ -17,7 +16,6 @@ rootProject.allprojects { repositories { google() mavenCentral() - maven { url 'https://jitpack.io' } } } @@ -36,5 +34,4 @@ android { } } dependencies { - implementation 'com.github.licheedev.Android-SerialPort-API:serialport:1.0.1' } diff --git a/android/src/main/java/android_serialport_api/SerialPort.java b/android/src/main/java/android_serialport_api/SerialPort.java new file mode 100644 index 0000000..cc189d2 --- /dev/null +++ b/android/src/main/java/android_serialport_api/SerialPort.java @@ -0,0 +1,113 @@ +/* + * Copyright 2009 Cedric Priscal + * + * 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. + */ + +package android.serialport; + +import android.util.Log; +import java.io.File; +import java.io.FileDescriptor; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +public class SerialPort { + + private static final String TAG = "SerialPort"; + + private static final String DEFAULT_SU_PATH = "/system/bin/su"; + + private static String sSuPath = DEFAULT_SU_PATH; + + /** + * Set the su binary path, the default su binary path is {@link #DEFAULT_SU_PATH} + * + * @param suPath su binary path + */ + public static void setSuPath(String suPath) { + if (suPath == null) { + return; + } + sSuPath = suPath; + } + + /* + * Do not remove or rename the field mFd: it is used by native method close(); + */ + private FileDescriptor mFd; + private FileInputStream mFileInputStream; + private FileOutputStream mFileOutputStream; + + public SerialPort(File device, int baudrate, int flags) throws SecurityException, IOException { + + /* Check access permission */ + if (!device.canRead() || !device.canWrite()) { + try { + /* Missing read/write permission, trying to chmod the file */ + Process su; + su = Runtime.getRuntime().exec(sSuPath); + String cmd = "chmod 666 " + device.getAbsolutePath() + "\n" + "exit\n"; + su.getOutputStream().write(cmd.getBytes()); + if ((su.waitFor() != 0) || !device.canRead() || !device.canWrite()) { + throw new SecurityException(); + } + } catch (Exception e) { + e.printStackTrace(); + throw new SecurityException(); + } + } + + mFd = open(device.getAbsolutePath(), baudrate, flags); + if (mFd == null) { + Log.e(TAG, "native open returns null"); + throw new IOException(); + } + mFileInputStream = new FileInputStream(mFd); + mFileOutputStream = new FileOutputStream(mFd); + } + + public SerialPort(String devicePath, int baudrate, int flags) + throws SecurityException, IOException { + this(new File(devicePath), baudrate, flags); + } + + public SerialPort(File device, int baudrate) throws SecurityException, IOException { + this(device, baudrate, 0); + } + + public SerialPort(String devicePath, int baudrate) throws SecurityException, IOException { + this(new File(devicePath), baudrate, 0); + } + + // Getters and setters + public InputStream getInputStream() { + return mFileInputStream; + } + + public OutputStream getOutputStream() { + return mFileOutputStream; + } + + // JNI + private native static FileDescriptor open(String path, int baudrate, int flags); + + public native void close(); + + static { + System.loadLibrary("serial_port"); + } +} diff --git a/android/src/main/java/android_serialport_api/SerialPortFinder.java b/android/src/main/java/android_serialport_api/SerialPortFinder.java new file mode 100644 index 0000000..229a984 --- /dev/null +++ b/android/src/main/java/android_serialport_api/SerialPortFinder.java @@ -0,0 +1,128 @@ +/* + * Copyright 2009 Cedric Priscal + * + * 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. + */ + +package android.serialport; + +import android.util.Log; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.io.LineNumberReader; +import java.util.Iterator; +import java.util.Vector; + +public class SerialPortFinder { + + public class Driver { + public Driver(String name, String root) { + mDriverName = name; + mDeviceRoot = root; + } + + private String mDriverName; + private String mDeviceRoot; + Vector mDevices = null; + + public Vector getDevices() { + if (mDevices == null) { + mDevices = new Vector(); + File dev = new File("/dev"); + + File[] files = dev.listFiles(); + + if (files != null) { + int i; + for (i = 0; i < files.length; i++) { + if (files[i].getAbsolutePath().startsWith(mDeviceRoot)) { + Log.d(TAG, "Found new device: " + files[i]); + mDevices.add(files[i]); + } + } + } + } + return mDevices; + } + + public String getName() { + return mDriverName; + } + } + + private static final String TAG = "SerialPort"; + + private Vector mDrivers = null; + + Vector getDrivers() throws IOException { + if (mDrivers == null) { + mDrivers = new Vector(); + LineNumberReader r = new LineNumberReader(new FileReader("/proc/tty/drivers")); + String l; + while ((l = r.readLine()) != null) { + // Issue 3: + // Since driver name may contain spaces, we do not extract driver name with split() + String drivername = l.substring(0, 0x15).trim(); + String[] w = l.split(" +"); + if ((w.length >= 5) && (w[w.length - 1].equals("serial"))) { + Log.d(TAG, "Found new driver " + drivername + " on " + w[w.length - 4]); + mDrivers.add(new Driver(drivername, w[w.length - 4])); + } + } + r.close(); + } + return mDrivers; + } + + public String[] getAllDevices() { + Vector devices = new Vector(); + // Parse each driver + Iterator itdriv; + try { + itdriv = getDrivers().iterator(); + while (itdriv.hasNext()) { + Driver driver = itdriv.next(); + Iterator itdev = driver.getDevices().iterator(); + while (itdev.hasNext()) { + String device = itdev.next().getName(); + String value = String.format("%s (%s)", device, driver.getName()); + devices.add(value); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + return devices.toArray(new String[devices.size()]); + } + + public String[] getAllDevicesPath() { + Vector devices = new Vector(); + // Parse each driver + Iterator itdriv; + try { + itdriv = getDrivers().iterator(); + while (itdriv.hasNext()) { + Driver driver = itdriv.next(); + Iterator itdev = driver.getDevices().iterator(); + while (itdev.hasNext()) { + String device = itdev.next().getAbsolutePath(); + devices.add(device); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + return devices.toArray(new String[devices.size()]); + } +} diff --git a/android/src/main/jniLibs/arm64-v8a/libserial_port.so b/android/src/main/jniLibs/arm64-v8a/libserial_port.so new file mode 100644 index 0000000000000000000000000000000000000000..c204608bb3bf1210e0ca69a7296297359ab5afdc GIT binary patch literal 9904 zcmeHNeQaCR6~FdNlh^OiI!(LM=4ETA)B+RS!n&04Mfh!9L$QrMJj40TYlW-Rr7=e~RF zS2vcB*#7gip3nEW=bZcQeb?`L;P(A{oeqcKrimX5qI|l=@hL%ltwI2NV!Noo_Zm?p zbrf7S?w;L_HfUdCvwb28Jh`7M~&85u5CeDZ69Jj-gO?3{@JU3^sI4 zs8kE#CdjBUBwcC;{+tdGKDAPk*TCy7wqVG1UxppU`B9rHlkltliq&OU<;PH^BXe`1 zGYwbsm+lf*p1ZGi$Y$V&0g ztX{y6Kuq}-HnLub|6~#Vqeb|8C4Y%{P~Cu0mFSTo`tO6kP@Lf800;zB^Vn%!7$#mc=55tp^v{rGOuDGu2}5Ij3luX+Gwk zahysH2)*lB4Rm(UKO+=f4!YrlzfRGwEEO&K_#=MOJ+%tBaZ=(hxC${<=>3 zC!7{Nv>1JSJ|CYCe)Pdd{B=t1xDNd~j`)vLzo#9Ee=LIk7H47^>;_(NB=F#E8CdH~ zya>BlZKHRH`fGT?ud95A5T7m{&gDD44D_bQa(ecW?I@*J?6t=Q;ohu-<6V%xxkNQ{Fw zaDyXJyM$t{@dhB%efcpkDCWUof2SIgY0$lh@h;Mf=4)qAjKjnJ3C)V>d!Ty}(-)yP zaE~+5im@Fqw8S*vY(`6ke>Uu3N!}jq5C6r_(og0dsLmTRk?dxyJM#G|dS| z!{l1{{1@iY8E1`mZF570`e=H2M`jA~PHSt&-qNba-qxzz?_J40J_URl_?y5#(1cs+ zw%%sbt#Z#mMtyNV7ht20T76Lt6#uz$ar3xCv`G6Y%l-}6p}vT(%Kazctq!s6s+@g0 zGgKdGbCPUoyuXGX)>79L>|O#+a9UgA{;3V00B+@7<(@`;UIjhwEbu+FQ~LXfw5xKT z2fU=!jLG!|Yfg=0@!w6{TT`gpe19|6rM+06ZXdlI*fTn}-ZzJJD?{rVf zeVtF%nE01aV~QR7-C_NkzPYAtyE4H8yK>_}V?lbXgE1V_4>!&=wL)*`T0I&wuCbn= zv0XF9KB%vp>`WtM)fmSrH_3m6b+#Y*&EEZUKvW_hRD!bYQ^ao(;v#mP5EG~ z$7+!i;|#(%kA;ko0NA1%}fOkx?@p&rVJ;|mk_z4C1eLbIFRw_Q;C&_kE`Qvx<<4VBqGSVUey7i8l%1+0<{wZr=fVE@oj=nIRX5_pY&K4~ z>Q3M%u%zpizifg0qN1;;#ODg+?Dzi-dsO28YnVGPR|z!l-u*eF4kyQ3jBTFJdio4+ z{mr-3-|XFL)b%98$#67mrovl9qji{O1fwQieDsEssYpC#+~TSCY^|@a-(GJRb!|`# z8Q|{UfA9{QXp0aYdcP4clS%Wi@ZiWU!Z?oW(!$db$5$}k-5tiUng@NFo}MT$9B~Ox z=x{8B12a#!GtiziyTgIb5U7sWA&-h808-jO^D2R5d$?P8I?YsP-h=Sql}=c?Xgd^% zhHi|6q^j8+2?|fD6WyiFHaLyTV>gfd{j3%zA@begytIC z^Za7yQHmTt>oN30PIH%Op1%wYWl!-_-yFYU3lj***q+xDhMXt&&-Tp6S%9=}QVw~2 zV#whhPjOJ2QV$M> z^AgxJTh!zrz2;@N+~O;j6I!Zxz_*4w6-ZoouKe*N@p02ZhYz!_PPVzsy4V zY)g>Ndg)x3?fLoFM}Jg6<2qYZe*Bnz1_+gy?Rg#L|0D5@#d&i)?3doIQVuzL^*lUg zy>=BeKkbd}8U6x7yS*^f$QYIt>#>hQ`ZEv^kNfBU#pniGTn&}?9CH&e;??Ik7Q*(S Z0zTU_d=_%<+pZclEb3)D6FA#3`@hCSZnOXZ literal 0 HcmV?d00001 diff --git a/android/src/main/jniLibs/armeabi-v7a/libserial_port.so b/android/src/main/jniLibs/armeabi-v7a/libserial_port.so new file mode 100644 index 0000000000000000000000000000000000000000..2df9f974ce537bc23013796a73791087e4a5e05f GIT binary patch literal 9632 zcmeHNdw5jUwcqD4$z+l+1Edhb>m&j0z(C$e1eM8aCm|Jevdste4@@ zezw&bz)}>yg2?R+484AWxwF3DgskQAeQqXdiiyqnH6b zAzHWMVp|Qwzbb}*XwkG;o5WZYHYf4T2cQ;@Ri{Q2n}_>>s;H-g1-t z-J9fRN6BNs9|k_OF!nkq_4hWYoP`UDjScGOK}X9MZjwJF!$_g{K8gyUX+Zp_0aN|B zQL+Mg)=lz)n`Bl|QN7MpvD(w4au(J9;3~2Vw;+48__6gRNu6wqPfM>*v5cp7UeI9)KBnsuz9wxPOtJ*p`oRkdq8jTP1PwXVjs%@JMO`sUh- z23K3PJEEv|)z??7ZLD3_TwC2%TSNK62qT$mh|rpPVrVYVT&B4l4_JX%AX=!N%J?v0 zV?YxDGmrq#TBSnw`2Q-jRz?@P-I#txG4=&;wEp74D%u86MEsE@(eR%Dnf|EXXx~v? zQ^F79X)IKxhKXVO74Ttyj8!L6Z{lY%?LiZv>A->{dN@KmBlJXsz7nDPLBE0^UnXj0 ztd}T~;{%<5fX)y_$Y+USK<9~~OO+^+{60}6xSuGJc!j7Hdl6A2cZev04G~51hlwJ& zvO4dgtnRruMtw>(Yd^o3FbBb&dg@Q&8&CWx;rc5Vqr5zdAO7TX{m>}>$|(N*QT+K) z{FzbwZ$|O2kK$h$#lH+*W_vC&_LO=~*DrU>Mtp4fpQq`Wf=$o7z-)UjBq)0>Ccs8i zo>Ix~x3Jp^yYsrPYsaM{^FCm)PjqhLe+)e#wew@wCX}x$W^U$=Z=ZOsIIvjh4OrQh z!kOofUAvIE>|IFlTRIENYxu zD|)!q@`l>rD17gSj)%@SI+*rj?{^$dZ8d!6Sx&0UKGto$0W++tjaZqs&AT+9Ko@Ix zSP2jFEe8=H9@3*xz@)FtB%dIK~#=vOsTT zZ(yF`Cj)+Nw|rY=4v#O#@sRIM#4rQxb1aXlt9{7FVy89*Ho2Bo)dl%NlT%AV{X$Ef zdUv2QD?HY(`pN=cjBc9YQ-=K_%LD38$KAfu@Hgx&*KV=ggE2AWgT_=so->`=U%Ul@ z1s1M4A@4-y`(Sy8=hGQO*H#WE9Lu}@OIRqWtg6JyxURIUdbuiAMwX!F$=eh+F>c`l@? ztJJ=L&*8pMhtaxuip^KPWH~I>7wf^5SH*)_yd)qL=)qN2mv=2k&HCb*YUPqj&=^Gz z7G9m9iiezmfqSjL?kE!5Q#FA}?PY;GSxG=FNWYA?pmyZJmIh8d=)7!Ua(fnf&bfM` zt8htC#LKj+q|3O}RpsNj*5jh;`AD&7SqeWxTyq<`jGW zzJ)KOBKob%%XmlWW?rjb+El)hOHGs^lOfOMg~)*~^m0KN-&^`> zU-pvhrR$3~6z}L0u|`X<2bJTY>1kY}gdeF2JyVsLt;!>wHn+06-nFJx$yzrPFDmp5 zwa->o*C@9uGw~v0LffLI#?_uRYw?WzLVNZh_PDm{HMMQ7wzd{(ghwo%SZt4>Z~ZI% z66kO9G^$f)=?N8=Kk`>fQ*BcA&A)pT~YWJQI6tc#nyf`Qu!1 zzuKfAYcb$bj2x1*2~zUD;Y6R%9y4fWPR!(Uy0H7%68ZOEFR}RKLH*YE`-J?> zCFXbJK_UJReTiIB*-Sy*Typg-JC`u$w5J4nj8C+ieXF`-%4kM5mzp9}j!>pFmo}y| z_7Jcdm~rQVRjE*#KdD*Wlyf#=#~dy^ zqX&2DCeG{wK0WxjUgs7Zdut>=OE;m-RP1%8L79o~sx?Bor0T&(be68xsP*Z!lAAf= z-hJ&OsZtLf(3xFvCG^B8Od+cpU2%cy%sROoapgrIxoyW~el|Al%y><-%7bN0^f4`T zLr|Ia;f-|n*J7nJ@}LhB=VM4IBwg!hW?B%^xfm0q{^pbYHr&^oS8OLGcYIg!s^-#U z-dq}oOyKXhi6?M7Pp#L3>-89J?$U$zT}iJOl-WFu*SQ>?U8QFGRbQ+<;LkFwF6zou zroC`u-UnKF;#6NK!5fQtmE69aTi<-~TI*xdVezHJYeSD(U$?#)#t-{3NoH=vb$(?& z&qhzh`cDU$HKC_mi?ft#7K_Zi-MRJIynIM&S;Zf9>A{pMi#*Hut^9t>-E*P*EE5;i zV|7b4o29izP@e2}iYxd+zKHjhws$|*oyEUqwB3hUG(2FQ_iJD5ycoY?^!21JbujJD z8_2V&@I*vNGsRioT>9%ejG-WLYJ5#BAHzeP);ER2{rrn@Q`F^}p38RR^RpqRO%Glg zS=YVDb1QZt%8bkdJ|}v0=rMC8KSl@sUOi4(NAq!$?f7QbyLG>)oP_mdbEed=wCX;} zc#$W8pK{07OzRTT^x*yacvbSu=Ax1YpRsn6&uq8&aZlhYQx9i-j*<2L>w54z1FyO* z-Fk3u&l`0XcwE@mT)M?A@c1r4NyZ&z$K~0!vw!RtG%3-Vn8@zww$3r1Wdoa;@N9uQ znUAd$RROsWm2ZUP8`Fkhti`T|HX8p~?7bm=A{iXFcVLXite;a7vl;_+^ zJo7L^a!1TvaWj(CES``$2a)|2c_`o~N}2s5zr$n3?94%~Ovu0Ji?hG)@9(3hk$Z&h z@EE$on`nMc0GC!4mPJ1V9@ugC*i&~|ZgrPm{{4n$r(lJ8gVZXK1XL zdY$fP_ClYydvdJsHk*69KXK3&|0+knlC)!ANtI99Z5b3SF$3RY@(w-N^C?SvfQMtq z!x%pF%`kd;JEZK@gWV&WOQsloO~PI}P$j1yu5wg=lw4Pxi+wZk-O4F3174;Fe>ZGR z6**<}wUKzY7fqG~$11;&S$;XGZ2wVtz#Q|S zf2k^E-tC{2u>a@_lWdM9XC?Qf*qFD|HM1mDGGpJL`iXKRcHmS@K9}!c+JsLI)ky=d z%P$nlzI#HlgNNkIP~V|yWKFvi%2P{!W}7<;Ufzu%FE+zVKb{`5K2cuEf=${d2kVf< zRN=a$DTvmFXn81|3AwUk2yv24%qKS0mLZ)zF=(|q13&PJ$~INVH2284Lgu0BV!wjj zcUOoh-%*te&9IW*nZ?=MBL5h)Tl zzGp=7U+=W{6&g(6J;@t^QzA^98a{krucXD8dQq{d?}@9{=x`xPZ3hp8_j z_eQ98MHGOsKq`<86aXs#7w}DB6R-_<9_Rvo0r-Inz##Rd!Ur%GNCmQi0$>H;0=@}s z0=5Cq16{x`06%a6Fnn|l3!8v#!1F*C`P~a0unl+~FmzWqJC5Jd%jbQdPsbafH1C51 zM(WF73pd)%4@^R82?=KMUs%N1v;KKI{-hY}U6sP26hi zVQ2JCJjKTOS%y=yZ;}pY;};Hl+Rn$|&0x|naoOCOM!)>#4^ObV9DwcL+s7%u&uVbQL7HQx6 zk**YVUSs8gKTa7?Wr3yI`M#s{9`M|!%sxcBQF(HYFzZlXJK8WUQA%`t;A5%i)oiC; zy|QK%$^Mr&NTT+MX(X#Rw)O3GjPaKbZLE5&NYY{@mYPx^#fp&aysW2i$Xl4Gb~?)a zUG{jqHR-_>x`_AbpZaW?Cj1B9ed76U^{9QOAHAhXhe>8n>%na|$aaxlu8C%w<`tyf zOxwufeC)beGY`g^lZ&NxvY4a)rBAvhw30r#m_02aKV5yt@K!~&lXW4LA#%!wkYnd5 z$jh+wvSabkqeqw)D`LNcws450{j9IovDAOco?x`oN2D*bE4(b_9PIl~d!kXRjnD`d z4}I+j#vpARy7!2k%c=SB9g=#nFHnzC#Iut2gTB*|c4tN?8V%7{nJuSiik%l-7IP-6 zzp`%}$~{8yzGhf_9xwG9Z}{~&HV&oU6tgK^556+Y&^qbJZ!a;$MElH^>BnEIH{;jM z{qAw1uw5E7i{f?(?>Gs{x%E$m60`K+v61kbpZT~RJUrs9H=iW#-$!1nKf7MSbJv_j znvo#CO4s76_}*XI%USQ9i&pIkb@>%tFZmJH{-I_so`@{WcN)C83;IsBmGobR-*rXb z__D5V9MbfSCqO#~fzD3vPl+B8y(xjPTuk(U=sj=99p1E$!uq)eJ?MQ9^hnE5Z_-d$ zZv#ENc!BpJL+@|nN zeiJ|sFBZIc*Y%C`CHU-(uznbn{3HyAdt!TACE+rP_M&1XN+*{Guj%KAUcKQr*p4E%pHu#66#B1HmyJu`f+ zQwg5VW6E%LLT5VojAwujk?}c^l>u}nWd^S6dK0-JtiqzEb1ZyjGtQfL;Y`K?-VMDB zN*7x9ci}?xs}Wiep>$S6XI%8tBL$%Ip(&u$4~~r4hgH`W*ZZ zgT4;>X+%E)szSywhhYcPf4Dr4LH`?YfCf(mLD2d2&7}kR`A1;1FD)ussMv9oJzL4k zxHV&)l9QD^KPx*YSFty@)V9>(w6V2zHY*4psVdd=E_}s(xVEL$)6}TU&&bNi&C1Hk z&r%e76%1<>XqPR!@2*i*_;MM}SzLtDx%rx=`WhuWBRdnCDp+}! z^6&x{V~H&=3vr@F9xINMlZ3Ab6QyJ!MVuz43A2P^fo0Ig;0jkui)%g0z;UrB%ELiM z_y9En$HHwaV@(q-)lCfzwK(U^z^F2s>%rg{mSvDJeS!8=t!=A?T(iEhwXFqh8rNn- z23i4;8lmb7dX|BY&b5Xm4QO7(JnUnA1Iuu`THT|Js@8g7<*E6ClM0A%>}v2-hl4@H zt}2$%>P8p_*V1I19cLI^EvxfGUcc{L%lh$gmq-$Ojd4W%wgkRLHK@;KCQOBWwXi|6fGC5}toh8ztH=hlDSZ) zU;EFVe7^VhIKT5d@87v|Pd0sdS%n}7lujmcQ(Bq>6%BK0|Q&$&C+ zm0p%(^4>kv;CR3L%>|p`+piGZyhDy zJ4)U=LLLYHN#M*FqLZLp-y5Kk4-X_8ePr~3j+D=glK-0xQ;FO6`?LV+1hPhSnDg^S z$O`1?qvXp*$y8NUyFOTTTcjaaAGxcJmMsaCQ+=eS*4xs^w56^&60EOkYHV(0P0~8p zTDLyZO4kJM2v!9fLd}hlP*u{9?W+DEQD!-_jZJk8D3ms;Z(LQ?)EsGOr9?)gv9`6I zYU>+Y>R{B;8mwJYRU2MYbz3k}{{_XWb;0J)-%?-7S6wLB8llvUxyi>Q+S>s%q=&f(`4MQo7a+O?6dk zgRQmUl%h6RUthJZp>BOsU2SV!h{p>(OpV;y6b;og!)t-pGOz6{AQ!Lz>BRY*#wQ8o zfQ|*MKsLa8l@rhL|CV^Kj7&V;Sbm9=hzsC&|79js90rg?{IMm||!+b)b{tpm+yZs`?F(b)4Vi-KmY0H`cFpi=SJ|q9KrXE z;9noX|7-+*as+>D1b-B~MElMXZP(v1jNf$4MEhv@`$a~HU^7b2kZu2&Y-QisY}km( zcAf2Bf!#f@>oW`^-eY=td-nva!&8gbFQPDobJ~2)lZ#I-xi2vBU4G8!dj-#{`!qbm zeM=on#QOrI?bpvZGQkN)rDLT1oBp(JD3|)S29$SSTD&#j@8jpjzNN}$V(Z8CUfLQU z^&x$}^Pv7TJh}Rg;<==+2hVS){3P`O-Rcu*kG|G(>ASl;i~1Tox2xaskh)o)<9twm z3O4?}Gmf92)>Z10kk)Bp;THX2a98zx2hXpo{9LVN!^<7|6KKIAv|yotcB@fgYv3QX zE1j!#@`TkgPf%Uzxk)Q?)}SBPh_OJqdN2Gg)3(UB=nt|-m7j~WG4Qoq-|d;NzT~+| zo9Dbne*pT~Dtd3aFEB^jQn*n6CulBJ6HhG%_Ve|n3ZcGI^^C&(c4!NnUg%y#OJ=Gh zZVlMAFFB{_S36z$i9&}y+c`x)As6adD4VYbWV@aTZlXTdIbIJGj?>3N%F#2F$Cqqa z^!PP*En2Q$=FHHqa7ucqQ`9eal75v_XrJ)#K_yD1;j9(rLq0O?mUcR*qf#Pqr#RhP z9sZzwOq$cSU*2V?kqJ!NqTmnm3PAGPFQ_s(4p5YHt!Mq<{g5Pv1fC6 z#*UiBR>;;J!NnF(p~G5kX^Y70ONj4=r}6N#66IH-{N01BjSbSY)#;VF$Dcn}b5m}2 z{J0X{61f?c3bj?5N!q1^?{WB7h;26-7twQ*Tt?`)DD+FyC1Ux=?9?5)VgUMWRvFm@4L9mu79)27oe zR?Q_HpvATL2=Y2-SC4GoR03O6UwSdKUo5$u1CyyoddKLF*pvb9^> zA(0Y3fst;jB#il%NPcS01kBATy`q{Q~@-?p6<#Fs!GgE z)(VBhJ;hkh0!>DiGdv!evc&o}DK_}D9dM!2kO5Ee4TcFTq_?63@q2AWh?cF!i%ChO zv7`e1UsTsp+Z<_XZEU`R+dUOF+^-9W`H7bWcWQVs=ce$jWO^g&%*z;GF6b+1rM1`I zR2lEdk-yzdGrj84BAOwzo7+q=F(!5n+52*TX%E@VooDImlYO!=@C(D#DYZQmn5ddN zt#emQHU|F75IUv3v4HgIv4B;rEfQnz^$VTC{H+1YTdU;0ewuF5lNP^w%_m#X3&EYC zif)Ta?o7>$eIV)l6m%)MCv;MpDjU%CdSEp$ZRuq_8y6LXCHa9O@?@%RSvW{>GRU2+ zk;@g#oH|c0Tw1hvGWj3>-3)V0mE0!py1ufaGVpDrjh`B7X^U zaUU+w;guHC>x!)UDEoLpOvRii48w2Z&j3Pm$c=xcYeoatNX39?4 z6X~e5x__ry+#hScgw+gO#?yL=#$~Vw_nc~}qT@kUvAuo_SDxY6t zYLj$vug#TT{_GmDy(MJs%y>$O(QZKz_c&#jEbV))lH3zCnl(X-JALxq2XDYCzHQjl zSt46KCsm6lLvttUZ8I!g6u*8rQz6|g54bw%;YIP|Q_mZQzn)j-PuG0fofYE#3tdvF z-%0WEVZpUBKry#$!wkoV$(^gslvh{qC|HWDB_FHd3S(fNkx^no9S*G8DkD?bfR$(M z*%Ewv&5PCfp~*5ije#b^dc3LURJc6C{2+&B`IY}ALft>qS5PH*uauwNe*_uA!g)uaoG?f8_QF|z3}IVhHe-u&D!b(p*9 z3!Wd2NS6=ojH3um@p zS558=El6DS9&d#%C{W&XWo<##9&Nh|ZYbu#agLkVD!NYn*EZ z*LXjv@9O5*6=5+((7u%@CutkQSIJV$I#<%K*e1rVD%`kDibV+B4mv`E89X>fD zW(-_oWOR~aYruS3-1D#Hx7fD@q6-%Wq)u_~75lcunXK}Bik`2k|AEL>f;jS$ zN;6L(E*S&YU3j9_EGwAX!SndUp&iqGa;~FTKB^0Qsd&0ZGcQ+*!*AxU4)2gj`=0KQ zSCm?J2xVESyU-XAh8M`z!$P9Ge%?~#Qc0g8`{c0>W8lKDwNt4POGw?TzhC2$FP*&` zzQ;OdtTqNd9R7A-toG>YhXcGyje+b7xegKKi~$Q)D>)YH*109}x_(cXBfc0DI>{rW zEq>L~S%7FILSCQ=`^3(DfjU*V%q2fZD`vaxR*c9GE|4?brrqe%Id$5_dY?tTMTvR~ zG_mv18p-9Vr5V4q_t(_cdcw~Ka^4m@1YeZgc4Oeg`E;9(5BucH5w(hS!DWtlusi5& zX|C8Q%^dc)E>@B^)oh{b&XHH zYf)Y}7h`q*utgc8XDZf2OR@hGW0#@S)_k{SY~mbUfFE_%9&#B2KOD9qE(qXy5}XLG z8(bVQ_s8AROnU2^x>YWcCtyx@4w(u!7vF^aiZ-ixXU0i~*JNfF7Yd3+{(=AUfT&Ih zOS30c3-hEhoA(oqlmimIF{~f1J+DiyGI?*gQ2cexl|5COnk~fo?Sl6fZMkmp+^9{E zF3Fyn{pe(y=PRc@VXJd|AOq_uR(`$DQ_UyEnIY%X^W{GxhV~7G=!MCL*OX!eg$1V9 zwiWcQ5MKPW|1pv$KUvF>IyOYgN&F_5so9EWz?*KAjN!UF0GYgAIH3EppLPDJ~_QJC)c}q0{D}S8Xoa72=_H=r#MN_!#uhXyg7B9m}OM z^cSN?nl$IhTES~d)M6Rhf;W#`k9eBv9Q+I)#y_F6P^iP&|pxhXFX7ys9*=x~6oPNdC z6rYVUn)Zu+lQUNCfm|>Y?WY-cCED`(Tbuj8j1@P>7JY9%?f76m&HA;G+x7wJ4}aju zYCDJDv}YVy(F9devT{*YQ~KTn6@~aYaU9?PN`ZyI^*|7~9oP))03HF3051X>a0d7& zp7No?2jBoofrY^JKoGbc*bM9d9s!O3F9I5H2KY!%_z*UCpBHujj{rxy&vPGy&HJGP z9s!Q*Pv}TTU#HCaHTm|xpN)P?wg=vmdbhtP^xprzj55Z6?YylsuiIYPTk+RzJ%5Mo zWq;Y$H@Xdf82XECP)6I9Ws<2lTMOLPtxz#m(1Kf=Zw-$t%nRpN-%@SD?^j`g zJ)GYx;%9DtbyMY(9-O&{DVFWzGxx$!@&vc`7y}>UEg_Cb^zCl5oGXj5`N&rdsi^zX z35cmQ^-;VF&N^d$%7M2k+U=He@MiJu5OWSW*Xe@w&`{x-O*lvQmXFUU$eEyhiwx%_ ze)A!m^X-%6u}(e_P7ay(O7otz2Q%o6SOLdZik0ZO(@pZT}hS66?VXM#4?W%7^p{8|-d^ONK#^V80x z<$Xi6lN@f;&pkdk)ZV|}ldBo70>R?kQa)K8w{Q$jeiKfgsOudeA3KX2Tl8*x!8n5V zdTz0Q|y;V!5FxCh^^-t;?$^XlhfqiSz+Fjsn%48 z{saDPc5~Z&*)qo%m~MR7zuDPN_u7*=_uI`oxjc{1Q~l4nvl4ZVH$=I+oHEdl9HER% zV)+>TJbHK(ZxVO*TU@d~>J;YWnVe{^;3(F6JxjDxsj`0<9$nV1|9h%0{lj7rX*c)B z;fvH8`rWeRxKba4)XQ&u@Voz_Uy~zC_UbRCO1?at>onmc;90WG7X1Y#p{zjvi5s5@ z`?=pg9L~kucc9Jr7u%ezTP~JSaZ=^?i~gt!JS>Se8Q-khOp3kPD!;m6vMlVpwb>Z>-muhd!%1ljJT@Gy=QGn7*f;#6`qLYt zWcAtYtf6?_AU|sc#iO@ZEU_-3%&#q>2N#LQny|;$^FHt0cQ!YEzy8>74P&Idf0X>t zD7j;lymOS?HcIZs_kfZ9+eXRz|B7rM`eOMjNBO^WRC)KP{Hdd4Wt7}Hs{FB0@&})O zvHrnP@@dG{BZ$P^bPxaL|G(mQ{>IpJIPfpgt`Ch(-QC^M?=wA|5tZXfc@gMA%aN#_ zkh`MJkCJ+Cf*y)igC4%)ndpR%lX@HI;j8CIZw6HiV^d8+e<=DLP#JP}LhgrQ1*K>=xNw7<^H{TKBQ6ps#~|2Fmt>pzLo+!yUMM z3MnM?1n8oJg{S-cn zCGM*D5*eS$Xfc3KfrKxbgl*W!ZWt>taeR-3&!ma_<_3dzE4ryH82b* z&@Nkc^R*+g@D(#TW|=9<_vWh_>qAPZx3m8Io1V z6vl|-#5`$&Fj1IfvJ3fQk%${)Z%eqPwYfD|LtcCcuJhvl)LXMIQXiTX!Dpe+hK806 zYm>CKnY`g(OPCTisiuEHs6q)YpUSI30d$<5B$=lAR`TM08PA0`Tn>ssqtFgAZ{;(fq(xxAl7{;x#3JeFi4@j7N(w&VT7@B_Rbd0n#|@2BYi>)4L> z6@&LxI;B}`k;L9(yF_6)cnEAl{#=##{}J93tml2haF4KKJ!2ujdx?48R}9{hBijd& zmIJ)k*pBxbLjgb9t_nI{hisQuJIsXWWyrVUo7n0v>ivOgR=X+)(gb za$-AzV$EvM^c%56)hV+s+z5?xGbyZ-??Lo_%5 literal 0 HcmV?d00001 diff --git a/android/src/main/jniLibs/mips/libserial_port.so b/android/src/main/jniLibs/mips/libserial_port.so new file mode 100644 index 0000000000000000000000000000000000000000..663596de5005ea9ce1ba8a7374ceec9102009629 GIT binary patch literal 71224 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 N3x0p~f}lOW{{RIj;BNo` literal 0 HcmV?d00001 diff --git a/android/src/main/jniLibs/mips64/libserial_port.so b/android/src/main/jniLibs/mips64/libserial_port.so new file mode 100644 index 0000000000000000000000000000000000000000..0ea787dd93e78c2908adfeb2401330928c9409e4 GIT binary patch literal 10480 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 literal 0 HcmV?d00001 diff --git a/android/src/main/jniLibs/x86/libserial_port.so b/android/src/main/jniLibs/x86/libserial_port.so new file mode 100644 index 0000000000000000000000000000000000000000..9bac2a12e3d828ea758ac17b7c88df5fe4160d0a GIT binary patch literal 5476 zcmd5=ZERE589qr2m|dJj>o86TZ6Fu|1P~>qNq~frG2_@yV(QqDeM19_ z2w;u@(Oxys9aKf6GZ2O)rh0wPdVKBAdRo1~kO)S6YDhfg-Rt#u!~SR_ z==bQIun*5x*UXjkI`Ew(&p)m2E*#4+-+Uns9)%PdIEm0>J^?q*bhug zEXEq6D&Gge**ELRa({>d*8r9(MqCIB2+M9#Gv=K*u4}GA?gOr+86Zrdm|fFOwMUR2NpFJBKv5ZT6gEnZ zf^U-};0`$oA0tPX_sLmsPSZ~FjkMSG`YCY~+KCvxp`pFbs@mxuzAANA-%jK3pw#Wu z`4~PW^@Y?G>aR(iVtWboeyKaCyQm+8zBThhh=+#eE)XK^cVyCWLioO#kRfg*4C!R_|4n#(drBh&4-3I zA~vaZMG?OwgsDte!DYcpmD>(T27ack%EAnwQ1xy7qO zSQB5xthxpEtTj0R@v_NLh7lkBnC8a;JJ9L&U;$W<{*&QvV+yTDZ!!EUcvutPC2j{E z)?}9+UJ2ar&uKnhya?cz80UHKa}bLeSB;vii4Q1>V{;Ja*5j5l?P19Au@37??=T84 zf~Yxw#>c|e#3jZYp)EO6kKxbC@D}FMerpEQEPFNMZ4+-&R8Bxlz6%lWwTubANbuj< zmI3?;Q@q9+6A6L`FD(Z6Z5`|;_zumz#Vn$T;%*K^;tLS9!Ihv55SvvSSwoLDMvguVdj!J9t zEsSg5SUPa$>z?LaL#g%Vz6%^+b2=4Ae0_sfXXoHvh9_l4VmMB~k$(Bx(%n>tL)EVJ zC(w;P31%H>aimkHB=F4%piS%V#@rKVa^wuNrKw)4>(ujb@KGwuHNo6Jpa%?Z#z~s# z{8-a+&Rd&t-u}6WtHYd{j>@$zOQTlTqxVKb_Elh%ufiXK>FLxNS=>8%ag7s&VHwe# zTRTTC2XUEcva18B`g`;WQ-!cL)irA0?9aX<7T6VLk;@+|5ligK7}tuaF>_Z6He=v7 zh4hSou!7+>MZZ8Pyg@0&G3B|S+OD*QylpYX)m_{zFJdL7N~>RS zE5&}X&KnL#RE5_j86wt2!mYu!F5Hv`BwJ{y$hlo&>0tU~%iG@| z@_Nj93oItn3m8S(d7H3cv_4BjO`&Z|p-I{*pkDk)(|DT@YYNTr{AUW4hC=h2p+Xa5 zwt?=z&y#oD@1O9iFc+a;Tsy}7woSSp=a)E^_2a0OjeVX3*$~4!I{QrKubn+@(~)V< zo8krZ^T^-*iKg)gp6X|vT(A9ivAMxTp?O20t`Iv*j%)s2at! z!wfkD{5358QE&x(A>PRhz7o6|ya#+Y_;v=a@&3=dIB$NuYjZA{XFljGbgmKh1yR~@v_}|w8~jD|k857! zBshj#+A(#Ji_kIrQU~;ZZv1XGS|gITg7$)rfL;ZCA9MyJ6wtsBZw_>?VGDxAxm z-AcKuY?-U9e5q2>84W}Op@26QC>3k;&oadq^5Q_)8;Hh&k+8DN>2fZ0xm=YlMJZ_k z(67K+Tif__j;oZlFdZ&ilJmQ{EfVr8WzI7GUJECW1&=ox_3jf+d{zbx8Q+YmaJEJ8 z@I^X00{DKT=IjhXKyA8!k2T@+?+eG&sBi|_J*`o1N5IqWht?MEa%PM5KxGJklkCEY zgD)VFENXEUuJ^dFLpa;LvG$36bKosqLEwY_N!@v%B89gj=o8LZJ8DwBEyx^^pO;Sg z%1mwBaZ8x#Px18L;M~L z+!MrcACUNe6zXj3j}!%Qt^JHX6r{Sng{B zHwXi18Yd{*h+}&XL>#{nevOGC@%zMR^pW1ka@KPZpU)&49ofd5Y#e)rUI|FPkK;y4)1z_Bl$UBvO6It#_{5o^d-A#+TKlmC+g&W>Q}Y{apD9L2Ie z+W9|*Ybe6#1Ez6#aSo2>_jTY(2*@@gW&}EGlz9{g7+AvxZCqXrnfZw`DIjA4ptG?L uHV25ZiwYWX0bP_&`bfQ?oaq!H;J8kWX4LQ(7>qHX?*-sKG(g}+-hTrIFYUSj literal 0 HcmV?d00001 diff --git a/android/src/main/jniLibs/x86_64/libserial_port.so b/android/src/main/jniLibs/x86_64/libserial_port.so new file mode 100644 index 0000000000000000000000000000000000000000..3e2c14d40e37ac78400f8dedfc3848e5aac87fbc GIT binary patch literal 10176 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 literal 0 HcmV?d00001