Commit 044688ca by Maurits van Beusekom

Added check to make sure location services are running on Android

parent f33b3741
...@@ -2,5 +2,5 @@ ...@@ -2,5 +2,5 @@
<classpath> <classpath>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8/"/> <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8/"/>
<classpathentry kind="con" path="org.eclipse.buildship.core.gradleclasspathcontainer"/> <classpathentry kind="con" path="org.eclipse.buildship.core.gradleclasspathcontainer"/>
<classpathentry kind="output" path="bin"/> <classpathentry kind="output" path="bin/default"/>
</classpath> </classpath>
...@@ -6,6 +6,7 @@ import android.content.Intent ...@@ -6,6 +6,7 @@ import android.content.Intent
import android.content.pm.PackageInfo import android.content.pm.PackageInfo
import android.content.pm.PackageManager import android.content.pm.PackageManager
import android.os.Build import android.os.Build
import android.provider.Settings
import android.support.v4.app.ActivityCompat import android.support.v4.app.ActivityCompat
import android.support.v4.content.ContextCompat import android.support.v4.content.ContextCompat
import android.util.Log import android.util.Log
...@@ -18,6 +19,10 @@ import io.flutter.plugin.common.MethodChannel.Result ...@@ -18,6 +19,10 @@ import io.flutter.plugin.common.MethodChannel.Result
import io.flutter.plugin.common.MethodCall import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.PluginRegistry import io.flutter.plugin.common.PluginRegistry
import io.flutter.plugin.common.PluginRegistry.Registrar import io.flutter.plugin.common.PluginRegistry.Registrar
import android.text.TextUtils
import android.provider.Settings.SettingNotFoundException
class PermissionHandlerPlugin(private val registrar: Registrar, private var requestedPermissions: MutableList<String>? = null) : MethodCallHandler { class PermissionHandlerPlugin(private val registrar: Registrar, private var requestedPermissions: MutableList<String>? = null) : MethodCallHandler {
private var mRequestResults = mutableMapOf<PermissionGroup, PermissionStatus>() private var mRequestResults = mutableMapOf<PermissionGroup, PermissionStatus>()
...@@ -149,6 +154,12 @@ class PermissionHandlerPlugin(private val registrar: Registrar, private var requ ...@@ -149,6 +154,12 @@ class PermissionHandlerPlugin(private val registrar: Registrar, private var requ
} }
} }
if (permission == PermissionGroup.LOCATION || permission == PermissionGroup.LOCATION_ALWAYS || permission == PermissionGroup.LOCATION_WHEN_IN_USE) {
if (!isLocationServiceEnabled(context)) {
return PermissionStatus.DISABLED
}
}
return PermissionStatus.GRANTED return PermissionStatus.GRANTED
} }
...@@ -245,16 +256,20 @@ class PermissionHandlerPlugin(private val registrar: Registrar, private var requ ...@@ -245,16 +256,20 @@ class PermissionHandlerPlugin(private val registrar: Registrar, private var requ
mRequestResults[PermissionGroup.SPEECH] = grantResults[i].toPermissionStatus() mRequestResults[PermissionGroup.SPEECH] = grantResults[i].toPermissionStatus()
} }
} else if (permission == PermissionGroup.LOCATION) { } else if (permission == PermissionGroup.LOCATION) {
val context: Context? = registrar.activity() ?: registrar.activeContext()
val isLocationServiceEnabled= if (context == null) false else isLocationServiceEnabled(context)
val permissionStatus = if (isLocationServiceEnabled) grantResults[i].toPermissionStatus() else PermissionStatus.DISABLED
if (!mRequestResults.containsKey(PermissionGroup.LOCATION_ALWAYS)) { if (!mRequestResults.containsKey(PermissionGroup.LOCATION_ALWAYS)) {
mRequestResults[PermissionGroup.LOCATION_ALWAYS] = grantResults[i].toPermissionStatus() mRequestResults[PermissionGroup.LOCATION_ALWAYS] = permissionStatus
} }
if (!mRequestResults.containsKey(PermissionGroup.LOCATION_WHEN_IN_USE)) { if (!mRequestResults.containsKey(PermissionGroup.LOCATION_WHEN_IN_USE)) {
mRequestResults[PermissionGroup.LOCATION_WHEN_IN_USE] = grantResults[i].toPermissionStatus() mRequestResults[PermissionGroup.LOCATION_WHEN_IN_USE] = permissionStatus
}
} }
if (!mRequestResults.containsKey(permission)) { mRequestResults[permission] = permissionStatus
} else if (!mRequestResults.containsKey(permission)) {
mRequestResults[permission] = grantResults[i].toPermissionStatus() mRequestResults[permission] = grantResults[i].toPermissionStatus()
} }
...@@ -436,6 +451,27 @@ class PermissionHandlerPlugin(private val registrar: Registrar, private var requ ...@@ -436,6 +451,27 @@ class PermissionHandlerPlugin(private val registrar: Registrar, private var requ
return false return false
} }
private fun isLocationServiceEnabled(context: Context): Boolean {
val locationMode: Int
val locationProviders: String
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
try {
locationMode = Settings.Secure.getInt(context.contentResolver, Settings.Secure.LOCATION_MODE)
} catch (e: SettingNotFoundException) {
e.printStackTrace()
return false
}
return locationMode != Settings.Secure.LOCATION_MODE_OFF
} else {
locationProviders = Settings.Secure.getString(context.contentResolver, Settings.Secure.LOCATION_PROVIDERS_ALLOWED)
return !TextUtils.isEmpty(locationProviders)
}
}
private fun handleSuccess(permissionStatus: PermissionStatus, result: Result?) { private fun handleSuccess(permissionStatus: PermissionStatus, result: Result?) {
result?.success(Codec.encodePermissionStatus(permissionStatus)) result?.success(Codec.encodePermissionStatus(permissionStatus))
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment