Last active
September 12, 2019 06:20
-
-
Save ralphgabrielle/f560d8bcbdb53e75d5e0d03b483e551b to your computer and use it in GitHub Desktop.
Android Marshmallow (26) Permission Handler
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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