package me.wcy.music.utils.permission; import android.annotation.TargetApi; import android.app.Activity; import android.content.Context; import android.content.pm.PackageManager; import android.os.Build; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.content.ContextCompat; import android.util.SparseArray; import java.util.ArrayList; import java.util.List; public class PermissionReq { private static int sRequestCode = 0; private static SparseArray<PermissionResult> sResultArray = new SparseArray<>(); private Object mObject; private String[] mPermissions; private PermissionResult mResult; private PermissionReq(Object object) { mObject = object; } public static PermissionReq with(@NonNull Activity activity) { return new PermissionReq(activity); } public static PermissionReq with(@NonNull Fragment fragment) { return new PermissionReq(fragment); } public PermissionReq permissions(@NonNull String... permissions) { mPermissions = permissions; return this; } public PermissionReq result(@Nullable PermissionResult result) { mResult = result; return this; } public void request() { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { if (mResult != null) { mResult.onGranted(); } return; } Activity activity = getActivity(mObject); if (activity == null) { throw new IllegalArgumentException(mObject.getClass().getName() + " is not supported"); } List<String> deniedPermissionList = getDeniedPermissions(activity, mPermissions); if (deniedPermissionList.isEmpty()) { if (mResult != null) { mResult.onGranted(); } return; } int requestCode = genRequestCode(); String[] deniedPermissions = deniedPermissionList.toArray(new String[deniedPermissionList.size()]); requestPermissions(mObject, deniedPermissions, requestCode); sResultArray.put(requestCode, mResult); } public static void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { PermissionResult result = sResultArray.get(requestCode); if (result == null) { return; } sResultArray.remove(requestCode); for (int grantResult : grantResults) { if (grantResult != PackageManager.PERMISSION_GRANTED) { result.onDenied(); return; } } result.onGranted(); } @TargetApi(Build.VERSION_CODES.M) private static void requestPermissions(Object object, String[] permissions, int requestCode) { if (object instanceof Activity) { ((Activity) object).requestPermissions(permissions, requestCode); } else if (object instanceof Fragment) { ((Fragment) object).requestPermissions(permissions, requestCode); } } private static List<String> getDeniedPermissions(Context context, String[] permissions) { List<String> deniedPermissionList = new ArrayList<>(); for (String permission : permissions) { if (ContextCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) { deniedPermissionList.add(permission); } } return deniedPermissionList; } private static Activity getActivity(Object object) { if (object != null) { if (object instanceof Activity) { return (Activity) object; } else if (object instanceof Fragment) { return ((Fragment) object).getActivity(); } } return null; } private static int genRequestCode() { return ++sRequestCode; } }