diff --git a/.gitignore b/.gitignore index 38748191..bd64a34d 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,5 @@ pubspec.lock build/ -*/.idea/caches/ \ No newline at end of file +*/.idea/caches/ +.idea/ \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index d07f39ae..9c8b63ff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,13 @@ +## 2.0.1 + +* Update Gradle to 8.7 +* Update Android SDK to 34 +* Update Java compatibility to version 17 +* Update Flutter SDK constraints for 3.29.3 +* Update minimum Flutter version to 3.19.0 +* Update various Android and Flutter dependencies +* Add repository and issue tracker URLs + ## 2.0.0 * Android: Fixes #137 and #132 diff --git a/android/build.gradle b/android/build.gradle index f0f02e7a..45c63519 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -4,39 +4,61 @@ version '1.0-SNAPSHOT' buildscript { repositories { google() - jcenter() + mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:4.1.3' + classpath 'com.android.tools.build:gradle:8.1.0' } } rootProject.allprojects { repositories { google() - jcenter() + mavenCentral() + maven { + url 'https://storage.googleapis.com/download.flutter.io' + } } } apply plugin: 'com.android.library' android { - compileSdkVersion 30 + namespace 'com.amolg.flutterbarcodescanner' + compileSdk 34 + + compileOptions { + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 + } defaultConfig { - minSdkVersion 16 - targetSdkVersion 30 + minSdk 21 + targetSdk 34 testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } + lintOptions { disable 'InvalidPackage' } } dependencies { - implementation 'androidx.appcompat:appcompat:1.2.0' + implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'androidx.legacy:legacy-support-v4:1.0.0' - implementation 'com.google.android.material:material:1.3.0' + implementation 'com.google.android.material:material:1.11.0' implementation 'com.google.android.gms:play-services-vision:20.1.3' + + implementation 'androidx.lifecycle:lifecycle-common:2.7.0' + implementation 'androidx.lifecycle:lifecycle-runtime:2.7.0' + + implementation 'androidx.core:core:1.12.0' + implementation 'androidx.core:core-ktx:1.12.0' + + compileOnly 'io.flutter:flutter_embedding_debug:1.0.0-3316dd8728419ad3534e3f6112aa6291f587078a' + compileOnly 'io.flutter:armeabi_v7a_debug:1.0.0-3316dd8728419ad3534e3f6112aa6291f587078a' + compileOnly 'io.flutter:arm64_v8a_debug:1.0.0-3316dd8728419ad3534e3f6112aa6291f587078a' + compileOnly 'io.flutter:x86_64_debug:1.0.0-3316dd8728419ad3534e3f6112aa6291f587078a' + compileOnly 'io.flutter:x86_debug:1.0.0-3316dd8728419ad3534e3f6112aa6291f587078a' } \ No newline at end of file diff --git a/android/gradle.properties b/android/gradle.properties index 53ae0ae4..08750bc7 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,3 +1,5 @@ android.enableJetifier=true android.useAndroidX=true org.gradle.jvmargs=-Xmx1536M +android.nonTransitiveRClass=true +android.enableR8.fullMode=true diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 9474641a..c6744023 100644 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,5 @@ -#Tue Apr 20 01:37:31 IST 2021 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-all.zip zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-all.zip +zipStorePath=wrapper/dists \ No newline at end of file diff --git a/android/gradlew b/android/gradlew old mode 100644 new mode 100755 diff --git a/android/settings.gradle b/android/settings.gradle index 0ce691a5..5bd7cea9 100644 --- a/android/settings.gradle +++ b/android/settings.gradle @@ -1 +1,27 @@ -rootProject.name = 'flutter_barcode_scanner' +pluginManagement { + def flutterSdkPath = { + def properties = new Properties() + file("local.properties").withInputStream { properties.load(it) } + def flutterSdkPath = properties.getProperty("flutter.sdk") + assert flutterSdkPath != null, "flutter.sdk not set in local.properties" + return flutterSdkPath + }() + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id "dev.flutter.flutter-plugin-loader" version "1.0.0" + id "com.android.application" version "8.5.2" apply false + id "org.jetbrains.kotlin.android" version "1.9.10" apply false +} + +include ":app" + +rootProject.name = 'flutter_barcode_scanner' \ No newline at end of file diff --git a/android/src/main/AndroidManifest.xml b/android/src/main/AndroidManifest.xml index 5d6847be..9c173225 100644 --- a/android/src/main/AndroidManifest.xml +++ b/android/src/main/AndroidManifest.xml @@ -1,5 +1,4 @@ - + @@ -9,4 +8,4 @@ android:theme="@style/Theme.AppCompat.NoActionBar"> - + \ No newline at end of file diff --git a/android/src/main/java/com/amolg/flutterbarcodescanner/FlutterBarcodeScannerPlugin.java b/android/src/main/java/com/amolg/flutterbarcodescanner/FlutterBarcodeScannerPlugin.java index 91480647..da08cbe3 100644 --- a/android/src/main/java/com/amolg/flutterbarcodescanner/FlutterBarcodeScannerPlugin.java +++ b/android/src/main/java/com/amolg/flutterbarcodescanner/FlutterBarcodeScannerPlugin.java @@ -16,8 +16,6 @@ import java.util.Map; -import io.flutter.embedding.android.FlutterActivity; - import io.flutter.embedding.engine.plugins.FlutterPlugin; import io.flutter.embedding.engine.plugins.activity.ActivityAware; import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding; @@ -27,10 +25,8 @@ import io.flutter.plugin.common.MethodChannel; import io.flutter.plugin.common.MethodChannel.MethodCallHandler; import io.flutter.plugin.common.MethodChannel.Result; -import io.flutter.plugin.common.PluginRegistry; import io.flutter.plugin.common.PluginRegistry.ActivityResultListener; import io.flutter.plugin.common.EventChannel.StreamHandler; -import io.flutter.embedding.engine.plugins.lifecycle.FlutterLifecycleAdapter; /** @@ -39,7 +35,7 @@ public class FlutterBarcodeScannerPlugin implements MethodCallHandler, ActivityResultListener, StreamHandler, FlutterPlugin, ActivityAware { private static final String CHANNEL = "flutter_barcode_scanner"; - private static FlutterActivity activity; + private static Activity activity; private static Result pendingResult; private Map arguments; @@ -52,10 +48,7 @@ public class FlutterBarcodeScannerPlugin implements MethodCallHandler, ActivityR private EventChannel eventChannel; /** - * V2 embedding - * - * @param activity - * @param registrar + * V2 embedding only */ private MethodChannel channel; private FlutterPluginBinding pluginBinding; @@ -68,26 +61,6 @@ public class FlutterBarcodeScannerPlugin implements MethodCallHandler, ActivityR public FlutterBarcodeScannerPlugin() { } - private FlutterBarcodeScannerPlugin(FlutterActivity activity, final PluginRegistry.Registrar registrar) { - FlutterBarcodeScannerPlugin.activity = activity; - } - - /** - * Plugin registration. - */ - public static void registerWith(final PluginRegistry.Registrar registrar) { - if (registrar.activity() == null) { - return; - } - Activity activity = registrar.activity(); - Application applicationContext = null; - if (registrar.context() != null) { - applicationContext = (Application) (registrar.context().getApplicationContext()); - } - FlutterBarcodeScannerPlugin instance = new FlutterBarcodeScannerPlugin((FlutterActivity) registrar.activity(), registrar); - instance.createPluginSetup(registrar.messenger(), applicationContext, activity, registrar, null); - } - @Override public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) { try { @@ -124,6 +97,15 @@ public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) { private void startBarcodeScannerActivityView(String buttonText, boolean isContinuousScan) { try { + if (activity == null) { + Log.e(TAG, "Activity is null, cannot start barcode scanner"); + if (pendingResult != null) { + pendingResult.error("NO_ACTIVITY", "Activity not available", null); + pendingResult = null; + } + return; + } + Intent intent = new Intent(activity, BarcodeCaptureActivity.class).putExtra("cancelButtonText", buttonText); if (isContinuousScan) { activity.startActivity(intent); @@ -132,6 +114,10 @@ private void startBarcodeScannerActivityView(String buttonText, boolean isContin } } catch (Exception e) { Log.e(TAG, "startView: " + e.getLocalizedMessage()); + if (pendingResult != null) { + pendingResult.error("START_ACTIVITY_ERROR", e.getLocalizedMessage(), null); + pendingResult = null; + } } } @@ -152,18 +138,27 @@ public boolean onActivityResult(int requestCode, int resultCode, Intent data) { try { Barcode barcode = data.getParcelableExtra(BarcodeCaptureActivity.BarcodeObject); String barcodeResult = barcode.rawValue; - pendingResult.success(barcodeResult); + if (pendingResult != null) { + pendingResult.success(barcodeResult); + } } catch (Exception e) { - pendingResult.success("-1"); + if (pendingResult != null) { + pendingResult.success("-1"); + } } } else { - pendingResult.success("-1"); + if (pendingResult != null) { + pendingResult.success("-1"); + } } pendingResult = null; arguments = null; return true; } else { - pendingResult.success("-1"); + if (pendingResult != null) { + pendingResult.success("-1"); + pendingResult = null; + } } } return false; @@ -194,11 +189,13 @@ public void onCancel(Object o) { */ public static void onBarcodeScanReceiver(final Barcode barcode) { try { - if (barcode != null && !barcode.displayValue.isEmpty()) { + if (barcode != null && !barcode.displayValue.isEmpty() && activity != null) { activity.runOnUiThread(new Runnable() { @Override public void run() { - barcodeStream.success(barcode.rawValue); + if (barcodeStream != null) { + barcodeStream.success(barcode.rawValue); + } } }); } @@ -234,18 +231,16 @@ public void onReattachedToActivityForConfigChanges(ActivityPluginBinding binding * @param messenger * @param applicationContext * @param activity - * @param registrar * @param activityBinding */ private void createPluginSetup( final BinaryMessenger messenger, final Application applicationContext, final Activity activity, - final PluginRegistry.Registrar registrar, final ActivityPluginBinding activityBinding) { - this.activity = (FlutterActivity) activity; + FlutterBarcodeScannerPlugin.activity = activity; eventChannel = new EventChannel(messenger, "flutter_barcode_scanner_receiver"); eventChannel.setStreamHandler(this); @@ -254,16 +249,11 @@ private void createPluginSetup( this.applicationContext = applicationContext; channel = new MethodChannel(messenger, CHANNEL); channel.setMethodCallHandler(this); - if (registrar != null) { - // V1 embedding setup for activity listeners. - observer = new LifeCycleObserver(activity); - applicationContext.registerActivityLifecycleCallbacks( - observer); // Use getApplicationContext() to avoid casting failures. - registrar.addActivityResultListener(this); - } else { - // V2 embedding setup for activity listeners. + + // V2 embedding setup for activity listeners. + if (activityBinding != null) { activityBinding.addActivityResultListener(this); - lifecycle = FlutterLifecycleAdapter.getActivityLifecycle(activityBinding); + lifecycle = (Lifecycle) activityBinding.getLifecycle(); observer = new LifeCycleObserver(activity); lifecycle.addObserver(observer); } @@ -276,7 +266,6 @@ public void onAttachedToActivity(ActivityPluginBinding binding) { pluginBinding.getBinaryMessenger(), (Application) pluginBinding.getApplicationContext(), activityBinding.getActivity(), - null, activityBinding); } @@ -290,15 +279,27 @@ public void onDetachedFromActivity() { */ private void clearPluginSetup() { activity = null; - activityBinding.removeActivityResultListener(this); - activityBinding = null; - lifecycle.removeObserver(observer); - lifecycle = null; - channel.setMethodCallHandler(null); - eventChannel.setStreamHandler(null); - channel = null; - applicationContext.unregisterActivityLifecycleCallbacks(observer); - applicationContext = null; + if (activityBinding != null) { + activityBinding.removeActivityResultListener(this); + activityBinding = null; + } + if (lifecycle != null && observer != null) { + lifecycle.removeObserver(observer); + lifecycle = null; + } + if (channel != null) { + channel.setMethodCallHandler(null); + channel = null; + } + if (eventChannel != null) { + eventChannel.setStreamHandler(null); + eventChannel = null; + } + if (applicationContext != null && observer != null) { + applicationContext.unregisterActivityLifecycleCallbacks(observer); + applicationContext = null; + } + observer = null; } /** diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle index 94edfe8d..9f4dcb43 100644 --- a/example/android/app/build.gradle +++ b/example/android/app/build.gradle @@ -34,7 +34,7 @@ android { defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "com.amolg.flutterbarcodescannerexample" - minSdkVersion 16 + minSdkVersion flutter.minSdkVersion targetSdkVersion 29 versionCode flutterVersionCode.toInteger() versionName flutterVersionName diff --git a/example/android/build.gradle b/example/android/build.gradle index fab3c2e1..712055f6 100644 --- a/example/android/build.gradle +++ b/example/android/build.gradle @@ -24,6 +24,6 @@ subprojects { project.evaluationDependsOn(':app') } -task clean(type: Delete) { +tasks.register("clean", Delete) { delete rootProject.buildDir } diff --git a/example/ios/Flutter/flutter_export_environment.sh b/example/ios/Flutter/flutter_export_environment.sh index 9e2cc398..2cfea0f3 100755 --- a/example/ios/Flutter/flutter_export_environment.sh +++ b/example/ios/Flutter/flutter_export_environment.sh @@ -1,13 +1,13 @@ #!/bin/sh # This is a generated file; do not edit or check into version control. export "FLUTTER_ROOT=/Volumes/MyData/Flutter_SDK/flutter" -export "FLUTTER_APPLICATION_PATH=/Users/admin/Desktop/FlutterBarcodeScanner/flutter_barcode_scanner/example" +export "FLUTTER_APPLICATION_PATH=/Volumes/MyData/Projects/flutter_barcode_scanner/example" +export "COCOAPODS_PARALLEL_CODE_SIGN=true" export "FLUTTER_TARGET=lib/main.dart" export "FLUTTER_BUILD_DIR=build" -export "SYMROOT=${SOURCE_ROOT}/../build/ios" export "FLUTTER_BUILD_NAME=2.0.0.0" export "FLUTTER_BUILD_NUMBER=2.0.0.0" export "DART_OBFUSCATION=false" -export "TRACK_WIDGET_CREATION=false" +export "TRACK_WIDGET_CREATION=true" export "TREE_SHAKE_ICONS=false" -export "PACKAGE_CONFIG=.packages" +export "PACKAGE_CONFIG=.dart_tool/package_config.json" diff --git a/pubspec.yaml b/pubspec.yaml index 71135429..f0f879c8 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,26 +1,27 @@ name: flutter_barcode_scanner description: A plugin for barcode scanning support on Android and iOS. Supports barcodes, QR codes, etc. -version: 2.0.0 +version: 2.0.1 author: Amol Gangadhare homepage: https://github.com/AmolGangadhare/flutter_barcode_scanner +repository: https://github.com/AmolGangadhare/flutter_barcode_scanner +issue_tracker: https://github.com/AmolGangadhare/flutter_barcode_scanner/issues environment: - sdk: '>=2.12.0 <3.0.0' - flutter: ">=1.12.0" + sdk: '>=3.0.0 <4.0.0' + flutter: ">=3.19.0" dependencies: flutter: sdk: flutter - flutter_plugin_android_lifecycle: ^2.0.1 + flutter_plugin_android_lifecycle: ^2.0.21 + dev_dependencies: - pedantic: ^1.11.0 - test: ^1.16.8 + flutter_test: + sdk: flutter + flutter_lints: ^3.0.0 + test: ^1.24.0 flutter: - # This section identifies this Flutter project as a plugin project. - # The androidPackage and pluginClass identifiers should not ordinarily - # be modified. They are used by the tooling to maintain consistency when - # adding or updating assets for this project. plugin: platforms: android: