Skip to content

Commit

Permalink
beacon_scanner_android: use activity for permission request
Browse files Browse the repository at this point in the history
  • Loading branch information
Lukangi authored and Lukangi committed Jun 21, 2023
1 parent 1e9c824 commit 1de3ea9
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 25 deletions.
4 changes: 4 additions & 0 deletions beacon_scanner_android/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
## 0.0.3+1

* Fixes permission request.

## 0.0.3

* Initial release.
Original file line number Diff line number Diff line change
Expand Up @@ -184,9 +184,14 @@ class BeaconScannerPlugin : FlutterPlugin, MethodCallHandler, ActivityAware, Req
}

"requestAuthorization" -> {
if (activityPluginBinding == null) {
result.success(false)
return
}

if (!platform!!.checkLocationServicesPermission()) {
flutterResult = result
platform!!.requestAuthorization()
platform!!.requestAuthorization(activityPluginBinding!!.activity)
return
}

Expand All @@ -210,9 +215,14 @@ class BeaconScannerPlugin : FlutterPlugin, MethodCallHandler, ActivityAware, Req
}

"openBluetoothSettings" -> {
if (activityPluginBinding == null) {
result.success(false)
return
}

if (!platform!!.checkBluetoothIfEnabled()) {
flutterResultBluetooth = result
platform!!.openBluetoothSettings()
platform!!.openBluetoothSettings(activityPluginBinding!!.activity)
return
}
result.success(true)
Expand All @@ -238,12 +248,12 @@ class BeaconScannerPlugin : FlutterPlugin, MethodCallHandler, ActivityAware, Req
return
}
flutterResult = result
if (!platform!!.checkBluetoothIfEnabled()) {
platform!!.openBluetoothSettings()
if (!platform!!.checkBluetoothIfEnabled() && activityPluginBinding != null) {
platform!!.openBluetoothSettings(activityPluginBinding!!.activity)
return
}
if (!platform!!.checkLocationServicesPermission()) {
platform!!.requestAuthorization()
if (!platform!!.checkLocationServicesPermission() && activityPluginBinding != null) {
platform!!.requestAuthorization(activityPluginBinding!!.activity)
return
}
if (!platform!!.checkLocationServicesIfEnabled()) {
Expand Down Expand Up @@ -276,7 +286,7 @@ class BeaconScannerPlugin : FlutterPlugin, MethodCallHandler, ActivityAware, Req
var locationServiceAllowed = false
if (permissions.isNotEmpty() && grantResults.isNotEmpty()) {
val permission = permissions[0]
if (!platform!!.shouldShowRequestPermissionRationale(permission)) {
if (activityPluginBinding != null && !platform!!.shouldShowRequestPermissionRationale(permission, activityPluginBinding!!.activity)) {
val grantResult = grantResults[0]
if (grantResult == PackageManager.PERMISSION_GRANTED) {
//allowed
Expand Down Expand Up @@ -312,8 +322,8 @@ class BeaconScannerPlugin : FlutterPlugin, MethodCallHandler, ActivityAware, Req
override fun onActivityResult(requestCode: Int, resultCode: Int, intent: Intent?): Boolean {
val bluetoothEnabled = requestCode == REQUEST_CODE_BLUETOOTH && resultCode == Activity.RESULT_OK
if (bluetoothEnabled) {
if (!platform!!.checkLocationServicesPermission()) {
platform!!.requestAuthorization()
if (!platform!!.checkLocationServicesPermission() && activityPluginBinding != null) {
platform!!.requestAuthorization(activityPluginBinding!!.activity)
} else {
if (flutterResultBluetooth != null) {
flutterResultBluetooth!!.success(true)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,24 +21,40 @@ internal class FlutterPlatform(private val context: Context) {
context.startActivity(intent)
}

fun openBluetoothSettings() {
fun openBluetoothSettings(activity: Activity) {
val intent = Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE)
// TODO: Do not cast context to Activity
(context as Activity).startActivityForResult(intent, BeaconScannerPlugin.REQUEST_CODE_BLUETOOTH)
activity.startActivityForResult(intent, BeaconScannerPlugin.REQUEST_CODE_BLUETOOTH)
}

fun requestAuthorization() {
// TODO: Do not cast context to Activity
ActivityCompat.requestPermissions(
(context as Activity), arrayOf<String>(
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION
), BeaconScannerPlugin.REQUEST_CODE_LOCATION
)
fun requestAuthorization(activity: Activity) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
ActivityCompat.requestPermissions(
activity, arrayOf<String>(
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.BLUETOOTH_SCAN,
), BeaconScannerPlugin.REQUEST_CODE_LOCATION
)
} else {
ActivityCompat.requestPermissions(
activity, arrayOf<String>(
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION,
), BeaconScannerPlugin.REQUEST_CODE_LOCATION
)
}
}

fun checkLocationServicesPermission(): Boolean {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
ContextCompat.checkSelfPermission(
context,
Manifest.permission.ACCESS_COARSE_LOCATION
) == PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(
context,
Manifest.permission.BLUETOOTH_SCAN
) == PackageManager.PERMISSION_GRANTED
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
ContextCompat.checkSelfPermission(
context,
Manifest.permission.ACCESS_COARSE_LOCATION
Expand Down Expand Up @@ -71,8 +87,7 @@ internal class FlutterPlatform(private val context: Context) {
val isBroadcastSupported: Boolean
get() = BeaconTransmitter.checkTransmissionSupported(context) == 0

fun shouldShowRequestPermissionRationale(permission: String?): Boolean {
// TODO: Do not cast context to Activity
return ActivityCompat.shouldShowRequestPermissionRationale((context as Activity), permission!!)
fun shouldShowRequestPermissionRationale(permission: String?, activity: Activity): Boolean {
return ActivityCompat.shouldShowRequestPermissionRationale(activity, permission!!)
}
}
2 changes: 1 addition & 1 deletion beacon_scanner_android/pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
name: beacon_scanner_android
description: The Android implementation of beacon_scanner_platform_interface
repository: https://github.com/Lukangi/beacon_scanner/tree/main/beacon_scanner_android
version: 0.0.3
version: 0.0.3+1

environment:
sdk: ">=2.18.0 <4.0.0"
Expand Down

0 comments on commit 1de3ea9

Please sign in to comment.