diff --git a/CHANGELOG.md b/CHANGELOG.md index 211476783a..ebd8b80666 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,11 @@ * Small performance improvements to `Bugnag.start` [#1680](https://github.com/bugsnag/bugsnag-android/pull/1680) +### Bug fixes + +* Correctly report `device.locationStatus` on Android 12 onwards using `LocationManager.isLocationEnabled` + [1683](https://github.com/bugsnag/bugsnag-android/pull/1683) + ## 5.22.2 (2022-05-04) ### Bug fixes diff --git a/bugsnag-android-core/src/main/java/com/bugsnag/android/ContextExtensions.kt b/bugsnag-android-core/src/main/java/com/bugsnag/android/ContextExtensions.kt index 667d536e8a..da0c4c3c9e 100644 --- a/bugsnag-android-core/src/main/java/com/bugsnag/android/ContextExtensions.kt +++ b/bugsnag-android-core/src/main/java/com/bugsnag/android/ContextExtensions.kt @@ -5,6 +5,7 @@ import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.content.IntentFilter +import android.location.LocationManager import android.net.ConnectivityManager import android.os.RemoteException import android.os.storage.StorageManager @@ -69,3 +70,7 @@ internal fun Context.getConnectivityManager(): ConnectivityManager? = @JvmName("getStorageManagerFrom") internal fun Context.getStorageManager(): StorageManager? = safeGetSystemService(Context.STORAGE_SERVICE) + +@JvmName("getLocationManager") +internal fun Context.getLocationManager(): LocationManager? = + safeGetSystemService(Context.LOCATION_SERVICE) diff --git a/bugsnag-android-core/src/main/java/com/bugsnag/android/DeviceDataCollector.kt b/bugsnag-android-core/src/main/java/com/bugsnag/android/DeviceDataCollector.kt index 69c4063e97..ca119d3c46 100644 --- a/bugsnag-android-core/src/main/java/com/bugsnag/android/DeviceDataCollector.kt +++ b/bugsnag-android-core/src/main/java/com/bugsnag/android/DeviceDataCollector.kt @@ -13,7 +13,6 @@ import android.os.Build import android.provider.Settings import java.io.File import java.util.Date -import java.util.HashMap import java.util.Locale import java.util.concurrent.Callable import java.util.concurrent.Future @@ -163,19 +162,24 @@ internal class DeviceDataCollector( */ private fun getLocationStatus(): String? { try { - val cr = appContext.contentResolver - @Suppress("DEPRECATION") val providersAllowed = - Settings.Secure.getString(cr, Settings.Secure.LOCATION_PROVIDERS_ALLOWED) - return when { - providersAllowed != null && providersAllowed.isNotEmpty() -> "allowed" - else -> "disallowed" - } + return if (isLocationEnabled()) "allowed" else "disallowed" } catch (exception: Exception) { logger.w("Could not get locationStatus") } return null } + private fun isLocationEnabled() = when { + Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> + appContext.getLocationManager()?.isLocationEnabled == true + else -> { + val cr = appContext.contentResolver + @Suppress("DEPRECATION") val providersAllowed = + Settings.Secure.getString(cr, Settings.Secure.LOCATION_PROVIDERS_ALLOWED) + providersAllowed != null && providersAllowed.isNotEmpty() + } + } + /** * Get the current status of network access, eg "cellular" */