com.unovo.frame.core.permissions.PermissionsAction.java Source code

Java tutorial

Introduction

Here is the source code for com.unovo.frame.core.permissions.PermissionsAction.java

Source

/*
 * Copyright (c) 2017 ?. All Rights Reserved.
 * Use of this source code is governed by a Shanghai Unovo Information Technology Co.,Ltd license
 * that can be found in the LICENSE file in the root of the web site.
 *
 *   http://www.unovo.com.cn
 *
 * An additional intellectual property rights grant can be found
 * in the file PATENTS.  All contributing project authors may
 * be found in the AUTHORS file in the root of the source tree.
 *
 */

package com.unovo.frame.core.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 com.unovo.frame.core.action.IAction;
import com.unovo.frame.utils.log.Logger;

/**
 * Created by Aeatho on 2017/2/6 16:22
 *
 * Prject: unovo-guest-app
 * Description:
 * email: aeatho@gmail.com
 */
public class PermissionsAction extends IAction implements PermissionsObserver {
    private PermissionsListener subject;
    private String permission;
    private int requestCode;

    public PermissionsAction(Activity context, IAction parent, PermissionsListener 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.i("???, permission = %s", permission);
        }
        // ???
        else if (PackageManager.PERMISSION_DENIED == ContextCompat.checkSelfPermission(getContext(), permission)) {
            interrupt = true;

            Logger.i("PERMISSION_DENIED permission = %s", permission);

            doInterrupt();
        }
        return interrupt;
    }

    @Override
    public void doInterrupt() {
        // ??????
        if (!handlePermissionNone()) {
            Logger.i("handlePermissionNone(false)");

            requestPermission();
        } else {
            Logger.i("handlePermissionNone(true)");
        }
    }

    /**
     * ????????
     *
     * @return true:??requestPermission()
     */
    protected boolean handlePermissionNone() {
        return false;
    }

    /**
     * ??
     */
    @TargetApi(Build.VERSION_CODES.M)
    protected void requestPermission() {
        if (subject != null) {
            subject.attach(this);
        }

        Logger.i("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.e(e);
        }
    }

    /**
     * ???
     *
     * @param alwaysDenied ????
     * @return true:
     */
    protected void onPermissionDenied(boolean alwaysDenied) {

    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        Logger.i("onRequestPermissionsResult , requestCode = " + requestCode);

        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.i("onPermissionDenied(false)");

                onPermissionDenied(false);
            } else {
                Logger.i("onPermissionDenied(true)");

                onPermissionDenied(true);
            }
        }
    }
}