Skip to content

Commit

Permalink
use airpermissions library for handling runtime permissions
Browse files Browse the repository at this point in the history
  • Loading branch information
mumayank committed Jun 7, 2020
1 parent fb5361c commit 2d4e1ca
Show file tree
Hide file tree
Showing 5 changed files with 56 additions and 188 deletions.
1 change: 1 addition & 0 deletions airlocationlibrary/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ dependencies {
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.72"
api 'com.google.android.gms:play-services-location:17.0.0'
implementation 'com.github.mumayank:AirPermissionsLibraryProject:3.0'
}

repositories {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package mumayank.com.airlocationlibrary

import android.Manifest
import android.annotation.SuppressLint
import android.app.Activity
import android.content.Intent
Expand All @@ -11,6 +12,7 @@ import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.OnLifecycleEvent
import com.google.android.gms.location.*
import mumayank.com.airlocationlibrary.helpers.*
import mumayank.com.airpermissions.AirPermissions
import java.io.Serializable
import java.lang.ref.WeakReference

Expand All @@ -29,7 +31,6 @@ class AirLocation(
private lateinit var fusedLocationClient: FusedLocationProviderClient

private var isStartCalled = false
private var isStopLocationUpdateRequested = false

private val activityWeakReference = WeakReference(activity)

Expand All @@ -47,19 +48,14 @@ class AirLocation(
callback?.onFailure(LocationFailedEnum.GOOGLE_PLAY_API_NOT_AVAILABLE)
})

private val locationPermissionHelper = LocationPermissionHelper(activity, activityWeakReference, fun() {
if (ActivityHelper.isActivityWeakReferenceNull(activityWeakReference)) {
return
}

private val airPermissions = AirPermissions(activity, arrayOf(
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION
), fun() {
checkIfInFlightMode()
}, fun() {
if (ActivityHelper.isActivityWeakReferenceNull(activityWeakReference)) {
return
}

callback?.onFailure(LocationFailedEnum.LOCATION_PERMISSION_NOT_GRANTED)
}, toastTextWhenOpenAppSettingsIfPermissionsPermanentlyDenied)
})

private val locationOptimizationPermissionHelper = LocationOptimizationPermissionHelper(
activity,
Expand Down Expand Up @@ -104,7 +100,6 @@ class AirLocation(
}

isStartCalled = true
isStopLocationUpdateRequested = false
makeGooglePlayApiAvailable()
}

Expand All @@ -121,7 +116,7 @@ class AirLocation(
return
}

locationPermissionHelper.getPermissions()
airPermissions.request()
}

private fun checkIfInFlightMode() {
Expand Down Expand Up @@ -185,9 +180,7 @@ class AirLocation(
return
}

if (isStopLocationUpdateRequested.not()) {
requestLocationUpdates()
}
requestLocationUpdates()
}

@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
Expand Down Expand Up @@ -251,7 +244,7 @@ class AirLocation(
return
}

locationPermissionHelper.onRequestPermissionsResult(requestCode, permissions, grantResults)
airPermissions.onRequestPermissionsResult(requestCode)
}

fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
Expand All @@ -263,21 +256,9 @@ class AirLocation(
return
}

airPermissions.onActivityResult(requestCode)
locationOptimizationPermissionHelper.onActivityResult(requestCode, resultCode, data)
googlePlayApiHelper.onActivityResult(requestCode, resultCode, data)
}

