package me.weyye.hipermission;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Settings;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import java.util.List;
import java.util.ListIterator;
/**
* Created by Administrator on 2017/5/10 0010.
*/
public class PermissionActivity extends AppCompatActivity {
public static int PERMISSION_TYPE_SINGLE = 1;
public static int PERMISSION_TYPE_MUTI = 2;
private int mPermissionType;
private String mTitle;
private String mMsg;
private static PermissionCallback mCallback;
private List<PermissonItem> mCheckPermissions;
private AlertDialog mDialog;
private static final int REQUEST_CODE_SINGLE = 1;
private static final int REQUEST_CODE_MUTI = 2;
public static final int REQUEST_CODE_MUTI_SINGLE = 3;
private static final int REQUEST_SETTING = 110;
private static final String TAG = "PermissionActivity";
private CharSequence mAppName;
private int mStyleId;
private int mFilterColor;
public static void setCallBack(PermissionCallback callBack) {
PermissionActivity.mCallback = callBack;
}
@Override
protected void onDestroy() {
super.onDestroy();
mCallback = null;
if (mDialog != null && mDialog.isShowing())
mDialog.dismiss();
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getDatas();
if (mPermissionType == PERMISSION_TYPE_SINGLE) {
//单个权限申请
if (mCheckPermissions == null || mCheckPermissions.size() == 0)
return;
requestPermission(new String[]{mCheckPermissions.get(0).Permission}, REQUEST_CODE_SINGLE);
} else {
mAppName = getApplicationInfo().loadLabel(getPackageManager());
//多个权限
showPermissionDialog();
}
}
private String getPermissionTitle() {
return TextUtils.isEmpty(mTitle) ? String.format(getString(R.string.permission_dialog_title), mAppName) : mTitle;
}
private void showPermissionDialog() {
String title = getPermissionTitle();
String msg = TextUtils.isEmpty(mMsg) ? String.format(getString(R.string.permission_dialog_msg), mAppName) : mMsg;
PermissionView contentView = new PermissionView(this);
contentView.setGridViewColum(mCheckPermissions.size() < 3 ? mCheckPermissions.size() : 3);
contentView.setTitle(title);
contentView.setMsg(msg);
//这里没有使用RecyclerView,可以少引入一个库
contentView.setGridViewAdapter(new PermissionAdapter(mCheckPermissions));
if (mStyleId == -1) {
//用户没有设置,使用默认绿色主题
mStyleId = R.style.PermissionGreenStyle;
mFilterColor = getResources().getColor(R.color.permissionColorGreen);
}
contentView.setStyleId(mStyleId);
contentView.setFilterColor(mFilterColor);
contentView.setBtnOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mDialog != null && mDialog.isShowing())
mDialog.dismiss();
String[] strs = getPermissionStrArray();
ActivityCompat.requestPermissions(PermissionActivity.this, strs, REQUEST_CODE_MUTI);
}
});
mDialog = new AlertDialog.Builder(this)
.setView(contentView)
.create();
mDialog.setCanceledOnTouchOutside(false);
mDialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
mDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
dialog.dismiss();
if (mCallback != null)
mCallback.onClose();
finish();
}
});
mDialog.show();
}
private void reRequestPermission(final String permission) {
String permissionName = getPermissionItem(permission).PermissionName;
String alertTitle = String.format(getString(R.string.permission_title), permissionName);
String msg = String.format(getString(R.string.permission_denied), permissionName, mAppName);
showAlertDialog(alertTitle, msg, getString(R.string.permission_cancel), getString(R.string.permission_ensure), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
requestPermission(new String[]{permission}, REQUEST_CODE_MUTI_SINGLE);
}
});
}
private void requestPermission(String[] permissions, int requestCode) {
ActivityCompat.requestPermissions(PermissionActivity.this, permissions, requestCode);
}
private void showAlertDialog(String title, String msg, String cancelTxt, String PosTxt, DialogInterface.OnClickListener onClickListener) {
AlertDialog alertDialog = new AlertDialog.Builder(this)
.setTitle(title)
.setMessage(msg)
.setCancelable(false)
.setNegativeButton(cancelTxt, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
onClose();
}
})
.setPositiveButton(PosTxt, onClickListener).create();
alertDialog.show();
}
private String[] getPermissionStrArray() {
String[] str = new String[mCheckPermissions.size()];
for (int i = 0; i < mCheckPermissions.size(); i++) {
str[i] = mCheckPermissions.get(i).Permission;
}
return str;
}
private void getDatas() {
Intent intent = getIntent();
mPermissionType = intent.getIntExtra(ConstantValue.DATA_PERMISSION_TYPE, PERMISSION_TYPE_SINGLE);
mTitle = intent.getStringExtra(ConstantValue.DATA_TITLE);
mMsg = intent.getStringExtra(ConstantValue.DATA_MSG);
mFilterColor = intent.getIntExtra(ConstantValue.DATA_FILTER_COLOR, -1);
mStyleId = intent.getIntExtra(ConstantValue.DATA_STYLE_ID, -1);
mCheckPermissions = (List<PermissonItem>) intent.getSerializableExtra(ConstantValue.DATA_PERMISSONS);
}
/**
* 重新申请权限数组的索引
*/
private int mRePermissionIndex;
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case REQUEST_CODE_SINGLE:
String permission = getPermissionItem(permissions[0]).Permission;
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
onGuarantee(permission, 0);
} else {
onDeny(permission, 0);
}
finish();
break;
case REQUEST_CODE_MUTI:
for (int i = 0; i < grantResults.length; i++) {
//权限允许后,删除需要检查的权限
if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
PermissonItem item = getPermissionItem(permissions[i]);
mCheckPermissions.remove(item);
onGuarantee(permissions[i], i);
} else {
//权限拒绝
onDeny(permissions[i], i);
}
}
if (mCheckPermissions.size() > 0) {
//用户拒绝了某个或多个权限,重新申请
reRequestPermission(mCheckPermissions.get(mRePermissionIndex).Permission);
} else {
onFinish();
}
break;
case REQUEST_CODE_MUTI_SINGLE:
if (grantResults[0] == PackageManager.PERMISSION_DENIED) {
//重新申请后再次拒绝
//弹框警告! haha
String name = getPermissionItem(permissions[0]).PermissionName;
String title = String.format(getString(R.string.permission_title), name);
String msg = String.format(getString(R.string.permission_denied_with_naac), mAppName, name, mAppName);
showAlertDialog(title, msg, getString(R.string.permission_reject), getString(R.string.permission_go_to_setting), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
try {
Uri packageURI = Uri.parse("package:" + getPackageName());
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, packageURI);
startActivityForResult(intent, REQUEST_SETTING);
} catch (Exception e) {
e.printStackTrace();
onClose();
}
}
});
onDeny(permissions[0], 0);
} else {
onGuarantee(permissions[0], 0);
if (mRePermissionIndex < mCheckPermissions.size() - 1) {
//继续申请下一个被拒绝的权限
reRequestPermission(mCheckPermissions.get(++mRePermissionIndex).Permission);
} else {
//全部允许了
onFinish();
}
}
break;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Log.e(TAG, "onActivityResult--requestCode:" + requestCode + ",resultCode:" + resultCode);
if (requestCode == REQUEST_SETTING) {
checkPermission();
if (mCheckPermissions.size() > 0) {
mRePermissionIndex = 0;
reRequestPermission(mCheckPermissions.get(mRePermissionIndex).Permission);
} else {
onFinish();
}
}
}
private void checkPermission() {
ListIterator<PermissonItem> iterator = mCheckPermissions.listIterator();
while (iterator.hasNext()) {
int checkPermission = ContextCompat.checkSelfPermission(getApplicationContext(), iterator.next().Permission);
if (checkPermission == PackageManager.PERMISSION_GRANTED) {
iterator.remove();
}
}
}
private void onFinish() {
if (mCallback != null)
mCallback.onFinish();
finish();
}
private void onClose() {
if (mCallback != null)
mCallback.onClose();
finish();
}
private void onDeny(String permisson, int position) {
if (mCallback != null)
mCallback.onDeny(permisson, position);
}
private void onGuarantee(String permisson, int position) {
if (mCallback != null)
mCallback.onGuarantee(permisson, position);
}
private PermissonItem getPermissionItem(String permission) {
for (PermissonItem permissonItem : mCheckPermissions) {
if (permissonItem.Permission.equals(permission))
return permissonItem;
}
return null;
}
}