Split permissions per sensor enity (#991)

This commit is contained in:
Oleksandr Kapshuk 2020-10-01 05:20:39 +03:00 committed by GitHub
parent eeb3ab49da
commit 9473cbcce8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
24 changed files with 62 additions and 55 deletions

View file

@ -108,7 +108,7 @@ class ActivitySensorManager : BroadcastReceiver(), SensorManager {
override val availableSensors: List<SensorManager.BasicSensor> override val availableSensors: List<SensorManager.BasicSensor>
get() = listOf(activity) get() = listOf(activity)
override fun requiredPermissions(): Array<String> { override fun requiredPermissions(sensorId: String): Array<String> {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
arrayOf( arrayOf(
Manifest.permission.ACTIVITY_RECOGNITION Manifest.permission.ACTIVITY_RECOGNITION

View file

@ -33,7 +33,7 @@ class GeocodeSensorManager : SensorManager {
override val availableSensors: List<SensorManager.BasicSensor> override val availableSensors: List<SensorManager.BasicSensor>
get() = listOf(geocodedLocation) get() = listOf(geocodedLocation)
override fun requiredPermissions(): Array<String> { override fun requiredPermissions(sensorId: String): Array<String> {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
arrayOf( arrayOf(
Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION,
@ -51,7 +51,7 @@ class GeocodeSensorManager : SensorManager {
} }
private fun updateGeocodedLocation(context: Context) { private fun updateGeocodedLocation(context: Context) {
if (!isEnabled(context, geocodedLocation.id) || !checkPermission(context)) if (!isEnabled(context, geocodedLocation.id) || !checkPermission(context, geocodedLocation.id))
return return
val locApi = LocationServices.getFusedLocationProviderClient(context) val locApi = LocationServices.getFusedLocationProviderClient(context)
locApi.lastLocation.addOnSuccessListener { location -> locApi.lastLocation.addOnSuccessListener { location ->

View file

@ -107,7 +107,7 @@ class LocationSensorManager : BroadcastReceiver(), SensorManager {
} }
private fun setupLocationTracking() { private fun setupLocationTracking() {
if (!checkPermission(latestContext)) { if (!checkPermission(latestContext, backgroundLocation.id)) {
Log.w(TAG, "Not starting location reporting because of permissions.") Log.w(TAG, "Not starting location reporting because of permissions.")
return return
} }
@ -149,7 +149,7 @@ class LocationSensorManager : BroadcastReceiver(), SensorManager {
} }
private fun requestLocationUpdates() { private fun requestLocationUpdates() {
if (!checkPermission(latestContext)) { if (!checkPermission(latestContext, backgroundLocation.id)) {
Log.w(TAG, "Not registering for location updates because of permissions.") Log.w(TAG, "Not registering for location updates because of permissions.")
return return
} }
@ -165,7 +165,7 @@ class LocationSensorManager : BroadcastReceiver(), SensorManager {
} }
private suspend fun requestZoneUpdates() { private suspend fun requestZoneUpdates() {
if (!checkPermission(latestContext)) { if (!checkPermission(latestContext, zoneLocation.id)) {
Log.w(TAG, "Not registering for zone based updates because of permissions.") Log.w(TAG, "Not registering for zone based updates because of permissions.")
return return
} }
@ -308,7 +308,7 @@ class LocationSensorManager : BroadcastReceiver(), SensorManager {
} }
private fun requestSingleAccurateLocation() { private fun requestSingleAccurateLocation() {
if (!checkPermission(latestContext)) { if (!checkPermission(latestContext, singleAccurateLocation.id)) {
Log.w(TAG, "Not getting single accurate location because of permissions.") Log.w(TAG, "Not getting single accurate location because of permissions.")
return return
} }
@ -402,7 +402,7 @@ class LocationSensorManager : BroadcastReceiver(), SensorManager {
override val availableSensors: List<SensorManager.BasicSensor> override val availableSensors: List<SensorManager.BasicSensor>
get() = listOf(singleAccurateLocation, backgroundLocation, zoneLocation) get() = listOf(singleAccurateLocation, backgroundLocation, zoneLocation)
override fun requiredPermissions(): Array<String> { override fun requiredPermissions(sensorId: String): Array<String> {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
arrayOf( arrayOf(
Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION,

View file

@ -66,12 +66,13 @@ class MobileAppIntegrationFragment : Fragment(), MobileAppIntegrationView {
findViewById<TextInputEditText>(R.id.deviceName).setText(Build.MODEL) findViewById<TextInputEditText>(R.id.deviceName).setText(Build.MODEL)
findViewById<SwitchMaterial>(R.id.locationTracking)?.let { findViewById<SwitchMaterial>(R.id.locationTracking)?.let {
it.isChecked = LocationSensorManager().checkPermission(context) val sensorId = LocationSensorManager.backgroundLocation.id
it.isChecked = LocationSensorManager().checkPermission(context, sensorId)
it.setOnCheckedChangeListener { _, isChecked -> it.setOnCheckedChangeListener { _, isChecked ->
setLocationTracking(isChecked) setLocationTracking(isChecked)
if (isChecked && !LocationSensorManager().checkPermission(requireContext())) { if (isChecked && !LocationSensorManager().checkPermission(requireContext(), sensorId)) {
this@MobileAppIntegrationFragment.requestPermissions( this@MobileAppIntegrationFragment.requestPermissions(
LocationSensorManager().requiredPermissions(), LocationSensorManager().requiredPermissions(sensorId),
LOCATION_REQUEST_CODE LOCATION_REQUEST_CODE
) )
} }

View file

@ -81,7 +81,7 @@ class AudioSensorManager : SensorManager {
override val availableSensors: List<SensorManager.BasicSensor> override val availableSensors: List<SensorManager.BasicSensor>
get() = listOf(audioSensor, audioState, headphoneState, micMuted, speakerphoneState, musicActive, volAlarm, volCall, volMusic, volRing) get() = listOf(audioSensor, audioState, headphoneState, micMuted, speakerphoneState, musicActive, volAlarm, volCall, volMusic, volRing)
override fun requiredPermissions(): Array<String> { override fun requiredPermissions(sensorId: String): Array<String> {
return emptyArray() return emptyArray()
} }

View file

@ -54,7 +54,7 @@ class BatterySensorManager : SensorManager {
override val availableSensors: List<SensorManager.BasicSensor> override val availableSensors: List<SensorManager.BasicSensor>
get() = listOf(batteryLevel, batteryState, isChargingState, chargerTypeState, batteryHealthState) get() = listOf(batteryLevel, batteryState, isChargingState, chargerTypeState, batteryHealthState)
override fun requiredPermissions(): Array<String> { override fun requiredPermissions(sensorId: String): Array<String> {
return emptyArray() return emptyArray()
} }

View file

@ -33,7 +33,7 @@ class BluetoothSensorManager : SensorManager {
override val availableSensors: List<SensorManager.BasicSensor> override val availableSensors: List<SensorManager.BasicSensor>
get() = listOf(bluetoothConnection, bluetoothState) get() = listOf(bluetoothConnection, bluetoothState)
override fun requiredPermissions(): Array<String> { override fun requiredPermissions(sensorId: String): Array<String> {
return arrayOf(Manifest.permission.BLUETOOTH) return arrayOf(Manifest.permission.BLUETOOTH)
} }
@ -56,7 +56,7 @@ class BluetoothSensorManager : SensorManager {
var bondedString = "" var bondedString = ""
var isBtOn = false var isBtOn = false
if (checkPermission(context)) { if (checkPermission(context, bluetoothConnection.id)) {
val bluetoothManager = val bluetoothManager =
(context.applicationContext.getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager) (context.applicationContext.getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager)
@ -110,7 +110,7 @@ class BluetoothSensorManager : SensorManager {
var isBtOn = false var isBtOn = false
if (checkPermission(context)) { if (checkPermission(context, bluetoothState.id)) {
val bluetoothManager = val bluetoothManager =
(context.applicationContext.getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager) (context.applicationContext.getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager)

View file

@ -25,7 +25,7 @@ class DNDSensorManager : SensorManager {
override val availableSensors: List<SensorManager.BasicSensor> override val availableSensors: List<SensorManager.BasicSensor>
get() = listOf(dndSensor) get() = listOf(dndSensor)
override fun requiredPermissions(): Array<String> { override fun requiredPermissions(sensorId: String): Array<String> {
return emptyArray() return emptyArray()
} }

View file

@ -37,7 +37,7 @@ class LastRebootSensorManager : SensorManager {
override val availableSensors: List<SensorManager.BasicSensor> override val availableSensors: List<SensorManager.BasicSensor>
get() = listOf(lastRebootSensor) get() = listOf(lastRebootSensor)
override fun requiredPermissions(): Array<String> { override fun requiredPermissions(sensorId: String): Array<String> {
return emptyArray() return emptyArray()
} }

View file

@ -35,7 +35,7 @@ class LightSensorManager : SensorManager, SensorEventListener {
override val availableSensors: List<SensorManager.BasicSensor> override val availableSensors: List<SensorManager.BasicSensor>
get() = listOf(lightSensor) get() = listOf(lightSensor)
override fun requiredPermissions(): Array<String> { override fun requiredPermissions(sensorId: String): Array<String> {
return emptyArray() return emptyArray()
} }

View file

@ -91,14 +91,20 @@ class NetworkSensorManager : SensorManager {
publicIp publicIp
) )
override fun requiredPermissions(): Array<String> { override fun requiredPermissions(sensorId: String): Array<String> {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { return when {
arrayOf( sensorId == publicIp.id -> {
Manifest.permission.ACCESS_FINE_LOCATION, arrayOf()
Manifest.permission.ACCESS_BACKGROUND_LOCATION }
) Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q -> {
} else { arrayOf(
arrayOf(Manifest.permission.ACCESS_FINE_LOCATION) Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_BACKGROUND_LOCATION
)
}
else -> {
arrayOf(Manifest.permission.ACCESS_FINE_LOCATION)
}
} }
} }
@ -124,7 +130,7 @@ class NetworkSensorManager : SensorManager {
var lastScanStrength = -1 var lastScanStrength = -1
var wifiEnabled = false var wifiEnabled = false
if (checkPermission(context)) { if (checkPermission(context, wifiConnection.id)) {
val wifiManager = val wifiManager =
(context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager) (context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager)
conInfo = wifiManager.connectionInfo conInfo = wifiManager.connectionInfo
@ -171,7 +177,7 @@ class NetworkSensorManager : SensorManager {
var conInfo: WifiInfo? = null var conInfo: WifiInfo? = null
if (checkPermission(context)) { if (checkPermission(context, bssidState.id)) {
val wifiManager = val wifiManager =
(context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager) (context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager)
conInfo = wifiManager.connectionInfo conInfo = wifiManager.connectionInfo
@ -215,7 +221,7 @@ class NetworkSensorManager : SensorManager {
var conInfo: WifiInfo? = null var conInfo: WifiInfo? = null
var deviceIp = "Unknown" var deviceIp = "Unknown"
if (checkPermission(context)) { if (checkPermission(context, wifiIp.id)) {
val wifiManager = val wifiManager =
(context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager) (context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager)
conInfo = wifiManager.connectionInfo conInfo = wifiManager.connectionInfo
@ -246,7 +252,7 @@ class NetworkSensorManager : SensorManager {
var linkSpeed = 0 var linkSpeed = 0
var lastScanStrength = -1 var lastScanStrength = -1
if (checkPermission(context)) { if (checkPermission(context, wifiLinkSpeed.id)) {
val wifiManager = val wifiManager =
(context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager) (context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager)
conInfo = wifiManager.connectionInfo conInfo = wifiManager.connectionInfo
@ -288,7 +294,7 @@ class NetworkSensorManager : SensorManager {
var wifiEnabled = false var wifiEnabled = false
if (checkPermission(context)) { if (checkPermission(context, wifiState.id)) {
val wifiManager = val wifiManager =
(context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager) (context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager)
@ -312,7 +318,7 @@ class NetworkSensorManager : SensorManager {
var conInfo: WifiInfo? = null var conInfo: WifiInfo? = null
var frequency = 0 var frequency = 0
if (checkPermission(context)) { if (checkPermission(context, wifiFrequency.id)) {
val wifiManager = val wifiManager =
(context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager) (context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager)
conInfo = wifiManager.connectionInfo conInfo = wifiManager.connectionInfo
@ -342,7 +348,7 @@ class NetworkSensorManager : SensorManager {
var conInfo: WifiInfo? = null var conInfo: WifiInfo? = null
var lastScanStrength = -1 var lastScanStrength = -1
if (checkPermission(context)) { if (checkPermission(context, wifiSignalStrength.id)) {
val wifiManager = val wifiManager =
(context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager) (context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager)
conInfo = wifiManager.connectionInfo conInfo = wifiManager.connectionInfo

View file

@ -34,7 +34,7 @@ class NextAlarmManager : SensorManager {
override val availableSensors: List<SensorManager.BasicSensor> override val availableSensors: List<SensorManager.BasicSensor>
get() = listOf(nextAlarm) get() = listOf(nextAlarm)
override fun requiredPermissions(): Array<String> { override fun requiredPermissions(sensorId: String): Array<String> {
return emptyArray() return emptyArray()
} }

View file

@ -44,7 +44,7 @@ class PhoneStateSensorManager : SensorManager {
listOf(phoneState, sim_1, sim_2) listOf(phoneState, sim_1, sim_2)
else listOf(phoneState) else listOf(phoneState)
override fun requiredPermissions(): Array<String> { override fun requiredPermissions(sensorId: String): Array<String> {
return arrayOf(Manifest.permission.READ_PHONE_STATE) return arrayOf(Manifest.permission.READ_PHONE_STATE)
} }
@ -60,7 +60,7 @@ class PhoneStateSensorManager : SensorManager {
if (!isEnabled(context, phoneState.id)) if (!isEnabled(context, phoneState.id))
return return
var currentPhoneState = "unavailable" var currentPhoneState = "unavailable"
if (checkPermission(context)) { if (checkPermission(context, phoneState.id)) {
val telephonyManager = val telephonyManager =
(context.applicationContext.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager) (context.applicationContext.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager)
@ -96,7 +96,7 @@ class PhoneStateSensorManager : SensorManager {
var displayName = "Unavailable" var displayName = "Unavailable"
val attrs = mutableMapOf<String, Any>() val attrs = mutableMapOf<String, Any>()
if (checkPermission(context)) { if (checkPermission(context, basicSimSensor.id)) {
val subscriptionManager = val subscriptionManager =
(context.applicationContext.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE)) as SubscriptionManager (context.applicationContext.getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE)) as SubscriptionManager
val info: SubscriptionInfo? = subscriptionManager.getActiveSubscriptionInfoForSimSlotIndex(slotIndex) val info: SubscriptionInfo? = subscriptionManager.getActiveSubscriptionInfoForSimSlotIndex(slotIndex)

View file

@ -44,7 +44,7 @@ class PowerSensorManager : SensorManager {
listOf(interactiveDevice, powerSave) listOf(interactiveDevice, powerSave)
} }
override fun requiredPermissions(): Array<String> { override fun requiredPermissions(sensorId: String): Array<String> {
return emptyArray() return emptyArray()
} }

View file

@ -38,7 +38,7 @@ class PressureSensorManager : SensorManager, SensorEventListener {
override val availableSensors: List<SensorManager.BasicSensor> override val availableSensors: List<SensorManager.BasicSensor>
get() = listOf(pressureSensor) get() = listOf(pressureSensor)
override fun requiredPermissions(): Array<String> { override fun requiredPermissions(sensorId: String): Array<String> {
return emptyArray() return emptyArray()
} }

View file

@ -37,7 +37,7 @@ class ProximitySensorManager : SensorManager, SensorEventListener {
override val availableSensors: List<SensorManager.BasicSensor> override val availableSensors: List<SensorManager.BasicSensor>
get() = listOf(proximitySensor) get() = listOf(proximitySensor)
override fun requiredPermissions(): Array<String> { override fun requiredPermissions(sensorId: String): Array<String> {
return emptyArray() return emptyArray()
} }

View file

@ -54,7 +54,7 @@ class SensorDetailFragment(
findPreference<SwitchPreference>("enabled")?.let { findPreference<SwitchPreference>("enabled")?.let {
val dao = sensorDao.get(basicSensor.id) val dao = sensorDao.get(basicSensor.id)
val perm = sensorManager.checkPermission(requireContext()) val perm = sensorManager.checkPermission(requireContext(), basicSensor.id)
if (dao == null && sensorManager.enabledByDefault) { if (dao == null && sensorManager.enabledByDefault) {
it.isChecked = perm it.isChecked = perm
} }
@ -66,8 +66,8 @@ class SensorDetailFragment(
it.setOnPreferenceChangeListener { _, newState -> it.setOnPreferenceChangeListener { _, newState ->
val isEnabled = newState as Boolean val isEnabled = newState as Boolean
if (isEnabled && !sensorManager.checkPermission(requireContext())) { if (isEnabled && !sensorManager.checkPermission(requireContext(), basicSensor.id)) {
requestPermissions(sensorManager.requiredPermissions(), 0) requestPermissions(sensorManager.requiredPermissions(basicSensor.id), 0)
return@setOnPreferenceChangeListener false return@setOnPreferenceChangeListener false
} }

View file

@ -24,10 +24,10 @@ interface SensorManager {
val unitOfMeasurement: String? = null val unitOfMeasurement: String? = null
) )
fun requiredPermissions(): Array<String> fun requiredPermissions(sensorId: String): Array<String>
fun checkPermission(context: Context): Boolean { fun checkPermission(context: Context, sensorId: String): Boolean {
return requiredPermissions().all { return requiredPermissions(sensorId).all {
context.checkPermission(it, myPid(), myUid()) == PackageManager.PERMISSION_GRANTED context.checkPermission(it, myPid(), myUid()) == PackageManager.PERMISSION_GRANTED
} }
} }
@ -35,7 +35,7 @@ interface SensorManager {
fun isEnabled(context: Context, sensorId: String): Boolean { fun isEnabled(context: Context, sensorId: String): Boolean {
val sensorDao = AppDatabase.getInstance(context).sensorDao() val sensorDao = AppDatabase.getInstance(context).sensorDao()
var sensor = sensorDao.get(sensorId) var sensor = sensorDao.get(sensorId)
val permission = checkPermission(context) val permission = checkPermission(context, sensorId)
// If we haven't created the entity yet do so and default to enabled if required // If we haven't created the entity yet do so and default to enabled if required
if (sensor == null) { if (sensor == null) {

View file

@ -39,7 +39,7 @@ class StepsSensorManager : SensorManager, SensorEventListener {
private lateinit var latestContext: Context private lateinit var latestContext: Context
private lateinit var mySensorManager: android.hardware.SensorManager private lateinit var mySensorManager: android.hardware.SensorManager
override fun requiredPermissions(): Array<String> { override fun requiredPermissions(sensorId: String): Array<String> {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
arrayOf( arrayOf(
Manifest.permission.ACTIVITY_RECOGNITION Manifest.permission.ACTIVITY_RECOGNITION
@ -65,7 +65,7 @@ class StepsSensorManager : SensorManager, SensorEventListener {
if (!isEnabled(latestContext, stepsSensor.id)) if (!isEnabled(latestContext, stepsSensor.id))
return return
if (checkPermission(latestContext)) { if (checkPermission(latestContext, stepsSensor.id)) {
mySensorManager = mySensorManager =
latestContext.getSystemService(SENSOR_SERVICE) as android.hardware.SensorManager latestContext.getSystemService(SENSOR_SERVICE) as android.hardware.SensorManager

View file

@ -67,7 +67,7 @@ class StorageSensorManager : SensorManager {
override val availableSensors: List<SensorManager.BasicSensor> override val availableSensors: List<SensorManager.BasicSensor>
get() = listOf(storageSensor, externalStorage) get() = listOf(storageSensor, externalStorage)
override fun requiredPermissions(): Array<String> { override fun requiredPermissions(sensorId: String): Array<String> {
return emptyArray() return emptyArray()
} }

View file

@ -55,7 +55,7 @@ class TrafficStatsManager : SensorManager {
listOf(rxBytesMobile, txBytesMobile, rxBytesTotal, txBytesTotal) listOf(rxBytesMobile, txBytesMobile, rxBytesTotal, txBytesTotal)
} else listOf(rxBytesTotal, txBytesTotal) } else listOf(rxBytesTotal, txBytesTotal)
override fun requiredPermissions(): Array<String> { override fun requiredPermissions(senorId: String): Array<String> {
return emptyArray() return emptyArray()
} }

View file

@ -19,7 +19,7 @@ class ActivitySensorManager : BroadcastReceiver(), SensorManager {
override val availableSensors: List<SensorManager.BasicSensor> override val availableSensors: List<SensorManager.BasicSensor>
get() = listOf() get() = listOf()
override fun requiredPermissions(): Array<String> { override fun requiredPermissions(sensorId: String): Array<String> {
// Noop // Noop
return emptyArray() return emptyArray()
} }

View file

@ -23,7 +23,7 @@ class GeocodeSensorManager : SensorManager {
override val availableSensors: List<SensorManager.BasicSensor> override val availableSensors: List<SensorManager.BasicSensor>
get() = listOf() get() = listOf()
override fun requiredPermissions(): Array<String> { override fun requiredPermissions(sensorId: String): Array<String> {
return emptyArray() return emptyArray()
} }

View file

@ -51,7 +51,7 @@ class LocationSensorManager : BroadcastReceiver(), SensorManager {
override val availableSensors: List<SensorManager.BasicSensor> override val availableSensors: List<SensorManager.BasicSensor>
get() = listOf() get() = listOf()
override fun requiredPermissions(): Array<String> { override fun requiredPermissions(sensorId: String): Array<String> {
// Noop // Noop
return emptyArray() return emptyArray()
} }