diff --git a/app/src/main/java/io/homeassistant/companion/android/onboarding/integration/MobileAppIntegrationFragment.kt b/app/src/main/java/io/homeassistant/companion/android/onboarding/integration/MobileAppIntegrationFragment.kt index 18d966348..d9a5213e3 100644 --- a/app/src/main/java/io/homeassistant/companion/android/onboarding/integration/MobileAppIntegrationFragment.kt +++ b/app/src/main/java/io/homeassistant/companion/android/onboarding/integration/MobileAppIntegrationFragment.kt @@ -1,5 +1,6 @@ package io.homeassistant.companion.android.onboarding.integration +import android.Manifest import android.annotation.SuppressLint import android.content.Intent import android.content.pm.PackageManager @@ -71,10 +72,19 @@ class MobileAppIntegrationFragment : Fragment(), MobileAppIntegrationView { it.setOnCheckedChangeListener { _, isChecked -> setLocationTracking(isChecked) if (isChecked && !LocationSensorManager().checkPermission(requireContext(), sensorId)) { - this@MobileAppIntegrationFragment.requestPermissions( - LocationSensorManager().requiredPermissions(sensorId), - LOCATION_REQUEST_CODE - ) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + this@MobileAppIntegrationFragment.requestPermissions( + LocationSensorManager().requiredPermissions(sensorId) + .toList().minus(Manifest.permission.ACCESS_BACKGROUND_LOCATION) + .toTypedArray(), + LOCATION_REQUEST_CODE + ) + } else { + this@MobileAppIntegrationFragment.requestPermissions( + LocationSensorManager().requiredPermissions(sensorId), + LOCATION_REQUEST_CODE + ) + } } } } @@ -127,6 +137,11 @@ class MobileAppIntegrationFragment : Fragment(), MobileAppIntegrationView { ) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) + if (permissions.contains(Manifest.permission.ACCESS_FINE_LOCATION) && + Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + requestPermissions(arrayOf(Manifest.permission.ACCESS_BACKGROUND_LOCATION), 0) + } + if (requestCode == LOCATION_REQUEST_CODE) { val hasPermission = grantResults.all { it == PackageManager.PERMISSION_GRANTED } locationTracking.isChecked = hasPermission diff --git a/app/src/main/java/io/homeassistant/companion/android/sensors/SensorDetailFragment.kt b/app/src/main/java/io/homeassistant/companion/android/sensors/SensorDetailFragment.kt index d9e4c4ff3..89cf208bc 100644 --- a/app/src/main/java/io/homeassistant/companion/android/sensors/SensorDetailFragment.kt +++ b/app/src/main/java/io/homeassistant/companion/android/sensors/SensorDetailFragment.kt @@ -75,6 +75,9 @@ class SensorDetailFragment( when { permissions.any { perm -> perm == Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE } -> startActivity(Intent(Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS)) + android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q -> + requestPermissions(permissions.toSet() + .minus(Manifest.permission.ACCESS_BACKGROUND_LOCATION).toTypedArray(), 0) else -> requestPermissions(permissions, 0) } return@setOnPreferenceChangeListener false @@ -280,6 +283,11 @@ class SensorDetailFragment( ) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) + if (permissions.contains(Manifest.permission.ACCESS_FINE_LOCATION) && + android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) { + requestPermissions(arrayOf(Manifest.permission.ACCESS_BACKGROUND_LOCATION), 0) + } + findPreference("enabled")?.run { isChecked = grantResults.all { it == PackageManager.PERMISSION_GRANTED } diff --git a/app/src/main/java/io/homeassistant/companion/android/sensors/SensorsSettingsFragment.kt b/app/src/main/java/io/homeassistant/companion/android/sensors/SensorsSettingsFragment.kt index adbd5b3e2..db682f497 100644 --- a/app/src/main/java/io/homeassistant/companion/android/sensors/SensorsSettingsFragment.kt +++ b/app/src/main/java/io/homeassistant/companion/android/sensors/SensorsSettingsFragment.kt @@ -1,9 +1,12 @@ package io.homeassistant.companion.android.sensors +import android.Manifest +import android.content.Intent import android.content.pm.PackageManager import android.os.Bundle import android.os.Handler import android.os.Looper +import android.provider.Settings import androidx.preference.Preference import androidx.preference.PreferenceCategory import androidx.preference.PreferenceFragmentCompat @@ -116,7 +119,14 @@ class SensorsSettingsFragment : PreferenceFragmentCompat() { } } if (!permArray.isNullOrEmpty()) - requestPermissions(permArray, 0) + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) { + requestPermissions(permArray.toSet() + .minus(Manifest.permission.ACCESS_BACKGROUND_LOCATION) + .toTypedArray(), 0) + } else { + requestPermissions(permArray, 0) + } + return@setOnPreferenceChangeListener true } } @@ -169,6 +179,15 @@ class SensorsSettingsFragment : PreferenceFragmentCompat() { ) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) + if (permissions.contains(Manifest.permission.ACCESS_FINE_LOCATION) && + android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) { + requestPermissions(arrayOf(Manifest.permission.ACCESS_BACKGROUND_LOCATION), 0) + return + } + + if (permissions.any { perm -> perm == Manifest.permission.BIND_NOTIFICATION_LISTENER_SERVICE }) + startActivity(Intent(Settings.ACTION_NOTIFICATION_LISTENER_SETTINGS)) + findPreference("enable_disable_sensors")?.run { permissionsAllGranted = grantResults.all { it == PackageManager.PERMISSION_GRANTED } this.isChecked = permissionsAllGranted