package com.yuyh.library.permission;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.provider.Settings;
import android.util.Log;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
/**
* Created by hupei on 2016/4/26.
*/
class AcpManager {
private static final String TAG = "AcpManager";
private static final int REQUEST_CODE_PERMISSION = 0x38;
private static final int REQUEST_CODE_SETTING = 0x39;
private Context mContext;
private Activity mActivity;
private AcpService mService;
private AcpOptions mOptions;
private AcpListener mCallback;
private final List<String> mDeniedPermissions = new LinkedList<>();
private final Set<String> mManifestPermissions = new HashSet<>(1);
AcpManager(Context context) {
mContext = context;
mService = new AcpService();
getManifestPermissions();
}
private synchronized void getManifestPermissions() {
PackageInfo packageInfo = null;
try {
packageInfo = mContext.getPackageManager().getPackageInfo(
mContext.getPackageName(), PackageManager.GET_PERMISSIONS);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
if (packageInfo != null) {
String[] permissions = packageInfo.requestedPermissions;
if (permissions != null) {
for (String perm : permissions) {
mManifestPermissions.add(perm);
}
}
}
}
synchronized void request(AcpOptions options, AcpListener acpListener) {
mCallback = acpListener;
mOptions = options;
checkSelfPermission();
}
private synchronized void checkSelfPermission() {
mDeniedPermissions.clear();
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
Log.i(TAG, "Build.VERSION.SDK_INT < Build.VERSION_CODES.M");
mCallback.onGranted();
onDestroy();
return;
}
String[] permissions = mOptions.getPermissions();
for (String permission : permissions) {
//检查申请的权限是否在 AndroidManifest.xml 中
if (mManifestPermissions.contains(permission)) {
int checkSelfPermission = mService.checkSelfPermission(mContext, permission);
Log.i(TAG, "checkSelfPermission = " + checkSelfPermission);
//如果是拒绝状态则装入拒绝集合中
if (checkSelfPermission == PackageManager.PERMISSION_DENIED) {
mDeniedPermissions.add(permission);
}
}
}
//如果没有一个拒绝是响应同意回调
if (mDeniedPermissions.isEmpty()) {
Log.i(TAG, "mDeniedPermissions.isEmpty()");
mCallback.onGranted();
onDestroy();
return;
}
startAcpActivity();
}
private synchronized void startAcpActivity() {
Intent intent = new Intent(mContext, AcpActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(intent);
}
synchronized void requestPermissions(Activity activity) {
mActivity = activity;
boolean shouldShowRational = false;
for (String permission : mDeniedPermissions) {
shouldShowRational = shouldShowRational || mService.shouldShowRequestPermissionRationale(mActivity, permission);
}
Log.i(TAG, "shouldShowRational = " + shouldShowRational);
String[] permissions = mDeniedPermissions.toArray(new String[mDeniedPermissions.size()]);
if (shouldShowRational) showRationalDialog(permissions);
else requestPermissions(permissions);
}
private synchronized void showRationalDialog(final String[] permissions) {
new AlertDialog.Builder(mActivity)
.setMessage(mOptions.getRationalMessage())
.setPositiveButton(mOptions.getRationalBtnText(), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
requestPermissions(permissions);
}
}).show();
}
private synchronized void requestPermissions(String[] permissions) {
mService.requestPermissions(mActivity, permissions, REQUEST_CODE_PERMISSION);
}
synchronized void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
case REQUEST_CODE_PERMISSION:
LinkedList<String> grantedPermissions = new LinkedList<>();
LinkedList<String> deniedPermissions = new LinkedList<>();
for (int i = 0; i < permissions.length; i++) {
String permission = permissions[i];
if (grantResults[i] == PackageManager.PERMISSION_GRANTED)
grantedPermissions.add(permission);
else deniedPermissions.add(permission);
}
if (!grantedPermissions.isEmpty() && deniedPermissions.isEmpty()) {
mCallback.onGranted();
onDestroy();
} else if (!deniedPermissions.isEmpty()) showDeniedDialog(deniedPermissions);
break;
}
}
private synchronized void showDeniedDialog(final List<String> permissions) {
new AlertDialog.Builder(mActivity)
.setMessage(mOptions.getDeniedMessage())
.setCancelable(false)
.setNegativeButton(mOptions.getDeniedCloseBtn(), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
mCallback.onDenied(permissions);
onDestroy();
}
})
.setPositiveButton(mOptions.getDeniedSettingBtn(), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
startSetting();
}
}).show();
}
/**
* 摧毁本库的 AcpActivity
*/
private void onDestroy() {
if (mActivity != null) mActivity.finish();
}
/**
* 跳转到设置界面
*/
private void startSetting() {
if (MiuiOs.isMIUI()) {
Intent intent = MiuiOs.getSettingIntent(mActivity);
if (MiuiOs.isIntentAvailable(mActivity, intent)) {
mActivity.startActivityForResult(intent, REQUEST_CODE_SETTING);
}
} else {
try {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
.setData(Uri.parse("package:" + mActivity.getPackageName()));
mActivity.startActivityForResult(intent, REQUEST_CODE_SETTING);
} catch (ActivityNotFoundException e) {
e.printStackTrace();
try {
Intent intent = new Intent(Settings.ACTION_MANAGE_APPLICATIONS_SETTINGS);
mActivity.startActivityForResult(intent, REQUEST_CODE_SETTING);
} catch (Exception e1) {
e1.printStackTrace();
}
}
}
}
synchronized void onActivityResult(int requestCode, int resultCode, Intent data) {
if (mCallback == null || mOptions == null
|| requestCode != REQUEST_CODE_SETTING) {
onDestroy();
return;
}
checkSelfPermission();
}
}