Skip to content

Instantly share code, notes, and snippets.

@ralphgabrielle
Last active September 12, 2019 06:20
Show Gist options
  • Save ralphgabrielle/f560d8bcbdb53e75d5e0d03b483e551b to your computer and use it in GitHub Desktop.
Save ralphgabrielle/f560d8bcbdb53e75d5e0d03b483e551b to your computer and use it in GitHub Desktop.
Android Marshmallow (26) Permission Handler
import android.app.Activity;
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 android.support.annotation.NonNull;
import android.support.annotation.RequiresApi;
import android.support.v4.content.ContextCompat;
import java.util.ArrayList;
/*
* Created by Ralph Gabrielle Orden on 3/16/2018.
*/
public class PermissionAccessManager {
private Context context;
private AccessPermission accessPermission;
private int requestCode;
private String[] permissions;
public PermissionAccessManager(Context context, int requestCode, AccessPermission accessPermission) {
this.context = context;
this.requestCode = requestCode;
this.accessPermission = accessPermission;
}
public void checkPermission(String... permissions) {
this.permissions = permissions;
if (permissions != null) {
if (permissions.length != 0) {
String[] noAccessPermission = returnNoAccessPermission(permissions);
if (noAccessPermission == null) {
accessPermission.onPermissionGranted(requestCode);
} else {
accessPermission.onAskPermission(noAccessPermission, requestCode);
}
}
}
}
private String[] returnNoAccessPermission(String[] permissions) {
ArrayList<String> noAccessPermissionList = new ArrayList<>();
for (String permission : permissions) {
int isGranted = ContextCompat.checkSelfPermission(context, permission);
if (isGranted != 0) {
noAccessPermissionList.add(permission);
}
}
if (!noAccessPermissionList.isEmpty()) {
int size = noAccessPermissionList.size();
return noAccessPermissionList.toArray(new String[size]);
}
return null;
}
public void openSettings() {
Activity activity = (Activity) context;
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", context.getPackageName(), null);
intent.setData(uri);
activity.startActivityForResult(intent, Constant.REQUEST_CHECK_SETTINGS);
}
@RequiresApi(api = Build.VERSION_CODES.M)
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == this.requestCode) {
boolean isRationale = false;
if (grantResults.length > 0) {
if (isAllIsGranted(grantResults)) {
/*
* re call this method.
*
*/
accessPermission.onPermissionGranted(requestCode);
} else {
/*
* Not all permissions are granted.
*/
for (String permission : permissions) {
boolean shouldShowRequestPermissionRationale = ((Activity) context).shouldShowRequestPermissionRationale(permission);
boolean isGranted = ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED;
// false true = deny, not never ask again
// false false = deny, never ask again
if (!shouldShowRequestPermissionRationale && !isGranted) {
/*
* For Never Ask Again tick option
* Force user to turn on permission
*/
accessPermission.onShowRequestRationale();
isRationale = true;
break;
}
}
if (!isRationale) {
accessPermission.onPermissionNotGrantedOnSome();
}
}
}
}
}
private boolean isAllIsGranted(int[] grantResults) {
int granted = PackageManager.PERMISSION_GRANTED;
for (int category : grantResults) {
if (category != granted) {
return false;
}
}
return true;
}
public interface AccessPermission {
void onAskPermission(@NonNull String[] permissions, int requestCode);
void onPermissionGranted(int requestCode);
void onShowRequestRationale();
void onPermissionNotGrantedOnSome();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment