diff --git a/.gitignore b/.gitignore
index e9dc58d..a34a8b5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,5 +3,8 @@
.packages
.pub/
+.fvm/
+.idea/
+local.properties
build/
diff --git a/android/build.gradle b/android/build.gradle
index bc78bd3..5cd22d4 100644
--- a/android/build.gradle
+++ b/android/build.gradle
@@ -4,25 +4,25 @@ version '1.0'
buildscript {
repositories {
google()
- jcenter()
+ mavenCentral()
}
dependencies {
- classpath 'com.android.tools.build:gradle:3.5.0'
+ classpath 'com.android.tools.build:gradle:3.5.4'
}
}
rootProject.allprojects {
repositories {
google()
- jcenter()
+ mavenCentral()
}
}
apply plugin: 'com.android.library'
android {
- compileSdkVersion 28
+ compileSdkVersion 31
defaultConfig {
minSdkVersion 21
diff --git a/android/gradle.properties b/android/gradle.properties
index 38c8d45..94adc3a 100644
--- a/android/gradle.properties
+++ b/android/gradle.properties
@@ -1,4 +1,3 @@
org.gradle.jvmargs=-Xmx1536M
-android.enableR8=true
android.useAndroidX=true
android.enableJetifier=true
diff --git a/android/src/main/AndroidManifest.xml b/android/src/main/AndroidManifest.xml
index 5866eb1..fec5b9b 100644
--- a/android/src/main/AndroidManifest.xml
+++ b/android/src/main/AndroidManifest.xml
@@ -3,4 +3,6 @@
+
+
diff --git a/android/src/main/java/com/tablemi/flutter_bluetooth_basic/FlutterBluetoothBasicPlugin.java b/android/src/main/java/com/tablemi/flutter_bluetooth_basic/FlutterBluetoothBasicPlugin.java
index 3eca57f..30e752c 100644
--- a/android/src/main/java/com/tablemi/flutter_bluetooth_basic/FlutterBluetoothBasicPlugin.java
+++ b/android/src/main/java/com/tablemi/flutter_bluetooth_basic/FlutterBluetoothBasicPlugin.java
@@ -15,8 +15,21 @@
import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.util.Log;
+
+import androidx.annotation.NonNull;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Vector;
+
+import io.flutter.embedding.engine.plugins.FlutterPlugin;
+import io.flutter.embedding.engine.plugins.activity.ActivityAware;
+import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding;
+import io.flutter.plugin.common.BinaryMessenger;
import io.flutter.plugin.common.EventChannel;
import io.flutter.plugin.common.EventChannel.EventSink;
import io.flutter.plugin.common.EventChannel.StreamHandler;
@@ -27,319 +40,317 @@
import io.flutter.plugin.common.PluginRegistry.Registrar;
import io.flutter.plugin.common.PluginRegistry.RequestPermissionsResultListener;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Vector;
+/**
+ * FlutterBluetoothBasicPlugin
+ */
+public class FlutterBluetoothBasicPlugin implements FlutterPlugin, MethodCallHandler, ActivityAware, RequestPermissionsResultListener {
+ private static final String TAG = "BluetoothBasicPlugin";
+ private final int id = 0;
+ private ThreadPool threadPool;
+ private static final int REQUEST_COARSE_LOCATION_PERMISSIONS = 1451;
+ private static final String NAMESPACE = "flutter_bluetooth_basic";
+ private Activity activity;
+ private MethodChannel channel;
+ private EventChannel stateChannel;
+ private BluetoothAdapter bluetoothAdapter;
+ private ActivityPluginBinding activityPluginBinding;
+
+ private Result pendingResult;
+
+ // plugin should still contain the static registerWith() method to remain compatible with apps
+ // that don’t use the v2 Android embedding.
+ public static void registerWith(Registrar registrar) {
+ FlutterBluetoothBasicPlugin instance = new FlutterBluetoothBasicPlugin();
+ instance.createChannel(registrar.messenger());
+ registrar.addRequestPermissionsResultListener(instance);
+ }
-/** FlutterBluetoothBasicPlugin */
-public class FlutterBluetoothBasicPlugin implements MethodCallHandler, RequestPermissionsResultListener {
- private static final String TAG = "BluetoothBasicPlugin";
- private int id = 0;
- private ThreadPool threadPool;
- private static final int REQUEST_COARSE_LOCATION_PERMISSIONS = 1451;
- private static final String NAMESPACE = "flutter_bluetooth_basic";
- private final Registrar registrar;
- private final Activity activity;
- private final MethodChannel channel;
- private final EventChannel stateChannel;
- private final BluetoothManager mBluetoothManager;
- private BluetoothAdapter mBluetoothAdapter;
-
- private MethodCall pendingCall;
- private Result pendingResult;
-
- public static void registerWith(Registrar registrar) {
- final FlutterBluetoothBasicPlugin instance = new FlutterBluetoothBasicPlugin(registrar);
- registrar.addRequestPermissionsResultListener(instance);
- }
-
- FlutterBluetoothBasicPlugin(Registrar r){
- this.registrar = r;
- this.activity = r.activity();
- this.channel = new MethodChannel(registrar.messenger(), NAMESPACE + "/methods");
- this.stateChannel = new EventChannel(registrar.messenger(), NAMESPACE + "/state");
- this.mBluetoothManager = (BluetoothManager) registrar.activity().getSystemService(Context.BLUETOOTH_SERVICE);
- this.mBluetoothAdapter = mBluetoothManager.getAdapter();
- channel.setMethodCallHandler(this);
- stateChannel.setStreamHandler(stateStreamHandler);
- }
-
- @Override
- public void onMethodCall(MethodCall call, Result result) {
- if (mBluetoothAdapter == null && !"isAvailable".equals(call.method)) {
- result.error("bluetooth_unavailable", "Bluetooth is unavailable", null);
- return;
+ @Override
+ public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
+ if (bluetoothAdapter == null && !"isAvailable".equals(call.method)) {
+ result.error("bluetooth_unavailable", "Bluetooth is unavailable", null);
+ return;
+ }
+
+ final Map args = call.arguments();
+
+ switch (call.method) {
+ case "state":
+ state(result);
+ break;
+ case "isAvailable":
+ result.success(bluetoothAdapter != null);
+ break;
+ case "isOn":
+ result.success(bluetoothAdapter.isEnabled());
+ break;
+ case "isConnected":
+ result.success(threadPool != null);
+ break;
+ case "startScan": {
+ if (ContextCompat.checkSelfPermission(activity, Manifest.permission.ACCESS_COARSE_LOCATION)
+ != PackageManager.PERMISSION_GRANTED) {
+ ActivityCompat.requestPermissions(
+ activity,
+ new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},
+ REQUEST_COARSE_LOCATION_PERMISSIONS);
+ pendingResult = result;
+ break;
+ }
+ startScan(result);
+ break;
+ }
+ case "stopScan":
+ stopScan();
+ result.success(null);
+ break;
+ case "connect":
+ connect(result, args);
+ break;
+ case "disconnect":
+ result.success(disconnect());
+ break;
+ case "destroy":
+ result.success(destroy());
+ break;
+ case "writeData":
+ writeData(result, args);
+ break;
+ default:
+ result.notImplemented();
+ break;
+ }
}
- final Map args = call.arguments();
-
- switch (call.method){
- case "state":
- state(result);
- break;
- case "isAvailable":
- result.success(mBluetoothAdapter != null);
- break;
- case "isOn":
- result.success(mBluetoothAdapter.isEnabled());
- break;
- case "isConnected":
- result.success(threadPool != null);
- break;
- case "startScan": {
- if (ContextCompat.checkSelfPermission(activity, Manifest.permission.ACCESS_COARSE_LOCATION)
- != PackageManager.PERMISSION_GRANTED) {
- ActivityCompat.requestPermissions(
- activity,
- new String[] {Manifest.permission.ACCESS_COARSE_LOCATION},
- REQUEST_COARSE_LOCATION_PERMISSIONS);
- pendingCall = call;
- pendingResult = result;
- break;
+ private void state(Result result) {
+ try {
+ switch (bluetoothAdapter.getState()) {
+ case BluetoothAdapter.STATE_OFF:
+ result.success(BluetoothAdapter.STATE_OFF);
+ break;
+ case BluetoothAdapter.STATE_ON:
+ result.success(BluetoothAdapter.STATE_ON);
+ break;
+ case BluetoothAdapter.STATE_TURNING_OFF:
+ result.success(BluetoothAdapter.STATE_TURNING_OFF);
+ break;
+ case BluetoothAdapter.STATE_TURNING_ON:
+ result.success(BluetoothAdapter.STATE_TURNING_ON);
+ break;
+ default:
+ result.success(0);
+ break;
+ }
+ } catch (SecurityException e) {
+ result.error("invalid_argument", "Argument 'address' not found", null);
}
- startScan(call, result);
- break;
- }
- case "stopScan":
- stopScan();
- result.success(null);
- break;
- case "connect":
- connect(result, args);
- break;
- case "disconnect":
- result.success(disconnect());
- break;
- case "destroy":
- result.success(destroy());
- break;
- case "writeData":
- writeData(result, args);
- break;
- default:
- result.notImplemented();
- break;
}
- }
+ private void startScan(Result result) {
+ Log.d(TAG, "start scan ");
- private void getDevices(Result result){
- List