improve Android12 permision handling
This commit is contained in:
parent
8ac3f38117
commit
445b1bb6ae
6 changed files with 37 additions and 14 deletions
|
@ -59,7 +59,8 @@ class NSClientAddUpdateWorker(
|
||||||
|
|
||||||
for (i in 0 until treatments.length()) {
|
for (i in 0 until treatments.length()) {
|
||||||
var json = treatments.getJSONObject(i)
|
var json = treatments.getJSONObject(i)
|
||||||
// new DB model
|
aapsLogger.debug(LTag.DATABASE, "Received NS treatment: $json")
|
||||||
|
|
||||||
val insulin = JsonHelper.safeGetDouble(json, "insulin")
|
val insulin = JsonHelper.safeGetDouble(json, "insulin")
|
||||||
val carbs = JsonHelper.safeGetDouble(json, "carbs")
|
val carbs = JsonHelper.safeGetDouble(json, "carbs")
|
||||||
var eventType = JsonHelper.safeGetString(json, "eventType")
|
var eventType = JsonHelper.safeGetString(json, "eventType")
|
||||||
|
|
|
@ -33,6 +33,7 @@ import info.nightscout.androidaps.plugins.general.overview.events.EventNewNotifi
|
||||||
import info.nightscout.androidaps.plugins.general.overview.notifications.Notification
|
import info.nightscout.androidaps.plugins.general.overview.notifications.Notification
|
||||||
import info.nightscout.androidaps.queue.commands.*
|
import info.nightscout.androidaps.queue.commands.*
|
||||||
import info.nightscout.androidaps.queue.commands.Command.CommandType
|
import info.nightscout.androidaps.queue.commands.Command.CommandType
|
||||||
|
import info.nightscout.androidaps.utils.AndroidPermission
|
||||||
import info.nightscout.androidaps.utils.DateUtil
|
import info.nightscout.androidaps.utils.DateUtil
|
||||||
import info.nightscout.androidaps.utils.FabricPrivacy
|
import info.nightscout.androidaps.utils.FabricPrivacy
|
||||||
import info.nightscout.androidaps.utils.HtmlHelper
|
import info.nightscout.androidaps.utils.HtmlHelper
|
||||||
|
@ -64,7 +65,8 @@ class CommandQueueImplementation @Inject constructor(
|
||||||
private val dateUtil: DateUtil,
|
private val dateUtil: DateUtil,
|
||||||
private val repository: AppRepository,
|
private val repository: AppRepository,
|
||||||
private val fabricPrivacy: FabricPrivacy,
|
private val fabricPrivacy: FabricPrivacy,
|
||||||
private val config: Config
|
private val config: Config,
|
||||||
|
private val androidPermission: AndroidPermission
|
||||||
) : CommandQueue {
|
) : CommandQueue {
|
||||||
|
|
||||||
private val disposable = CompositeDisposable()
|
private val disposable = CompositeDisposable()
|
||||||
|
@ -177,7 +179,7 @@ class CommandQueueImplementation @Inject constructor(
|
||||||
@Synchronized fun notifyAboutNewCommand() {
|
@Synchronized fun notifyAboutNewCommand() {
|
||||||
waitForFinishedThread()
|
waitForFinishedThread()
|
||||||
if (thread == null || thread!!.state == Thread.State.TERMINATED) {
|
if (thread == null || thread!!.state == Thread.State.TERMINATED) {
|
||||||
thread = QueueThread(this, context, aapsLogger, rxBus, activePlugin, rh, sp)
|
thread = QueueThread(this, context, aapsLogger, rxBus, activePlugin, rh, sp, androidPermission)
|
||||||
thread!!.start()
|
thread!!.start()
|
||||||
aapsLogger.debug(LTag.PUMPQUEUE, "Starting new thread")
|
aapsLogger.debug(LTag.PUMPQUEUE, "Starting new thread")
|
||||||
} else {
|
} else {
|
||||||
|
@ -199,7 +201,7 @@ class CommandQueueImplementation @Inject constructor(
|
||||||
val tempCommandQueue = CommandQueueImplementation(
|
val tempCommandQueue = CommandQueueImplementation(
|
||||||
injector, aapsLogger, rxBus, aapsSchedulers, rh,
|
injector, aapsLogger, rxBus, aapsSchedulers, rh,
|
||||||
constraintChecker, profileFunction, activePlugin, context, sp,
|
constraintChecker, profileFunction, activePlugin, context, sp,
|
||||||
buildHelper, dateUtil, repository, fabricPrivacy, config
|
buildHelper, dateUtil, repository, fabricPrivacy, config, androidPermission
|
||||||
)
|
)
|
||||||
tempCommandQueue.readStatus(reason, callback)
|
tempCommandQueue.readStatus(reason, callback)
|
||||||
tempCommandQueue.disposable.clear()
|
tempCommandQueue.disposable.clear()
|
||||||
|
|
|
@ -2,6 +2,7 @@ package info.nightscout.androidaps.queue
|
||||||
|
|
||||||
import android.bluetooth.BluetoothManager
|
import android.bluetooth.BluetoothManager
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
|
import android.os.Build
|
||||||
import android.os.PowerManager
|
import android.os.PowerManager
|
||||||
import android.os.SystemClock
|
import android.os.SystemClock
|
||||||
import info.nightscout.androidaps.Constants
|
import info.nightscout.androidaps.Constants
|
||||||
|
@ -12,6 +13,7 @@ import info.nightscout.androidaps.interfaces.CommandQueue
|
||||||
import info.nightscout.androidaps.plugins.bus.RxBus
|
import info.nightscout.androidaps.plugins.bus.RxBus
|
||||||
import info.nightscout.androidaps.plugins.general.overview.events.EventDismissBolusProgressIfRunning
|
import info.nightscout.androidaps.plugins.general.overview.events.EventDismissBolusProgressIfRunning
|
||||||
import info.nightscout.androidaps.queue.events.EventQueueChanged
|
import info.nightscout.androidaps.queue.events.EventQueueChanged
|
||||||
|
import info.nightscout.androidaps.utils.AndroidPermission
|
||||||
import info.nightscout.androidaps.utils.T
|
import info.nightscout.androidaps.utils.T
|
||||||
import info.nightscout.androidaps.utils.resources.ResourceHelper
|
import info.nightscout.androidaps.utils.resources.ResourceHelper
|
||||||
import info.nightscout.shared.logging.AAPSLogger
|
import info.nightscout.shared.logging.AAPSLogger
|
||||||
|
@ -25,7 +27,8 @@ class QueueThread internal constructor(
|
||||||
private val rxBus: RxBus,
|
private val rxBus: RxBus,
|
||||||
private val activePlugin: ActivePlugin,
|
private val activePlugin: ActivePlugin,
|
||||||
private val rh: ResourceHelper,
|
private val rh: ResourceHelper,
|
||||||
private val sp: SP
|
private val sp: SP,
|
||||||
|
private val androidPermission: AndroidPermission
|
||||||
) : Thread() {
|
) : Thread() {
|
||||||
|
|
||||||
private var connectLogged = false
|
private var connectLogged = false
|
||||||
|
@ -46,6 +49,14 @@ class QueueThread internal constructor(
|
||||||
while (true) {
|
while (true) {
|
||||||
val secondsElapsed = (System.currentTimeMillis() - connectionStartTime) / 1000
|
val secondsElapsed = (System.currentTimeMillis() - connectionStartTime) / 1000
|
||||||
val pump = activePlugin.activePump
|
val pump = activePlugin.activePump
|
||||||
|
// Manifest.permission.BLUETOOTH_CONNECT
|
||||||
|
if (Build.VERSION.SDK_INT >= /*Build.VERSION_CODES.S*/31)
|
||||||
|
if (androidPermission.permissionNotGranted(context, "android.permission.BLUETOOTH_CONNECT")) {
|
||||||
|
aapsLogger.debug(LTag.PUMPQUEUE, "no permission")
|
||||||
|
rxBus.send(EventPumpStatusChanged(EventPumpStatusChanged.Status.CONNECTING))
|
||||||
|
SystemClock.sleep(1000)
|
||||||
|
continue
|
||||||
|
}
|
||||||
if (!pump.isConnected() && secondsElapsed > Constants.PUMP_MAX_CONNECTION_TIME_IN_SECONDS) {
|
if (!pump.isConnected() && secondsElapsed > Constants.PUMP_MAX_CONNECTION_TIME_IN_SECONDS) {
|
||||||
rxBus.send(EventDismissBolusProgressIfRunning(null, null))
|
rxBus.send(EventDismissBolusProgressIfRunning(null, null))
|
||||||
rxBus.send(EventPumpStatusChanged(rh.gs(R.string.connectiontimedout)))
|
rxBus.send(EventPumpStatusChanged(rh.gs(R.string.connectiontimedout)))
|
||||||
|
|
|
@ -22,6 +22,7 @@ import info.nightscout.androidaps.plugins.bus.RxBus
|
||||||
import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker
|
import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker
|
||||||
import info.nightscout.androidaps.plugins.general.maintenance.PrefFileListProvider
|
import info.nightscout.androidaps.plugins.general.maintenance.PrefFileListProvider
|
||||||
import info.nightscout.androidaps.queue.commands.*
|
import info.nightscout.androidaps.queue.commands.*
|
||||||
|
import info.nightscout.androidaps.utils.AndroidPermission
|
||||||
import info.nightscout.androidaps.utils.DateUtil
|
import info.nightscout.androidaps.utils.DateUtil
|
||||||
import info.nightscout.androidaps.utils.FabricPrivacy
|
import info.nightscout.androidaps.utils.FabricPrivacy
|
||||||
import info.nightscout.androidaps.utils.buildHelper.BuildHelper
|
import info.nightscout.androidaps.utils.buildHelper.BuildHelper
|
||||||
|
@ -46,6 +47,7 @@ class CommandQueueImplementationTest : TestBaseWithProfile() {
|
||||||
@Mock lateinit var powerManager: PowerManager
|
@Mock lateinit var powerManager: PowerManager
|
||||||
@Mock lateinit var repository: AppRepository
|
@Mock lateinit var repository: AppRepository
|
||||||
@Mock lateinit var fileListProvider: PrefFileListProvider
|
@Mock lateinit var fileListProvider: PrefFileListProvider
|
||||||
|
@Mock lateinit var androidPermission: AndroidPermission
|
||||||
|
|
||||||
class CommandQueueMocked(
|
class CommandQueueMocked(
|
||||||
injector: HasAndroidInjector,
|
injector: HasAndroidInjector,
|
||||||
|
@ -62,9 +64,10 @@ class CommandQueueImplementationTest : TestBaseWithProfile() {
|
||||||
dateUtil: DateUtil,
|
dateUtil: DateUtil,
|
||||||
repository: AppRepository,
|
repository: AppRepository,
|
||||||
fabricPrivacy: FabricPrivacy,
|
fabricPrivacy: FabricPrivacy,
|
||||||
config: Config
|
config: Config,
|
||||||
|
androidPermission: AndroidPermission
|
||||||
) : CommandQueueImplementation(injector, aapsLogger, rxBus, aapsSchedulers, rh, constraintChecker, profileFunction,
|
) : CommandQueueImplementation(injector, aapsLogger, rxBus, aapsSchedulers, rh, constraintChecker, profileFunction,
|
||||||
activePlugin, context, sp, buildHelper, dateUtil, repository, fabricPrivacy, config) {
|
activePlugin, context, sp, buildHelper, dateUtil, repository, fabricPrivacy, config, androidPermission) {
|
||||||
|
|
||||||
override fun notifyAboutNewCommand() {}
|
override fun notifyAboutNewCommand() {}
|
||||||
|
|
||||||
|
@ -107,7 +110,7 @@ class CommandQueueImplementationTest : TestBaseWithProfile() {
|
||||||
constraintChecker, profileFunction, activePlugin, context, sp,
|
constraintChecker, profileFunction, activePlugin, context, sp,
|
||||||
BuildHelperImpl(config, fileListProvider), dateUtil,
|
BuildHelperImpl(config, fileListProvider), dateUtil,
|
||||||
repository,
|
repository,
|
||||||
fabricPrivacy, config)
|
fabricPrivacy, config, androidPermission)
|
||||||
testPumpPlugin = TestPumpPlugin(injector)
|
testPumpPlugin = TestPumpPlugin(injector)
|
||||||
|
|
||||||
testPumpPlugin.pumpDescription.basalMinimumRate = 0.1
|
testPumpPlugin.pumpDescription.basalMinimumRate = 0.1
|
||||||
|
@ -142,7 +145,7 @@ class CommandQueueImplementationTest : TestBaseWithProfile() {
|
||||||
constraintChecker, profileFunction, activePlugin, context, sp,
|
constraintChecker, profileFunction, activePlugin, context, sp,
|
||||||
BuildHelperImpl(config, fileListProvider),
|
BuildHelperImpl(config, fileListProvider),
|
||||||
dateUtil, repository,
|
dateUtil, repository,
|
||||||
fabricPrivacy, config)
|
fabricPrivacy, config, androidPermission)
|
||||||
// start with empty queue
|
// start with empty queue
|
||||||
Assert.assertEquals(0, commandQueue.size())
|
Assert.assertEquals(0, commandQueue.size())
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,7 @@ import info.nightscout.androidaps.plugins.configBuilder.ConstraintChecker
|
||||||
import info.nightscout.androidaps.plugins.general.maintenance.PrefFileListProvider
|
import info.nightscout.androidaps.plugins.general.maintenance.PrefFileListProvider
|
||||||
import info.nightscout.androidaps.queue.commands.Command
|
import info.nightscout.androidaps.queue.commands.Command
|
||||||
import info.nightscout.androidaps.queue.commands.CommandTempBasalAbsolute
|
import info.nightscout.androidaps.queue.commands.CommandTempBasalAbsolute
|
||||||
|
import info.nightscout.androidaps.utils.AndroidPermission
|
||||||
import info.nightscout.androidaps.utils.buildHelper.BuildHelperImpl
|
import info.nightscout.androidaps.utils.buildHelper.BuildHelperImpl
|
||||||
import info.nightscout.shared.sharedPreferences.SP
|
import info.nightscout.shared.sharedPreferences.SP
|
||||||
import org.junit.Assert
|
import org.junit.Assert
|
||||||
|
@ -33,6 +34,7 @@ class QueueThreadTest : TestBaseWithProfile() {
|
||||||
@Mock lateinit var fileListProvider: PrefFileListProvider
|
@Mock lateinit var fileListProvider: PrefFileListProvider
|
||||||
@Mock lateinit var powerManager: PowerManager
|
@Mock lateinit var powerManager: PowerManager
|
||||||
@Mock lateinit var repository: AppRepository
|
@Mock lateinit var repository: AppRepository
|
||||||
|
@Mock lateinit var androidPermission: AndroidPermission
|
||||||
|
|
||||||
val injector = HasAndroidInjector {
|
val injector = HasAndroidInjector {
|
||||||
AndroidInjector {
|
AndroidInjector {
|
||||||
|
@ -57,7 +59,7 @@ class QueueThreadTest : TestBaseWithProfile() {
|
||||||
commandQueue = CommandQueueImplementation(
|
commandQueue = CommandQueueImplementation(
|
||||||
injector, aapsLogger, rxBus, aapsSchedulers, rh, constraintChecker,
|
injector, aapsLogger, rxBus, aapsSchedulers, rh, constraintChecker,
|
||||||
profileFunction, activePlugin, context, sp,
|
profileFunction, activePlugin, context, sp,
|
||||||
BuildHelperImpl(config, fileListProvider), dateUtil, repository, fabricPrivacy, config
|
BuildHelperImpl(config, fileListProvider), dateUtil, repository, fabricPrivacy, config, androidPermission
|
||||||
)
|
)
|
||||||
|
|
||||||
val pumpDescription = PumpDescription()
|
val pumpDescription = PumpDescription()
|
||||||
|
@ -79,7 +81,7 @@ class QueueThreadTest : TestBaseWithProfile() {
|
||||||
.thenReturn(percentageConstraint)
|
.thenReturn(percentageConstraint)
|
||||||
Mockito.`when`(rh.gs(ArgumentMatchers.eq(R.string.temp_basal_absolute), anyObject(), anyObject())).thenReturn("TEMP BASAL %1\$.2f U/h %2\$d min")
|
Mockito.`when`(rh.gs(ArgumentMatchers.eq(R.string.temp_basal_absolute), anyObject(), anyObject())).thenReturn("TEMP BASAL %1\$.2f U/h %2\$d min")
|
||||||
|
|
||||||
sut = QueueThread(commandQueue, context, aapsLogger, rxBus, activePlugin, rh, sp)
|
sut = QueueThread(commandQueue, context, aapsLogger, rxBus, activePlugin, rh, sp, androidPermission)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
|
@ -20,8 +20,8 @@ import javax.inject.Singleton
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
class BlePreCheck @Inject constructor(
|
class BlePreCheck @Inject constructor(
|
||||||
val context: Context,
|
private val context: Context,
|
||||||
val rh: ResourceHelper
|
private val rh: ResourceHelper
|
||||||
) {
|
) {
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
@ -43,8 +43,12 @@ class BlePreCheck @Inject constructor(
|
||||||
}
|
}
|
||||||
// change after SDK = 31+
|
// change after SDK = 31+
|
||||||
if (Build.VERSION.SDK_INT >= /*Build.VERSION_CODES.S*/31) {
|
if (Build.VERSION.SDK_INT >= /*Build.VERSION_CODES.S*/31) {
|
||||||
|
if (ContextCompat.checkSelfPermission(context, "android.permission.BLUETOOTH_CONNECT") != PackageManager.PERMISSION_GRANTED ||
|
||||||
|
ContextCompat.checkSelfPermission(context, "android.permission.BLUETOOTH_SCAN") != PackageManager.PERMISSION_GRANTED
|
||||||
|
)
|
||||||
//ActivityCompat.requestPermissions(activity, arrayOf(Manifest.permission.BLUETOOTH_SCAN, Manifest.permission.BLUETOOTH_CONNECT), PERMISSION_REQUEST_BLUETOOTH)
|
//ActivityCompat.requestPermissions(activity, arrayOf(Manifest.permission.BLUETOOTH_SCAN, Manifest.permission.BLUETOOTH_CONNECT), PERMISSION_REQUEST_BLUETOOTH)
|
||||||
ActivityCompat.requestPermissions(activity, arrayOf("android.permission.BLUETOOTH_SCAN", "android.permission.BLUETOOTH_CONNECT"), PERMISSION_REQUEST_BLUETOOTH)
|
ActivityCompat.requestPermissions(activity, arrayOf("android.permission.BLUETOOTH_SCAN", "android.permission.BLUETOOTH_CONNECT"), PERMISSION_REQUEST_BLUETOOTH)
|
||||||
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
val bluetoothAdapter = (context.getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager?)?.adapter
|
val bluetoothAdapter = (context.getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager?)?.adapter
|
||||||
|
|
Loading…
Reference in a new issue