fun stopLocationUpdates() {
if (ActivityHelper.isActivityWeakReferenceNull(activityWeakReference)) {
return
}

if (isStartCalled.not()) {
return
}

isStopLocationUpdateRequested = true
fusedLocationClient.removeLocationUpdates(locationCallback)
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,17 @@ class LocationPermissionHelper(
return
}

if (isPermissionListGranted(activity, getPermissionList())) {
if (permissionList.all {
ContextCompat.checkSelfPermission(
activity,
it
) == PackageManager.PERMISSION_GRANTED
}) {
onSuccess?.invoke()
} else {
ActivityCompat.requestPermissions(
activityWeakReference.get() as Activity,
getPermissionList().toTypedArray(),
permissionList.toTypedArray(),
REQUEST_CODE
)
}
Expand All @@ -50,19 +55,20 @@ class LocationPermissionHelper(
return
}

var granted = true
for (grantResult in grantResults) {
if (grantResult != PackageManager.PERMISSION_GRANTED) {
granted = false
break
}
}

if (granted) {
if (grantResults.all { it == PackageManager.PERMISSION_GRANTED }) {
onSuccess?.invoke()
} else {
if (isAnyPermissionPermanentlyDisabled(activity, getPermissionList())) {
openAppPermissionSettings(activity, toastTextWhenOpenAppSettingsIfPermissionsPermanentlyDenied)
if (permissionList.any {
(ContextCompat.checkSelfPermission(activity, it)
!= PackageManager.PERMISSION_GRANTED)
&& (ActivityCompat.shouldShowRequestPermissionRationale(
activity, it
).not())
}) {
openAppPermissionSettings(
activity,
toastTextWhenOpenAppSettingsIfPermissionsPermanentlyDenied
)
} else {
// intentonally ignored because no need to additionally also open settings page
// as user hasn't permanently disabled the settings yet
Expand All @@ -78,52 +84,15 @@ class LocationPermissionHelper(

private const val REQUEST_CODE = 1236

private fun getPermissionList(): ArrayList<String> {
val permissions = ArrayList<String>()
permissions.add(Manifest.permission.ACCESS_FINE_LOCATION)
permissions.add(Manifest.permission.ACCESS_COARSE_LOCATION)
return permissions
}

private fun isPermissionListGranted(
activity: Activity,
permissions: ArrayList<String>
): Boolean {
var isGranted = true
for (permission in permissions) {
val isThisPermissionGranted = ContextCompat.checkSelfPermission(
activity,
permission
) == PackageManager.PERMISSION_GRANTED
if (isThisPermissionGranted.not()) {
isGranted = false
break
}
}
return isGranted
}
private val permissionList = arrayListOf(
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION
)

private fun isAnyPermissionPermanentlyDisabled(
private fun openAppPermissionSettings(
activity: Activity,
permissions: ArrayList<String>
): Boolean {
var isPermanentlyDisabled = false
for (permission in permissions) {
val isPermissionNotGranted = ContextCompat.checkSelfPermission(
activity,
permission
) != PackageManager.PERMISSION_GRANTED
val isPermissionPermanentlyDisabled =
ActivityCompat.shouldShowRequestPermissionRationale(activity, permission).not()
if (isPermissionNotGranted && isPermissionPermanentlyDisabled) {
isPermanentlyDisabled = true
break
}
}
return isPermanentlyDisabled
}

private fun openAppPermissionSettings(activity: Activity, toastTextWhenOpenAppSettingsIfPermissionsPermanentlyDenied: String) {
toastTextWhenOpenAppSettingsIfPermissionsPermanentlyDenied: String
) {
val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
intent.data = Uri.fromParts("package", activity.packageName, null)
activity.startActivity(intent)
Expand Down
38 changes: 4 additions & 34 deletions app/src/main/java/mumayank/com/airlocationproject/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -12,23 +12,7 @@ import java.util.*

class MainActivity : AppCompatActivity() {

// Declare your airLocation object on top
private val airLocation1 = AirLocation(this, object : AirLocation.Callback {
override fun onSuccess(locations: ArrayList<Location>) {
progressBar.visibility = View.GONE
val string =
"${locations[0].longitude}, ${locations[0].latitude}\n\n${textView1.text}"
textView1.text = string
}

override fun onFailure(locationFailedEnum: AirLocation.LocationFailedEnum) {
progressBar.visibility = View.GONE
Toast.makeText(this@MainActivity, locationFailedEnum.name, Toast.LENGTH_SHORT)
.show()
}
}, true)

private val airLocation2 = AirLocation(this, object : AirLocation.Callback {
private val airLocation = AirLocation(this, object : AirLocation.Callback {
override fun onSuccess(locations: ArrayList<Location>) {
progressBar.visibility = View.GONE
var string = "\n"
Expand All @@ -46,34 +30,21 @@ class MainActivity : AppCompatActivity() {
}
})

private var isAirLocation2Started = false

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.main_activity)

progressBar.visibility = View.GONE

button1.setOnClickListener {
progressBar.visibility = View.VISIBLE
airLocation1.start()
}

button2.setOnClickListener {
progressBar.visibility = View.VISIBLE
airLocation2.start()
isAirLocation2Started = true
}

button3.setOnClickListener {
airLocation2.stopLocationUpdates()
airLocation.start()
}

}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
airLocation1.onActivityResult(requestCode, resultCode, data)
airLocation2.onActivityResult(requestCode, resultCode, data)
airLocation.onActivityResult(requestCode, resultCode, data)
super.onActivityResult(requestCode, resultCode, data)
}

Expand All @@ -82,8 +53,7 @@ class MainActivity : AppCompatActivity() {
permissions: Array<out String>,
grantResults: IntArray
) {
airLocation1.onRequestPermissionsResult(requestCode, permissions, grantResults)
airLocation2.onRequestPermissionsResult(requestCode, permissions, grantResults)
airLocation.onRequestPermissionsResult(requestCode, permissions, grantResults)
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
}

Expand Down
Loading

0 comments on commit 2d4e1ca

Please sign in to comment.