Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,5 @@
pubspec.lock

build/
*/.idea/caches/
*/.idea/caches/
.idea/
10 changes: 10 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -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
Expand Down
38 changes: 30 additions & 8 deletions android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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'
}
2 changes: 2 additions & 0 deletions android/gradle.properties
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
android.enableJetifier=true
android.useAndroidX=true
org.gradle.jvmargs=-Xmx1536M
android.nonTransitiveRClass=true
android.enableR8.fullMode=true
5 changes: 2 additions & 3 deletions android/gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -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
Empty file modified android/gradlew
100644 → 100755
Empty file.
28 changes: 27 additions & 1 deletion android/settings.gradle
Original file line number Diff line number Diff line change
@@ -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'
5 changes: 2 additions & 3 deletions android/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.amolg.flutterbarcodescanner">
<manifest xmlns:android="http://schemas.android.com/apk/res/android">

<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
Expand All @@ -9,4 +8,4 @@
android:theme="@style/Theme.AppCompat.NoActionBar">
<activity android:name="com.amolg.flutterbarcodescanner.BarcodeCaptureActivity" />
</application>
</manifest>
</manifest>
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;


/**
Expand All @@ -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<String, Object> arguments;

Expand All @@ -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;
Expand All @@ -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 {
Expand Down Expand Up @@ -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);
Expand All @@ -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;
}
}
}

Expand All @@ -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;
Expand Down Expand Up @@ -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);
}
}
});
}
Expand Down Expand Up @@ -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);
Expand All @@ -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);
}
Expand All @@ -276,7 +266,6 @@ public void onAttachedToActivity(ActivityPluginBinding binding) {
pluginBinding.getBinaryMessenger(),
(Application) pluginBinding.getApplicationContext(),
activityBinding.getActivity(),
null,
activityBinding);
}

Expand All @@ -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;
}

/**
Expand Down
2 changes: 1 addition & 1 deletion example/android/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion example/android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,6 @@ subprojects {
project.evaluationDependsOn(':app')
}

task clean(type: Delete) {
tasks.register("clean", Delete) {
delete rootProject.buildDir
}
Loading