private void checkPermission(String[] grantResultPermissions, int[] grantResults, final AsyncCallback<Void, Error> callback) {
boolean isAllGranted = true;
for (String permission : permissions) {
if (ActivityCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
isAllGranted = false;
break;
} else {
}
}
if (isAllGranted) {
if (callback != null) {
callback.sendSuccessMessage(null);
}
} else {
final List<String> remainingPermissions = new ArrayList<>();
List<String> remainingNeedTipPermissions = new ArrayList<>();
List<String> remainingForbidTipPermissions = new ArrayList<>();
for (int i = 0, lenI = permissions.length; i < lenI; i++) {
String permission = permissions[i];
if (ActivityCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
remainingPermissions.add(permission);
if (ActivityCompat.shouldShowRequestPermissionRationale(this, permission)) {
remainingNeedTipPermissions.add(permission);
} else if (grantResultPermissions != null && grantResults != null) {
for (int j = 0, lenJ = grantResultPermissions.length; j < lenJ; j++) {
if (permission.equalsIgnoreCase(grantResultPermissions[j])) {
if (grantResults[j] != PackageManager.PERMISSION_GRANTED) {
remainingForbidTipPermissions.add(permission);
}
break;
}
}
}
}
}
if (remainingNeedTipPermissions.size() > 0) {
ConfirmDialogFragment dialog = new ConfirmDialogFragment();
dialog.setTitle(getString(R.string.permission_title));
String permissionDesc = "";
for (String permission : remainingNeedTipPermissions) {
String currentPermission = "";
if (permission.equalsIgnoreCase(Manifest.permission.INTERNET)) {
currentPermission = getString(R.string.permission_internet);
} else if (permission.equalsIgnoreCase(Manifest.permission.READ_PHONE_STATE)) {
currentPermission = getString(R.string.permission_read_phone_state);
} else if (permission.equalsIgnoreCase(Manifest.permission.ACCESS_WIFI_STATE)) {
currentPermission = getString(R.string.permission_access_wifi_state);
} else if (permission.equalsIgnoreCase(Manifest.permission.ACCESS_NETWORK_STATE)) {
currentPermission = getString(R.string.permission_access_network_state);
} else if (permission.equalsIgnoreCase(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
currentPermission = getString(R.string.permission_write_external_storage);
}
if (TextUtils.isEmpty(permissionDesc)) {
permissionDesc = currentPermission;
} else {
permissionDesc = permissionDesc + "、" + currentPermission;
}
}
String content = String.format(getString(R.string.permission_content), permissionDesc);
dialog.setCancelable(false);
dialog.setContent(content);
dialog.setConfirmListener(null, new View.OnClickListener() {
@Override
public void onClick(View v) {
if (remainingPermissions.size() > 0) {
ActivityCompat.requestPermissions(WelcomeAvtivity.this, remainingPermissions.toArray(new String[remainingPermissions.size()]), PERMISSION_REQUEST_CODE);
}
if (callback != null) {
callback.sendFailureMessage(new Error(-1, "not all granted"));
}
}
});
dialog.show(getFragmentManager(), null);
} else if (remainingForbidTipPermissions.size() > 0) {
ConfirmDialogFragment dialog = new ConfirmDialogFragment();
dialog.setTitle(getString(R.string.permission_title));
String permissionDesc = "";
for (String permission : remainingForbidTipPermissions) {
String currentPermission = "";
if (permission.equalsIgnoreCase(Manifest.permission.INTERNET)) {
currentPermission = getString(R.string.permission_internet);
} else if (permission.equalsIgnoreCase(Manifest.permission.READ_PHONE_STATE)) {
currentPermission = getString(R.string.permission_read_phone_state);
} else if (permission.equalsIgnoreCase(Manifest.permission.ACCESS_WIFI_STATE)) {
currentPermission = getString(R.string.permission_access_wifi_state);
} else if (permission.equalsIgnoreCase(Manifest.permission.ACCESS_NETWORK_STATE)) {
currentPermission = getString(R.string.permission_access_network_state);
} else if (permission.equalsIgnoreCase(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
currentPermission = getString(R.string.permission_write_external_storage);
}
if (TextUtils.isEmpty(permissionDesc)) {
permissionDesc = currentPermission;
} else {
permissionDesc = permissionDesc + "、" + currentPermission;
}
}
String content = String.format(getString(R.string.permission_forbid_tip_content), permissionDesc);
dialog.setCancelable(false);
dialog.setContent(content);
dialog.setConfirmListener(null, new View.OnClickListener() {
@Override
public void onClick(View v) {
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(0);
if (callback != null) {
callback.sendFailureMessage(new Error(-1, "forbid tip"));
}
}
});
dialog.show(getFragmentManager(), null);
} else {
// 首次检查,发现有未开启权限
if (remainingPermissions.size() > 0) {
ActivityCompat.requestPermissions(XXXXAvtivity.this, remainingPermissions.toArray(new String[remainingPermissions.size()]), PERMISSION_REQUEST_CODE);
}
if (callback != null) {
callback.sendFailureMessage(new Error(-1, "not all granted"));
}
}
}
}
checkPermission(null, null, new AsyncCallback<Void, Error>() {
@Override
public void onSuccess(Void result) {
doNext();
}
@Override
public void onFailure(Error error) {
}
});
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case PERMISSION_REQUEST_CODE:
checkPermission(permissions, grantResults, new AsyncCallback<Void, Error>() {
@Override
public void onSuccess(Void result) {
startVPNInitAndLogin();
}
@Override
public void onFailure(Error error) {
}
});
break;
default:
break;
}
}