From 2d4e1caa15f10e4d3c00d49afe9b386e521d12f2 Mon Sep 17 00:00:00 2001 From: mu Date: Mon, 8 Jun 2020 05:16:17 +0530 Subject: [PATCH] use airpermissions library for handling runtime permissions --- airlocationlibrary/build.gradle | 1 + .../com/airlocationlibrary/AirLocation.kt | 41 +++------ .../helpers/LocationPermissionHelper.kt | 83 ++++++------------- .../com/airlocationproject/MainActivity.kt | 38 +-------- app/src/main/res/layout/main_activity.xml | 81 ++++-------------- 5 files changed, 56 insertions(+), 188 deletions(-) diff --git a/airlocationlibrary/build.gradle b/airlocationlibrary/build.gradle index a7ab097..6eef01c 100644 --- a/airlocationlibrary/build.gradle +++ b/airlocationlibrary/build.gradle @@ -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 { diff --git a/airlocationlibrary/src/main/java/mumayank/com/airlocationlibrary/AirLocation.kt b/airlocationlibrary/src/main/java/mumayank/com/airlocationlibrary/AirLocation.kt index 6df5bc5..26aedfd 100644 --- a/airlocationlibrary/src/main/java/mumayank/com/airlocationlibrary/AirLocation.kt +++ b/airlocationlibrary/src/main/java/mumayank/com/airlocationlibrary/AirLocation.kt @@ -1,5 +1,6 @@ package mumayank.com.airlocationlibrary +import android.Manifest import android.annotation.SuppressLint import android.app.Activity import android.content.Intent @@ -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 @@ -29,7 +31,6 @@ class AirLocation( private lateinit var fusedLocationClient: FusedLocationProviderClient private var isStartCalled = false - private var isStopLocationUpdateRequested = false private val activityWeakReference = WeakReference(activity) @@ -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, @@ -104,7 +100,6 @@ class AirLocation( } isStartCalled = true - isStopLocationUpdateRequested = false makeGooglePlayApiAvailable() } @@ -121,7 +116,7 @@ class AirLocation( return } - locationPermissionHelper.getPermissions() + airPermissions.request() } private fun checkIfInFlightMode() { @@ -185,9 +180,7 @@ class AirLocation( return } - if (isStopLocationUpdateRequested.not()) { - requestLocationUpdates() - } + requestLocationUpdates() } @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) @@ -251,7 +244,7 @@ class AirLocation( return } - locationPermissionHelper.onRequestPermissionsResult(requestCode, permissions, grantResults) + airPermissions.onRequestPermissionsResult(requestCode) } fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { @@ -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) - } - } \ No newline at end of file diff --git a/airlocationlibrary/src/main/java/mumayank/com/airlocationlibrary/helpers/LocationPermissionHelper.kt b/airlocationlibrary/src/main/java/mumayank/com/airlocationlibrary/helpers/LocationPermissionHelper.kt index 974034d..54119ee 100644 --- a/airlocationlibrary/src/main/java/mumayank/com/airlocationlibrary/helpers/LocationPermissionHelper.kt +++ b/airlocationlibrary/src/main/java/mumayank/com/airlocationlibrary/helpers/LocationPermissionHelper.kt @@ -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 ) } @@ -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 @@ -78,52 +84,15 @@ class LocationPermissionHelper( private const val REQUEST_CODE = 1236 - private fun getPermissionList(): ArrayList { - val permissions = ArrayList() - permissions.add(Manifest.permission.ACCESS_FINE_LOCATION) - permissions.add(Manifest.permission.ACCESS_COARSE_LOCATION) - return permissions - } - - private fun isPermissionListGranted( - activity: Activity, - permissions: ArrayList - ): 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 - ): 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) diff --git a/app/src/main/java/mumayank/com/airlocationproject/MainActivity.kt b/app/src/main/java/mumayank/com/airlocationproject/MainActivity.kt index 4f49879..c7eafb6 100644 --- a/app/src/main/java/mumayank/com/airlocationproject/MainActivity.kt +++ b/app/src/main/java/mumayank/com/airlocationproject/MainActivity.kt @@ -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) { - 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) { progressBar.visibility = View.GONE var string = "\n" @@ -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) } @@ -82,8 +53,7 @@ class MainActivity : AppCompatActivity() { permissions: Array, grantResults: IntArray ) { - airLocation1.onRequestPermissionsResult(requestCode, permissions, grantResults) - airLocation2.onRequestPermissionsResult(requestCode, permissions, grantResults) + airLocation.onRequestPermissionsResult(requestCode, permissions, grantResults) super.onRequestPermissionsResult(requestCode, permissions, grantResults) } diff --git a/app/src/main/res/layout/main_activity.xml b/app/src/main/res/layout/main_activity.xml index d80450e..7129ebf 100644 --- a/app/src/main/res/layout/main_activity.xml +++ b/app/src/main/res/layout/main_activity.xml @@ -8,91 +8,38 @@ + android:layout_height="wrap_content" + android:gravity="center">