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: