package com.common.lib_base.aop.aspectj;

import android.content.res.Resources;
import android.util.Log;
import android.view.View;

import com.common.lib_base.aop.annotation.NoDoubleClick;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;

import java.lang.reflect.Method;

/**
 * Date: 2022/5/17 0017 10:17
 * Description:
 */
@Aspect
public class NoDoubleClickAspect {

//    private static final String TAG = "Aspect";
//
//    private static long mLastClickTime;
//
//    private static final int DEFAULT_CLICK_TIME = 1000;
//    private static final String POINTCUT_METHOD = "execution(* onClick(..))";
//    private static final String POINTCUT_VIEW_METHOD = "execution(* android.view.View.OnClickListener.onClick(..))";
//    private static final String POINTCUT_ANNOTATION = "execution(@com.common.lib_base.aop.annotation.NoDoubleClick * *(..))";
//
//    // void butterknife.internal.DebouncingOnClickListener.onClick(View)
//    private static final String POINTCUT_BUTTER_KNIFE = "execution(@butterknife.OnClick * *(..))";
//
//    @Pointcut(POINTCUT_METHOD)
//    public void methodPointcut() {
//
//    }
//
//    @Pointcut(POINTCUT_VIEW_METHOD)
//    public void methodViewPointcut() {
//
//    }
//
//    @Pointcut(POINTCUT_ANNOTATION)
//    public void annotationPointcut() {
//
//    }
//
//    @Pointcut(POINTCUT_BUTTER_KNIFE)
//    public void butterKnifePointcut() {
//
//    }
//
//    @Around("methodPointcut() || methodViewPointcut() || annotationPointcut() || butterKnifePointcut()")
//    public void aroundJoinPoint(final ProceedingJoinPoint joinPoint) throws Throwable {
//        try {
//            MethodSignature signature = (MethodSignature) joinPoint.getSignature();
//            Method method = signature.getMethod();
//            //检查方法是否有注解
//            boolean hasAnnotation = method != null && method.isAnnotationPresent(NoDoubleClick.class);
//            //计算点击间隔，没有注解默认500，有注解按注解参数来，注解参数为空默认500
//            int interval = 500;
//            if (hasAnnotation) {
//                // 加了该注解
//                NoDoubleClick annotation = method.getAnnotation(NoDoubleClick.class);
//                interval = annotation.value();
//            }else{
//                // 不加此处代码发现没加NoDoubleClick注解的点击了没反应
//                joinPoint.proceed();
//                return;
//            }
//            //获取被点击的view对象
//            Object[] args = joinPoint.getArgs();
//            View view = findViewInMethodArgs(args);
//            if (view != null) {
//                int id = view.getId();
//                //注解排除某个控件不防止双击
//                if (hasAnnotation) {
//                    NoDoubleClick annotation = method.getAnnotation(NoDoubleClick.class);
//                    //按id值排除不防止双击的按钮点击
//                    int[] except = annotation.except();
//                    for (int i : except) {
//                        if (i == id) {
//                            mLastClickTime = System.currentTimeMillis();
//                            joinPoint.proceed();
//                            return;
//                        }
//                    }
//                    //按id名排除不防止双击的按钮点击（非app模块）
//                    String[] idName = annotation.exceptIdName();
//                    Resources resources = view.getResources();
//                    for (String name : idName) {
//                        int resId = resources.getIdentifier(name, "id", view.getContext().getPackageName());
//                        if (resId == id) {
//                            mLastClickTime = System.currentTimeMillis();
//                            joinPoint.proceed();
//                            return;
//                        }
//                    }
//                }
//                if (canClick(interval)) {
//                    mLastClickTime = System.currentTimeMillis();
//                    joinPoint.proceed();
//                    return;
//                }
//            }
//
//            //检测间隔时间是否达到预设时间并且线程空闲
//            if (canClick(interval)) {
//                mLastClickTime = System.currentTimeMillis();
//                joinPoint.proceed();
//            }
//        } catch (Exception e) {
//            //出现异常不拦截点击事件
//            joinPoint.proceed();
//        }
//    }
//
//    public View findViewInMethodArgs(Object[] args) {
//        if (args == null || args.length == 0) {
//            return null;
//        }
//        for (int i = 0; i < args.length; i++) {
//            if (args[i] instanceof View) {
//                View view = (View) args[i];
//                if (view.getId() != View.NO_ID) {
//                    return view;
//                }
//            }
//        }
//        return null;
//    }
//
//    public boolean canClick(int interval) {
//        long l = System.currentTimeMillis() - mLastClickTime;
//        if (l > interval) {
//            mLastClickTime = System.currentTimeMillis();
//            Log.i(TAG,"NoDoubleClickAspect--超过时间可以点击");
//            return true;
//        }
//        Log.i(TAG,"NoDoubleClickAspect--时间内，不可以点击");
//        return false;
//    }

}

