package org.aisen.wen.support.permissions;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.os.Build;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import org.aisen.wen.support.action.IAction;
import org.aisen.wen.support.utils.Logger;
/**
* 申请一组权限
*
* Created by wangdan on 16/2/26.
*/
public abstract class APermissionsAction extends IAction implements IPermissionsObserver {
public static final String TAG = "Permission";
private IPermissionsSubject subject;
private String permission;
private int requestCode;
public APermissionsAction(Activity context, IAction parent, IPermissionsSubject subject, String permission) {
super(context, parent);
this.subject = subject;
this.permission = permission;
requestCode = permission.hashCode();
}
@Override
protected boolean interrupt() {
boolean interrupt = super.interrupt();
if (requestCode == 0) {
}
// 低于SDK23
else if (Build.VERSION.SDK_INT < 23) {
}
// 授予了权限
else if (PackageManager.PERMISSION_GRANTED == ContextCompat.checkSelfPermission(getContext(), permission)) {
Logger.d(TAG, "已经授予了权限, permission = %s", permission);
}
// 没有或者拒绝了权限
else if (PackageManager.PERMISSION_DENIED == ContextCompat.checkSelfPermission(getContext(), permission)) {
interrupt = true;
Logger.d(TAG, "%s permission = %s", "PERMISSION_DENIED", permission);
doInterrupt();
}
return interrupt;
}
@Override
public void doInterrupt() {
// 对没有权限做出处理,默认申请权限
if (!handlePermissionNone()) {
Logger.d(TAG, "handlePermissionNone(false)");
requestPermission();
}
else {
Logger.d(TAG, "handlePermissionNone(true)");
}
}
/**
* 申请权限时,如果权限是已经被拒绝的,做出处理
*
* @return true:请求一次权限,调用requestPermission()
*/
protected boolean handlePermissionNone() {
return false;
}
/**
* 权限被拒绝了
*
* @param alwaysDenied 勾选了不再提醒
*
* @return true:
*/
protected void onPermissionDenied(boolean alwaysDenied) {
}
/**
* 申请权限
*/
@TargetApi(Build.VERSION_CODES.M)
protected void requestPermission() {
if (subject != null) {
subject.attach(this);
}
Logger.d(TAG, "requestPermission(%s)", permission);
// XT1562(Motorola) 这里会上报一个这样的错误,暂时搞不懂为什么
// java.lang.IllegalArgumentException:Wake lock not active: android.os.Binder@3e69cbf from uid 1000
try {
getContext().requestPermissions(new String[]{ permission }, requestCode);
} catch (IllegalArgumentException e) {
Logger.printExc(APermissionsAction.class, e);
}
}
/**
* 处理授权结果
*
* @param requestCode
* @param permissions
* @param grantResults
*/
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
Logger.d(TAG, "onRequestPermissionsResult , requestCode = " + requestCode);
if (grantResults != null && grantResults.length > 0) {
for (int i = 0; i < permissions.length; i++) {
Logger.d(TAG, "requestCode = %d, permission = %s, grantResult = %d", requestCode, permissions[i], grantResults[i]);
}
}
if (subject != null) {
subject.detach(this);
}
if (requestCode == this.requestCode) {
if (permissions != null && permissions.length > 0 && permission.equals(permissions[0])) {
if (grantResults != null && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
run();
return;
}
}
if (ActivityCompat.shouldShowRequestPermissionRationale(getContext(), permission)) {
Logger.d(TAG, "onPermissionDenied(false)");
onPermissionDenied(false);
} else {
Logger.d(TAG, "onPermissionDenied(true)");
onPermissionDenied(true);
}
}
}
}