针对单个任务设置监听器, https://github.com/AriaLyy/Aria/issues/37
This commit is contained in:
@ -18,6 +18,7 @@ package com.arialyy.compiler;
|
||||
import com.arialyy.annotations.Download;
|
||||
import com.arialyy.annotations.Upload;
|
||||
import com.squareup.javapoet.ClassName;
|
||||
import com.squareup.javapoet.CodeBlock;
|
||||
import com.squareup.javapoet.FieldSpec;
|
||||
import com.squareup.javapoet.JavaFile;
|
||||
import com.squareup.javapoet.MethodSpec;
|
||||
@ -26,7 +27,9 @@ import com.squareup.javapoet.TypeSpec;
|
||||
import com.squareup.javapoet.ParameterizedTypeName;
|
||||
import java.io.IOException;
|
||||
import java.lang.annotation.Annotation;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
@ -63,40 +66,32 @@ class ElementHandle {
|
||||
* PackageElement 一般代表Package
|
||||
*/
|
||||
void handleDownload(RoundEnvironment roundEnv) {
|
||||
saveMethod(true, roundEnv, Download.onNoSupportBreakPoint.class);
|
||||
saveMethod(true, roundEnv, Download.onPre.class);
|
||||
saveMethod(true, roundEnv, Download.onTaskCancel.class);
|
||||
saveMethod(true, roundEnv, Download.onTaskComplete.class);
|
||||
saveMethod(true, roundEnv, Download.onTaskFail.class);
|
||||
saveMethod(true, roundEnv, Download.onTaskPre.class);
|
||||
saveMethod(true, roundEnv, Download.onTaskResume.class);
|
||||
saveMethod(true, roundEnv, Download.onTaskRunning.class);
|
||||
saveMethod(true, roundEnv, Download.onTaskStart.class);
|
||||
saveMethod(true, roundEnv, Download.onTaskStop.class);
|
||||
saveMethod(true, roundEnv, Download.onNoSupportBreakPoint.class,
|
||||
ProxyConstance.DOWNLOAD_TASK_NO_SUPPORT_BREAKPOINT);
|
||||
saveMethod(true, roundEnv, Download.onPre.class, ProxyConstance.DOWNLOAD_PRE);
|
||||
saveMethod(true, roundEnv, Download.onTaskCancel.class, ProxyConstance.DOWNLOAD_TASK_CANCEL);
|
||||
saveMethod(true, roundEnv, Download.onTaskComplete.class,
|
||||
ProxyConstance.DOWNLOAD_TASK_COMPLETE);
|
||||
saveMethod(true, roundEnv, Download.onTaskFail.class, ProxyConstance.DOWNLOAD_TASK_FAIL);
|
||||
saveMethod(true, roundEnv, Download.onTaskPre.class, ProxyConstance.DOWNLOAD_TASK_PRE);
|
||||
saveMethod(true, roundEnv, Download.onTaskResume.class, ProxyConstance.DOWNLOAD_TASK_RESUME);
|
||||
saveMethod(true, roundEnv, Download.onTaskRunning.class, ProxyConstance.DOWNLOAD_TASK_RUNNING);
|
||||
saveMethod(true, roundEnv, Download.onTaskStart.class, ProxyConstance.DOWNLOAD_TASK_START);
|
||||
saveMethod(true, roundEnv, Download.onTaskStop.class, ProxyConstance.DOWNLOAD_TASK_STOP);
|
||||
}
|
||||
|
||||
void handleUpload(RoundEnvironment roundEnv) {
|
||||
saveMethod(false, roundEnv, Upload.onNoSupportBreakPoint.class);
|
||||
saveMethod(false, roundEnv, Upload.onPre.class);
|
||||
saveMethod(false, roundEnv, Upload.onTaskCancel.class);
|
||||
saveMethod(false, roundEnv, Upload.onTaskComplete.class);
|
||||
saveMethod(false, roundEnv, Upload.onTaskFail.class);
|
||||
saveMethod(false, roundEnv, Upload.onTaskPre.class);
|
||||
saveMethod(false, roundEnv, Upload.onNoSupportBreakPoint.class,
|
||||
ProxyConstance.UPLOAD_TASK_NO_SUPPORT_BREAKPOINT);
|
||||
saveMethod(false, roundEnv, Upload.onPre.class, ProxyConstance.UPLOAD_PRE);
|
||||
saveMethod(false, roundEnv, Upload.onTaskCancel.class, ProxyConstance.UPLOAD_TASK_CANCEL);
|
||||
saveMethod(false, roundEnv, Upload.onTaskComplete.class, ProxyConstance.UPLOAD_TASK_COMPLETE);
|
||||
saveMethod(false, roundEnv, Upload.onTaskFail.class, ProxyConstance.UPLOAD_TASK_FAIL);
|
||||
saveMethod(false, roundEnv, Upload.onTaskPre.class, ProxyConstance.UPLOAD_TASK_PRE);
|
||||
//saveMethod(false, roundEnv, Upload.onTaskResume.class);
|
||||
saveMethod(false, roundEnv, Upload.onTaskRunning.class);
|
||||
saveMethod(false, roundEnv, Upload.onTaskStart.class);
|
||||
saveMethod(false, roundEnv, Upload.onTaskStop.class);
|
||||
}
|
||||
|
||||
void printMethods() {
|
||||
//Set<String> keys = mMethods.keySet();
|
||||
//for (String key : keys) {
|
||||
// ProxyEntity entity = mMethods.get(key);
|
||||
// for (String method : entity.methods) {
|
||||
// PrintLog.getInstance().info(method);
|
||||
// }
|
||||
//}
|
||||
PrintLog.getInstance().info("size ==> " + mMethods.size());
|
||||
saveMethod(false, roundEnv, Upload.onTaskRunning.class, ProxyConstance.UPLOAD_TASK_RUNNING);
|
||||
saveMethod(false, roundEnv, Upload.onTaskStart.class, ProxyConstance.UPLOAD_TASK_START);
|
||||
saveMethod(false, roundEnv, Upload.onTaskStop.class, ProxyConstance.UPLOAD_TASK_STOP);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -157,16 +152,29 @@ class ElementHandle {
|
||||
isDownload ? "DownloadTask" : "UploadTask");
|
||||
ParameterSpec parameterSpec =
|
||||
ParameterSpec.builder(task, "task").addModifiers(Modifier.FINAL).build();
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("Set<String> keys = keyMapping.get(\"")
|
||||
.append(annotation.getSimpleName())
|
||||
.append("\");\n");
|
||||
sb.append("if (keys != null) {\n\tif (keys.contains(task.getKey())) {\n")
|
||||
.append("\t\tobj.")
|
||||
.append(methodName)
|
||||
.append("(")
|
||||
.append(isDownload ? "(DownloadTask)" : "(UploadTask)")
|
||||
.append("task);\n")
|
||||
.append("\t}\n} else {\n")
|
||||
.append("\tobj.")
|
||||
.append(methodName)
|
||||
.append("(")
|
||||
.append(isDownload ? "(DownloadTask)" : "(UploadTask)")
|
||||
.append("task);\n}\n");
|
||||
|
||||
return MethodSpec.methodBuilder(annotation.getSimpleName())
|
||||
.addModifiers(Modifier.PUBLIC)
|
||||
.returns(void.class)
|
||||
.addParameter(parameterSpec)
|
||||
.addAnnotation(Override.class)
|
||||
.addCode("obj."
|
||||
+ methodName
|
||||
+ "("
|
||||
+ (isDownload ? "(DownloadTask)" : "(UploadTask)")
|
||||
+ "task);\n")
|
||||
.addCode(sb.toString())
|
||||
.build();
|
||||
}
|
||||
|
||||
@ -184,6 +192,13 @@ class ElementHandle {
|
||||
FieldSpec observerField = FieldSpec.builder(obj, "obj").addModifiers(Modifier.PRIVATE).build();
|
||||
builder.addField(observerField);
|
||||
|
||||
//添加url映射表
|
||||
FieldSpec mappingField = FieldSpec.builder(
|
||||
ParameterizedTypeName.get(ClassName.get(Map.class), ClassName.get(String.class),
|
||||
ParameterizedTypeName.get(ClassName.get(Set.class), ClassName.get(String.class))),
|
||||
"keyMapping").addModifiers(Modifier.PRIVATE).initializer("new $T()", HashMap.class).build();
|
||||
builder.addField(mappingField);
|
||||
|
||||
//添加注解方法
|
||||
for (Class<? extends Annotation> annotation : entity.methods.keySet()) {
|
||||
MethodSpec method =
|
||||
@ -191,6 +206,26 @@ class ElementHandle {
|
||||
builder.addMethod(method);
|
||||
}
|
||||
|
||||
//增加构造函数
|
||||
CodeBlock.Builder cb = CodeBlock.builder();
|
||||
cb.add("Set<String> set = null;\n");
|
||||
for (String methodName : entity.keyMappings.keySet()) {
|
||||
Set<String> keys = entity.keyMappings.get(methodName);
|
||||
if (keys == null || keys.size() == 0) continue;
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.append("set = new $T();\n");
|
||||
for (String key : keys) {
|
||||
if (key.isEmpty()) continue;
|
||||
sb.append("set.add(\"").append(key).append("\");\n");
|
||||
}
|
||||
|
||||
sb.append("keyMapping.put(\"").append(methodName).append("\", ").append("set);\n");
|
||||
cb.add(sb.toString(), ClassName.get(HashSet.class));
|
||||
}
|
||||
MethodSpec structure =
|
||||
MethodSpec.constructorBuilder().addModifiers(Modifier.PUBLIC).addCode(cb.build()).build();
|
||||
builder.addMethod(structure);
|
||||
|
||||
//添加设置代理的类
|
||||
ParameterSpec parameterSpec =
|
||||
ParameterSpec.builder(Object.class, "obj").addModifiers(Modifier.FINAL).build();
|
||||
@ -222,7 +257,7 @@ class ElementHandle {
|
||||
* 查找并保存扫描到的方法
|
||||
*/
|
||||
private void saveMethod(boolean isDownload, RoundEnvironment roundEnv,
|
||||
Class<? extends Annotation> annotationClazz) {
|
||||
Class<? extends Annotation> annotationClazz, int annotationType) {
|
||||
for (Element element : roundEnv.getElementsAnnotatedWith(annotationClazz)) {
|
||||
ElementKind kind = element.getKind();
|
||||
if (kind == ElementKind.METHOD) {
|
||||
@ -236,16 +271,92 @@ class ElementHandle {
|
||||
if (proxyEntity == null) {
|
||||
proxyEntity = new ProxyEntity();
|
||||
proxyEntity.isDownlaod = isDownload;
|
||||
//proxyEntity.packageName = classElement.getQualifiedName().toString();
|
||||
proxyEntity.packageName = packageElement.getQualifiedName().toString();
|
||||
proxyEntity.className = classElement.getSimpleName().toString();
|
||||
mMethods.put(className, proxyEntity);
|
||||
}
|
||||
proxyEntity.methods.put(annotationClazz, methodName);
|
||||
proxyEntity.keyMappings.put(methodName, getValues(method, isDownload, annotationType));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取注解的内容
|
||||
*/
|
||||
private Set<String> getValues(ExecutableElement method, boolean isDownload, int annotationType) {
|
||||
String[] keys = null;
|
||||
if (isDownload) {
|
||||
switch (annotationType) {
|
||||
case ProxyConstance.DOWNLOAD_PRE:
|
||||
keys = method.getAnnotation(Download.onPre.class).value();
|
||||
break;
|
||||
case ProxyConstance.DOWNLOAD_TASK_PRE:
|
||||
keys = method.getAnnotation(Download.onTaskPre.class).value();
|
||||
break;
|
||||
case ProxyConstance.DOWNLOAD_TASK_RESUME:
|
||||
keys = method.getAnnotation(Download.onTaskResume.class).value();
|
||||
break;
|
||||
case ProxyConstance.DOWNLOAD_TASK_START:
|
||||
keys = method.getAnnotation(Download.onTaskStart.class).value();
|
||||
break;
|
||||
case ProxyConstance.DOWNLOAD_TASK_RUNNING:
|
||||
keys = method.getAnnotation(Download.onTaskRunning.class).value();
|
||||
break;
|
||||
case ProxyConstance.DOWNLOAD_TASK_STOP:
|
||||
keys = method.getAnnotation(Download.onTaskStop.class).value();
|
||||
break;
|
||||
case ProxyConstance.DOWNLOAD_TASK_COMPLETE:
|
||||
keys = method.getAnnotation(Download.onTaskComplete.class).value();
|
||||
break;
|
||||
case ProxyConstance.DOWNLOAD_TASK_CANCEL:
|
||||
keys = method.getAnnotation(Download.onTaskCancel.class).value();
|
||||
break;
|
||||
case ProxyConstance.DOWNLOAD_TASK_FAIL:
|
||||
keys = method.getAnnotation(Download.onTaskFail.class).value();
|
||||
break;
|
||||
case ProxyConstance.DOWNLOAD_TASK_NO_SUPPORT_BREAKPOINT:
|
||||
keys = method.getAnnotation(Download.onNoSupportBreakPoint.class).value();
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
switch (annotationType) {
|
||||
case ProxyConstance.UPLOAD_PRE:
|
||||
keys = method.getAnnotation(Upload.onPre.class).value();
|
||||
break;
|
||||
case ProxyConstance.UPLOAD_TASK_PRE:
|
||||
keys = method.getAnnotation(Upload.onTaskPre.class).value();
|
||||
break;
|
||||
case ProxyConstance.UPLOAD_TASK_RESUME:
|
||||
//keys = method.getAnnotation(Upload.onTaskResume.class).value();
|
||||
break;
|
||||
case ProxyConstance.UPLOAD_TASK_START:
|
||||
keys = method.getAnnotation(Upload.onTaskStart.class).value();
|
||||
break;
|
||||
case ProxyConstance.UPLOAD_TASK_RUNNING:
|
||||
keys = method.getAnnotation(Upload.onTaskRunning.class).value();
|
||||
break;
|
||||
case ProxyConstance.UPLOAD_TASK_STOP:
|
||||
keys = method.getAnnotation(Upload.onTaskStop.class).value();
|
||||
break;
|
||||
case ProxyConstance.UPLOAD_TASK_COMPLETE:
|
||||
keys = method.getAnnotation(Upload.onTaskComplete.class).value();
|
||||
break;
|
||||
case ProxyConstance.UPLOAD_TASK_CANCEL:
|
||||
keys = method.getAnnotation(Upload.onTaskCancel.class).value();
|
||||
break;
|
||||
case ProxyConstance.UPLOAD_TASK_FAIL:
|
||||
keys = method.getAnnotation(Upload.onTaskFail.class).value();
|
||||
break;
|
||||
case ProxyConstance.UPLOAD_TASK_NO_SUPPORT_BREAKPOINT:
|
||||
keys = method.getAnnotation(Upload.onNoSupportBreakPoint.class).value();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return keys == null ? null : convertSet(keys);
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查和下载相关的方法,如果被注解的方法为private或参数不合法,则抛异常
|
||||
*/
|
||||
@ -272,6 +383,21 @@ class ElementHandle {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 字符串数组转set
|
||||
*
|
||||
* @param keys 注解中查到的key
|
||||
*/
|
||||
private Set<String> convertSet(final String[] keys) {
|
||||
if (keys == null || keys.length == 0) {
|
||||
return null;
|
||||
}
|
||||
if (keys[0].isEmpty()) return null;
|
||||
Set<String> set = new HashSet<>();
|
||||
Collections.addAll(set, keys);
|
||||
return set;
|
||||
}
|
||||
|
||||
private String getCheckParams(boolean isDownload) {
|
||||
return isDownload ? "com.arialyy.aria.core.download.DownloadTask"
|
||||
: "com.arialyy.aria.core.upload.UploadTask";
|
||||
|
@ -35,4 +35,25 @@ public interface ProxyConstance {
|
||||
*/
|
||||
String UPLOAD_PROXY_CLASS_SUFFIX = "$$UploadListenerProxy";
|
||||
|
||||
int DOWNLOAD_PRE = 0X11;
|
||||
int DOWNLOAD_TASK_PRE = 0X12;
|
||||
int DOWNLOAD_TASK_RESUME = 0X13;
|
||||
int DOWNLOAD_TASK_START = 0X14;
|
||||
int DOWNLOAD_TASK_STOP = 0X15;
|
||||
int DOWNLOAD_TASK_CANCEL = 0X16;
|
||||
int DOWNLOAD_TASK_FAIL = 0X17;
|
||||
int DOWNLOAD_TASK_COMPLETE = 0X18;
|
||||
int DOWNLOAD_TASK_RUNNING = 0X19;
|
||||
int DOWNLOAD_TASK_NO_SUPPORT_BREAKPOINT = 0X1A;
|
||||
|
||||
int UPLOAD_PRE = 0X11;
|
||||
int UPLOAD_TASK_PRE = 0X12;
|
||||
int UPLOAD_TASK_RESUME = 0X13;
|
||||
int UPLOAD_TASK_START = 0X14;
|
||||
int UPLOAD_TASK_STOP = 0X15;
|
||||
int UPLOAD_TASK_CANCEL = 0X16;
|
||||
int UPLOAD_TASK_FAIL = 0X17;
|
||||
int UPLOAD_TASK_COMPLETE = 0X18;
|
||||
int UPLOAD_TASK_RUNNING = 0X19;
|
||||
int UPLOAD_TASK_NO_SUPPORT_BREAKPOINT = 0X1A;
|
||||
}
|
||||
|
@ -18,6 +18,7 @@ package com.arialyy.compiler;
|
||||
import java.lang.annotation.Annotation;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Created by Aria.Lao on 2017/6/7.
|
||||
@ -27,6 +28,6 @@ class ProxyEntity {
|
||||
public String packageName;
|
||||
public String className;
|
||||
public boolean isDownlaod = true;
|
||||
|
||||
public Map<String, Set<String>> keyMappings = new HashMap<>();
|
||||
public Map<Class<? extends Annotation>, String> methods = new HashMap<>();
|
||||
}
|
||||
|
Reference in New Issue
Block a user