1+ package com.regula.documentreader
2+
3+ import android.Manifest.permission.*
4+ import android.annotation.SuppressLint
5+ import android.app.Activity
6+ import android.bluetooth.BluetoothAdapter
7+ import android.content.ComponentName
8+ import android.content.Intent
9+ import android.content.ServiceConnection
10+ import android.content.pm.PackageManager.PERMISSION_GRANTED
11+ import android.os.Build
12+ import android.os.IBinder
13+ import android.provider.Settings
14+ import androidx.annotation.RequiresPermission
15+ import androidx.core.app.ActivityCompat.requestPermissions
16+ import androidx.core.content.ContextCompat.checkSelfPermission
17+ import com.regula.documentreader.api.ble.BLEWrapper
18+ import com.regula.documentreader.api.ble.BleWrapperCallback
19+ import com.regula.documentreader.api.ble.RegulaBleService
20+ import com.regula.documentreader.api.internal.permission.BluetoothPermissionHelper.BLE_ACCESS_PERMISSION
21+ import com.regula.documentreader.api.internal.permission.BluetoothSettingsHelper.isBluetoothEnabled
22+ import com.regula.documentreader.api.internal.permission.BluetoothSettingsHelper.isLocationServiceEnabled
23+
24+ class BluetoothUtil {
25+ companion object {
26+ private const val REQUEST_ENABLE_LOCATION = 196
27+ private const val REQUEST_ENABLE_BT = 197
28+
29+ @SuppressLint(" StaticFieldLeak" )
30+ var bleManager: BLEWrapper ? = null
31+
32+ @RequiresPermission(" android.permission.BLUETOOTH_CONNECT" )
33+ private fun requestEnableBle (activity : Activity ) {
34+ val enableIntent = Intent (BluetoothAdapter .ACTION_REQUEST_ENABLE )
35+ activity.startActivityForResult(enableIntent, REQUEST_ENABLE_BT )
36+ }
37+
38+ private fun requestEnableLocationService (activity : Activity ) {
39+ val myIntent = Intent (Settings .ACTION_LOCATION_SOURCE_SETTINGS )
40+ activity.startActivityForResult(myIntent, REQUEST_ENABLE_LOCATION )
41+ }
42+
43+ // requestEnableBle() is called after a check for permission
44+ @SuppressLint(" MissingPermission" )
45+ fun isBlePermissionsGranted (activity : Activity ): Boolean {
46+ if (! isLocationServiceEnabled(activity)) {
47+ requestEnableLocationService(activity)
48+ return false
49+ }
50+ deniedBluetoothPermissions(activity)?.let {
51+ requestPermissions(activity, it, BLE_ACCESS_PERMISSION )
52+ return false
53+ }
54+ if (! isBluetoothEnabled(activity)) {
55+ requestEnableBle(activity)
56+ return false
57+ }
58+ return true
59+ }
60+
61+ private fun deniedBluetoothPermissions (activity : Activity ): Array <String >? {
62+ val result = mutableListOf<String >()
63+ if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .S ) {
64+ result.addAll(deniedBluetoothPermission(activity, BLUETOOTH_SCAN ))
65+ result.addAll(deniedBluetoothPermission(activity, BLUETOOTH_CONNECT ))
66+ } else
67+ result.addAll(deniedBluetoothPermission(activity, ACCESS_FINE_LOCATION ))
68+ return result.let { if (it.size > 0 ) it.toTypedArray() else null }
69+ }
70+
71+ private fun deniedBluetoothPermission (
72+ activity : Activity ,
73+ permission : String
74+ ): Array <String > {
75+ if (checkSelfPermission(activity, permission) != PERMISSION_GRANTED )
76+ return arrayOf(permission)
77+ return arrayOf()
78+ }
79+
80+ fun startBluetoothService (
81+ activity : Activity ,
82+ onConnected : (Boolean ) -> Unit ,
83+ onDisconnected : () -> Unit ,
84+ onReady : () -> Unit ,
85+ ) {
86+ val bleIntent = Intent (activity, RegulaBleService ::class .java)
87+ activity.startService(bleIntent)
88+
89+ activity.bindService(bleIntent, object : ServiceConnection {
90+ override fun onServiceConnected (name : ComponentName , service : IBinder ) {
91+ bleManager = (service as RegulaBleService .LocalBinder ).service.bleManager
92+ val isBleManagerConnected = bleManager?.isConnected == true
93+ onConnected(isBleManagerConnected)
94+ if (! isBleManagerConnected) {
95+ bleManager?.addCallback(object : BleWrapperCallback () {
96+ override fun onDeviceReady () {
97+ bleManager!! .removeCallback(this )
98+ onReady()
99+ }
100+ })
101+ }
102+ }
103+
104+ override fun onServiceDisconnected (name : ComponentName ) = onDisconnected()
105+ }, 0 )
106+ }
107+ }
108+ }
0 commit comments