Skip to content

Adding permissions manager #34

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Aug 13, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
package="com.rootstrap.android">

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />

<application
android:name=".App"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,22 @@
package com.rootstrap.android.ui.activity.main

import android.Manifest
import android.os.Bundle
import androidx.lifecycle.ViewModelProviders
import com.rootstrap.android.R
import com.rootstrap.android.metrics.Analytics
import com.rootstrap.android.metrics.PageEvents
import com.rootstrap.android.metrics.VISIT_SIGN_IN
import com.rootstrap.android.network.models.User
import com.rootstrap.android.ui.base.BaseActivity
import com.rootstrap.android.ui.view.AuthView
import com.rootstrap.android.util.NetworkState
import com.rootstrap.android.util.ViewModelListener
import com.rootstrap.android.util.extensions.value
import com.rootstrap.android.util.permissions.PermissionActivity
import com.rootstrap.android.util.permissions.PermissionResponse
import kotlinx.android.synthetic.main.activity_sign_in.*

class SignInActivity : BaseActivity(), AuthView {
class SignInActivity : PermissionActivity(), AuthView {

private lateinit var viewModel: SignInActivityViewModel

Expand All @@ -30,6 +32,8 @@ class SignInActivity : BaseActivity(), AuthView {
sign_in_button.setOnClickListener { signIn() }

lifecycle.addObserver(viewModel)

sampleAskForPermission()
}

override fun showProfile() {
Expand Down Expand Up @@ -63,4 +67,20 @@ class SignInActivity : BaseActivity(), AuthView {
}
}
}

fun sampleAskForPermission() {
requestPermission(arrayOf(Manifest.permission.CAMERA), object : PermissionResponse {
override fun granted() {
// TODO..
}

override fun denied() {
// TODO..
}

override fun foreverDenied() {
// TODO..
}
})
}
}

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package com.rootstrap.android.util.permissions

import android.content.pm.PackageManager
import androidx.core.app.ActivityCompat
import com.rootstrap.android.ui.base.BaseActivity

open class PermissionActivity : BaseActivity() {

private var permissionListener: PermissionResponse? = null

fun requestPermission(permissions: Array<String>, listener: PermissionResponse) {
permissionListener = listener
val notGrantedPermissions = this.checkNotGrantedPermissions(permissions)

when {
notGrantedPermissions.isEmpty() -> permissionListener?.granted()
else -> ActivityCompat.requestPermissions(
this,
notGrantedPermissions.toTypedArray(),
REQUEST_PERMISSION_REQUEST_CODE
)
}
}

override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
permissionListener?.let { listener ->
if (requestCode != REQUEST_PERMISSION_REQUEST_CODE) {
return
}

val deniedPermissions = mutableListOf<String>()

for (i in grantResults.indices) {
if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
deniedPermissions.add(permissions[i])
}
}

when {
deniedPermissions.isEmpty() -> listener.granted()
else -> {
for (deniedPermission in deniedPermissions) {
if (!ActivityCompat.shouldShowRequestPermissionRationale(this, deniedPermission)) {
listener.foreverDenied()
return
}
}
listener.denied()
}
}
}

super.onRequestPermissionsResult(requestCode, permissions, grantResults)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package com.rootstrap.android.util.permissions

import android.content.pm.PackageManager
import com.rootstrap.android.ui.base.BaseFragment

open class PermissionFragment : BaseFragment() {

private var permissionListener: PermissionResponse? = null

private fun requestPermission(permissions: Array<String>, listener: PermissionResponse) {
permissionListener = listener
activity?.let { activityContext ->
val notGrantedPermissions = activityContext.checkNotGrantedPermissions(permissions)

when {
notGrantedPermissions.isEmpty() -> permissionListener?.granted()
else -> requestPermissions(
notGrantedPermissions.toTypedArray(),
REQUEST_PERMISSION_REQUEST_CODE
)
}
}
}

override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
permissionListener?.let { listener ->
if (requestCode != REQUEST_PERMISSION_REQUEST_CODE) {
return
}

val deniedPermissions = mutableListOf<String>()

for (i in grantResults.indices) {
if (grantResults[i] != PackageManager.PERMISSION_GRANTED) {
deniedPermissions.add(permissions[i])
}
}

when {
deniedPermissions.isEmpty() -> listener.granted()
else -> {
for (deniedPermission in deniedPermissions) {
if (!shouldShowRequestPermissionRationale(deniedPermission)) {
listener.foreverDenied()
return
}
}
listener.denied()
}
}
}

super.onRequestPermissionsResult(requestCode, permissions, grantResults)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.rootstrap.android.util.permissions

import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.net.Uri
import android.os.Build
import android.provider.Settings
import androidx.core.content.ContextCompat.checkSelfPermission

interface PermissionResponse {
fun granted()
fun denied()
fun foreverDenied()
}

val REQUEST_PERMISSION_REQUEST_CODE = 999

fun Context.checkPermission(permission: String): Boolean =
Build.VERSION.SDK_INT < Build.VERSION_CODES.M || checkSelfPermission(
this,
permission
) == PackageManager.PERMISSION_GRANTED

fun Context.checkNotGrantedPermissions(permissions: Array<String>): List<String> =
permissions.filter { !checkPermission(it) }

/**
* Use this extension to open the app details to grant permission manually
* in case that the user denied the permission all the time
* **/
fun Context.openAppSettings() =
startActivity(
Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).also {
it.data = Uri.parse("package:" + this.packageName)
}
)