improve Android12 permision handling

This commit is contained in:
Milos Kozak 2022-01-05 18:12:39 +01:00
parent 8ac3f38117
commit 445b1bb6ae
6 changed files with 37 additions and 14 deletions

View file

@ -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")

View file

@ -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()

View file

@ -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)))

View file

@ -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())

View file

@ -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

View file

@ -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