From 1b27daab80ae38f5f96331150734693b4bfbd441 Mon Sep 17 00:00:00 2001 From: Mohammad Yasir Date: Fri, 27 Jan 2017 18:34:26 +0530 Subject: [PATCH 01/14] Reflectionless method inovation for Event bus --- .../src/org/greenrobot/eventbus/EventBus.java | 3 +- .../eventbus/GeneratedSubscriberMethod.java | 55 +++++++++++++++++++ .../eventbus/ReflectiveSubscriberMethod.java | 50 +++++++++++++++++ .../greenrobot/eventbus/SubscriberMethod.java | 23 ++++---- .../eventbus/SubscriberMethodFinder.java | 19 ++++--- .../eventbus/meta/AbstractSubscriberInfo.java | 20 ++----- .../eventbus/meta/SimpleSubscriberInfo.java | 2 +- .../eventbus/meta/SubscriberMethodInfo.java | 24 +++++--- .../meta/SubscriberMethodInvoker.java | 7 +++ .../EventBusAnnotationProcessor.java | 14 +++-- .../eventbus/EventBusIndexTest.java | 8 ++- 11 files changed, 175 insertions(+), 50 deletions(-) create mode 100644 EventBus/src/org/greenrobot/eventbus/GeneratedSubscriberMethod.java create mode 100644 EventBus/src/org/greenrobot/eventbus/ReflectiveSubscriberMethod.java create mode 100644 EventBus/src/org/greenrobot/eventbus/meta/SubscriberMethodInvoker.java diff --git a/EventBus/src/org/greenrobot/eventbus/EventBus.java b/EventBus/src/org/greenrobot/eventbus/EventBus.java index 1cd57e32..519cdf2b 100644 --- a/EventBus/src/org/greenrobot/eventbus/EventBus.java +++ b/EventBus/src/org/greenrobot/eventbus/EventBus.java @@ -133,6 +133,7 @@ public EventBus() { */ public void register(Object subscriber) { Class subscriberClass = subscriber.getClass(); + List subscriberMethods = subscriberMethodFinder.findSubscriberMethods(subscriberClass); synchronized (this) { for (SubscriberMethod subscriberMethod : subscriberMethods) { @@ -482,7 +483,7 @@ void invokeSubscriber(PendingPost pendingPost) { void invokeSubscriber(Subscription subscription, Object event) { try { - subscription.subscriberMethod.method.invoke(subscription.subscriber, event); + subscription.subscriberMethod.invoke(subscription.subscriber, event); } catch (InvocationTargetException e) { handleSubscriberException(subscription, event, e.getCause()); } catch (IllegalAccessException e) { diff --git a/EventBus/src/org/greenrobot/eventbus/GeneratedSubscriberMethod.java b/EventBus/src/org/greenrobot/eventbus/GeneratedSubscriberMethod.java new file mode 100644 index 00000000..0fb9c330 --- /dev/null +++ b/EventBus/src/org/greenrobot/eventbus/GeneratedSubscriberMethod.java @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2012-2016 Markus Junginger, greenrobot (http://greenrobot.org) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.greenrobot.eventbus; + +import org.greenrobot.eventbus.meta.SubscriberMethodInvoker; + +import java.lang.reflect.InvocationTargetException; + +/** Used internally by EventBus for generated index */ +public class GeneratedSubscriberMethod extends SubscriberMethod{ + + final SubscriberMethodInvoker invoker; + final String methodName; + final Class declaringClass; + + public GeneratedSubscriberMethod(SubscriberMethodInvoker invoker, String methodName, Class declaringClass, Class eventType, ThreadMode threadMode, int priority, boolean sticky) { + super(eventType, threadMode, priority, sticky); + this.invoker = invoker; + this.methodName = methodName; + this.declaringClass = declaringClass; + } + + @Override + public void invoke(Object subscriber, Object event) throws InvocationTargetException, IllegalAccessException { + invoker.invoke(subscriber, event); + } + + @Override + public String getName() { + return methodName; + } + + @Override + public Class getDeclaringClass() { + return declaringClass; + } + + @Override + public int hashCode() { + return this.methodString.hashCode(); + } +} \ No newline at end of file diff --git a/EventBus/src/org/greenrobot/eventbus/ReflectiveSubscriberMethod.java b/EventBus/src/org/greenrobot/eventbus/ReflectiveSubscriberMethod.java new file mode 100644 index 00000000..7055e52b --- /dev/null +++ b/EventBus/src/org/greenrobot/eventbus/ReflectiveSubscriberMethod.java @@ -0,0 +1,50 @@ +/* + * Copyright (C) 2012-2016 Markus Junginger, greenrobot (http://greenrobot.org) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.greenrobot.eventbus; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +/** Used internally by EventBus */ +public class ReflectiveSubscriberMethod extends SubscriberMethod{ + final Method method; + + public ReflectiveSubscriberMethod(Method method, Class eventType, ThreadMode threadMode, int priority, boolean sticky) { + super(eventType, threadMode, priority, sticky); + this.method = method; + } + + @Override + public void invoke(Object subscriber, Object event) throws InvocationTargetException, IllegalAccessException { + method.invoke(subscriber, event); + } + + + @Override + public String getName() { + return method.getName(); + } + + @Override + public Class getDeclaringClass() { + return method.getDeclaringClass(); + } + + @Override + public int hashCode() { + return method.hashCode(); + } +} \ No newline at end of file diff --git a/EventBus/src/org/greenrobot/eventbus/SubscriberMethod.java b/EventBus/src/org/greenrobot/eventbus/SubscriberMethod.java index 1d78d479..95d54be7 100644 --- a/EventBus/src/org/greenrobot/eventbus/SubscriberMethod.java +++ b/EventBus/src/org/greenrobot/eventbus/SubscriberMethod.java @@ -15,11 +15,10 @@ */ package org.greenrobot.eventbus; -import java.lang.reflect.Method; +import java.lang.reflect.InvocationTargetException; /** Used internally by EventBus and generated subscriber indexes. */ -public class SubscriberMethod { - final Method method; +public abstract class SubscriberMethod { final ThreadMode threadMode; final Class eventType; final int priority; @@ -27,8 +26,7 @@ public class SubscriberMethod { /** Used for efficient comparison */ String methodString; - public SubscriberMethod(Method method, Class eventType, ThreadMode threadMode, int priority, boolean sticky) { - this.method = method; + public SubscriberMethod(Class eventType, ThreadMode threadMode, int priority, boolean sticky) { this.threadMode = threadMode; this.eventType = eventType; this.priority = priority; @@ -54,15 +52,18 @@ private synchronized void checkMethodString() { if (methodString == null) { // Method.toString has more overhead, just take relevant parts of the method StringBuilder builder = new StringBuilder(64); - builder.append(method.getDeclaringClass().getName()); - builder.append('#').append(method.getName()); + builder.append(getDeclaringClass().getName()); + builder.append('#').append(getName()); builder.append('(').append(eventType.getName()); methodString = builder.toString(); } } - @Override - public int hashCode() { - return method.hashCode(); - } + + public abstract void invoke(Object subscriber, Object event) throws InvocationTargetException, IllegalAccessException; + + + public abstract String getName(); + + public abstract Class getDeclaringClass(); } \ No newline at end of file diff --git a/EventBus/src/org/greenrobot/eventbus/SubscriberMethodFinder.java b/EventBus/src/org/greenrobot/eventbus/SubscriberMethodFinder.java index db5e0ad3..bea466cf 100644 --- a/EventBus/src/org/greenrobot/eventbus/SubscriberMethodFinder.java +++ b/EventBus/src/org/greenrobot/eventbus/SubscriberMethodFinder.java @@ -80,7 +80,7 @@ private List findUsingInfo(Class subscriberClass) { if (findState.subscriberInfo != null) { SubscriberMethod[] array = findState.subscriberInfo.getSubscriberMethods(); for (SubscriberMethod subscriberMethod : array) { - if (findState.checkAdd(subscriberMethod.method, subscriberMethod.eventType)) { + if (findState.checkAdd(subscriberMethod, subscriberMethod.eventType)) { findState.subscriberMethods.add(subscriberMethod); } } @@ -165,10 +165,11 @@ private void findUsingReflectionInSingleClass(FindState findState) { Subscribe subscribeAnnotation = method.getAnnotation(Subscribe.class); if (subscribeAnnotation != null) { Class eventType = parameterTypes[0]; - if (findState.checkAdd(method, eventType)) { - ThreadMode threadMode = subscribeAnnotation.threadMode(); - findState.subscriberMethods.add(new SubscriberMethod(method, eventType, threadMode, - subscribeAnnotation.priority(), subscribeAnnotation.sticky())); + ThreadMode threadMode = subscribeAnnotation.threadMode(); + ReflectiveSubscriberMethod reflectiveSubscriberMethod = new ReflectiveSubscriberMethod(method, eventType, threadMode, + subscribeAnnotation.priority(), subscribeAnnotation.sticky()); + if (findState.checkAdd(reflectiveSubscriberMethod, eventType)) { + findState.subscriberMethods.add(reflectiveSubscriberMethod); } } } else if (strictMethodVerification && method.isAnnotationPresent(Subscribe.class)) { @@ -216,15 +217,15 @@ void recycle() { subscriberInfo = null; } - boolean checkAdd(Method method, Class eventType) { + boolean checkAdd(SubscriberMethod method, Class eventType) { // 2 level check: 1st level with event type only (fast), 2nd level with complete signature when required. // Usually a subscriber doesn't have methods listening to the same event type. Object existing = anyMethodByEventType.put(eventType, method); if (existing == null) { return true; } else { - if (existing instanceof Method) { - if (!checkAddWithMethodSignature((Method) existing, eventType)) { + if (existing instanceof SubscriberMethod) { + if (!checkAddWithMethodSignature((SubscriberMethod) existing, eventType)) { // Paranoia check throw new IllegalStateException(); } @@ -235,7 +236,7 @@ boolean checkAdd(Method method, Class eventType) { } } - private boolean checkAddWithMethodSignature(Method method, Class eventType) { + private boolean checkAddWithMethodSignature(SubscriberMethod method, Class eventType) { methodKeyBuilder.setLength(0); methodKeyBuilder.append(method.getName()); methodKeyBuilder.append('>').append(eventType.getName()); diff --git a/EventBus/src/org/greenrobot/eventbus/meta/AbstractSubscriberInfo.java b/EventBus/src/org/greenrobot/eventbus/meta/AbstractSubscriberInfo.java index b68de63a..4f788bd1 100644 --- a/EventBus/src/org/greenrobot/eventbus/meta/AbstractSubscriberInfo.java +++ b/EventBus/src/org/greenrobot/eventbus/meta/AbstractSubscriberInfo.java @@ -16,6 +16,8 @@ package org.greenrobot.eventbus.meta; import org.greenrobot.eventbus.EventBusException; +import org.greenrobot.eventbus.GeneratedSubscriberMethod; +import org.greenrobot.eventbus.ReflectiveSubscriberMethod; import org.greenrobot.eventbus.SubscriberMethod; import org.greenrobot.eventbus.ThreadMode; @@ -56,23 +58,9 @@ public boolean shouldCheckSuperclass() { return shouldCheckSuperclass; } - protected SubscriberMethod createSubscriberMethod(String methodName, Class eventType) { - return createSubscriberMethod(methodName, eventType, ThreadMode.POSTING, 0, false); - } - - protected SubscriberMethod createSubscriberMethod(String methodName, Class eventType, ThreadMode threadMode) { - return createSubscriberMethod(methodName, eventType, threadMode, 0, false); - } - - protected SubscriberMethod createSubscriberMethod(String methodName, Class eventType, ThreadMode threadMode, + protected SubscriberMethod createSubscriberMethod(SubscriberMethodInvoker invoker, String methodName, Class declaringClass, Class eventType, ThreadMode threadMode, int priority, boolean sticky) { - try { - Method method = subscriberClass.getDeclaredMethod(methodName, eventType); - return new SubscriberMethod(method, eventType, threadMode, priority, sticky); - } catch (NoSuchMethodException e) { - throw new EventBusException("Could not find subscriber method in " + subscriberClass + - ". Maybe a missing ProGuard rule?", e); - } + return new GeneratedSubscriberMethod(invoker, methodName, declaringClass, eventType, threadMode, priority, sticky); } } diff --git a/EventBus/src/org/greenrobot/eventbus/meta/SimpleSubscriberInfo.java b/EventBus/src/org/greenrobot/eventbus/meta/SimpleSubscriberInfo.java index 3ee4442d..a4960cb1 100644 --- a/EventBus/src/org/greenrobot/eventbus/meta/SimpleSubscriberInfo.java +++ b/EventBus/src/org/greenrobot/eventbus/meta/SimpleSubscriberInfo.java @@ -35,7 +35,7 @@ public synchronized SubscriberMethod[] getSubscriberMethods() { SubscriberMethod[] methods = new SubscriberMethod[length]; for (int i = 0; i < length; i++) { SubscriberMethodInfo info = methodInfos[i]; - methods[i] = createSubscriberMethod(info.methodName, info.eventType, info.threadMode, + methods[i] = createSubscriberMethod(info.invoker, info.methodString, info.declaringClass, info.eventType, info.threadMode, info.priority, info.sticky); } return methods; diff --git a/EventBus/src/org/greenrobot/eventbus/meta/SubscriberMethodInfo.java b/EventBus/src/org/greenrobot/eventbus/meta/SubscriberMethodInfo.java index 2152554c..e236db10 100644 --- a/EventBus/src/org/greenrobot/eventbus/meta/SubscriberMethodInfo.java +++ b/EventBus/src/org/greenrobot/eventbus/meta/SubscriberMethodInfo.java @@ -18,27 +18,37 @@ import org.greenrobot.eventbus.ThreadMode; public class SubscriberMethodInfo { - final String methodName; + final SubscriberMethodInvoker invoker; + final String methodString; + final Class declaringClass; final ThreadMode threadMode; final Class eventType; final int priority; final boolean sticky; - public SubscriberMethodInfo(String methodName, Class eventType, ThreadMode threadMode, + public SubscriberMethodInfo(SubscriberMethodInvoker invoker, + String methodString, + Class declaringClass, + Class eventType, ThreadMode threadMode, int priority, boolean sticky) { - this.methodName = methodName; + this.invoker = invoker; + this.methodString = methodString; + this.declaringClass = declaringClass; this.threadMode = threadMode; this.eventType = eventType; this.priority = priority; this.sticky = sticky; } - public SubscriberMethodInfo(String methodName, Class eventType) { - this(methodName, eventType, ThreadMode.POSTING, 0, false); + public SubscriberMethodInfo(SubscriberMethodInvoker invoker, + String methodString, + Class declaringClass, + Class eventType) { + this(invoker, methodString, declaringClass, eventType, ThreadMode.POSTING, 0, false); } - public SubscriberMethodInfo(String methodName, Class eventType, ThreadMode threadMode) { - this(methodName, eventType, threadMode, 0, false); + public SubscriberMethodInfo(SubscriberMethodInvoker invoker, String methodString, Class declaringClass, Class eventType, ThreadMode threadMode) { + this(invoker, methodString, declaringClass, eventType, threadMode, 0, false); } } \ No newline at end of file diff --git a/EventBus/src/org/greenrobot/eventbus/meta/SubscriberMethodInvoker.java b/EventBus/src/org/greenrobot/eventbus/meta/SubscriberMethodInvoker.java new file mode 100644 index 00000000..e008c829 --- /dev/null +++ b/EventBus/src/org/greenrobot/eventbus/meta/SubscriberMethodInvoker.java @@ -0,0 +1,7 @@ +package org.greenrobot.eventbus.meta; + + + +public interface SubscriberMethodInvoker { + void invoke(Object subscriber, Object event); +} diff --git a/EventBusAnnotationProcessor/src/org/greenrobot/eventbus/annotationprocessor/EventBusAnnotationProcessor.java b/EventBusAnnotationProcessor/src/org/greenrobot/eventbus/annotationprocessor/EventBusAnnotationProcessor.java index c37c18a5..1bf63ce4 100644 --- a/EventBusAnnotationProcessor/src/org/greenrobot/eventbus/annotationprocessor/EventBusAnnotationProcessor.java +++ b/EventBusAnnotationProcessor/src/org/greenrobot/eventbus/annotationprocessor/EventBusAnnotationProcessor.java @@ -68,6 +68,7 @@ public SourceVersion getSupportedSourceVersion() { @Override public boolean process(Set annotations, RoundEnvironment env) { Messager messager = processingEnv.getMessager(); + try { String index = processingEnv.getOptions().get(OPTION_EVENT_BUS_INDEX); if (index == null) { @@ -75,6 +76,7 @@ public boolean process(Set annotations, RoundEnvironment " passed to annotation processor"); return false; } + System.out.println("Yasir here :" + index); verbose = Boolean.parseBoolean(processingEnv.getOptions().get(OPTION_VERBOSE)); int lastPeriod = index.lastIndexOf('.'); String indexPackage = lastPeriod != -1 ? index.substring(0, lastPeriod) : null; @@ -270,18 +272,20 @@ private PackageElement getPackageElement(TypeElement subscriberClass) { return (PackageElement) candidate; } - private void writeCreateSubscriberMethods(BufferedWriter writer, List methods, + private void writeCreateSubscriberMethods(BufferedWriter writer, String subscriberClass, List methods, String callPrefix, String myPackage) throws IOException { for (ExecutableElement method : methods) { List parameters = method.getParameters(); TypeMirror paramType = getParamTypeMirror(parameters.get(0), null); TypeElement paramElement = (TypeElement) processingEnv.getTypeUtils().asElement(paramType); String methodName = method.getSimpleName().toString(); - String eventClass = getClassString(paramElement, myPackage) + ".class"; + String eventClassString = getClassString(paramElement, myPackage); + String eventClass = eventClassString + ".class"; Subscribe subscribe = method.getAnnotation(Subscribe.class); List parts = new ArrayList<>(); - parts.add(callPrefix + "(\"" + methodName + "\","); + String invoker = "new SubscriberMethodInvoker(){public void invoke(Object subscriber, Object event){(("+subscriberClass+")subscriber)." + methodName + "(("+ eventClassString+ ")event);}}"; + parts.add(callPrefix + "(" + invoker + ", \"" + methodName + "\", " + subscriberClass + ".class, "); String lineEnd = "),"; if (subscribe.priority() == 0 && !subscribe.sticky()) { if (subscribe.threadMode() == ThreadMode.POSTING) { @@ -318,8 +322,10 @@ private void createInfoIndexFile(String index) { if (myPackage != null) { writer.write("package " + myPackage + ";\n\n"); } + writer.write("import org.greenrobot.eventbus.meta.SimpleSubscriberInfo;\n"); writer.write("import org.greenrobot.eventbus.meta.SubscriberMethodInfo;\n"); + writer.write("import org.greenrobot.eventbus.meta.SubscriberMethodInvoker;\n"); writer.write("import org.greenrobot.eventbus.meta.SubscriberInfo;\n"); writer.write("import org.greenrobot.eventbus.meta.SubscriberInfoIndex;\n\n"); writer.write("import org.greenrobot.eventbus.ThreadMode;\n\n"); @@ -370,7 +376,7 @@ private void writeIndexLines(BufferedWriter writer, String myPackage) throws IOE "putIndex(new SimpleSubscriberInfo(" + subscriberClass + ".class,", "true,", "new SubscriberMethodInfo[] {"); List methods = methodsByClass.get(subscriberTypeElement); - writeCreateSubscriberMethods(writer, methods, "new SubscriberMethodInfo", myPackage); + writeCreateSubscriberMethods(writer, subscriberClass, methods, "new SubscriberMethodInfo", myPackage); writer.write(" }));\n\n"); } else { writer.write(" // Subscriber not visible to index: " + subscriberClass + "\n"); diff --git a/EventBusTest/src/org/greenrobot/eventbus/EventBusIndexTest.java b/EventBusTest/src/org/greenrobot/eventbus/EventBusIndexTest.java index d5acc814..c18cdcc0 100644 --- a/EventBusTest/src/org/greenrobot/eventbus/EventBusIndexTest.java +++ b/EventBusTest/src/org/greenrobot/eventbus/EventBusIndexTest.java @@ -20,6 +20,7 @@ import org.greenrobot.eventbus.meta.SubscriberInfo; import org.greenrobot.eventbus.meta.SubscriberInfoIndex; import org.greenrobot.eventbus.meta.SubscriberMethodInfo; +import org.greenrobot.eventbus.meta.SubscriberMethodInvoker; import org.junit.Assert; import org.junit.Test; @@ -35,7 +36,12 @@ public void testManualIndexWithoutAnnotation() { public SubscriberInfo getSubscriberInfo(Class subscriberClass) { Assert.assertEquals(EventBusIndexTest.class, subscriberClass); SubscriberMethodInfo[] methodInfos = { - new SubscriberMethodInfo("someMethodWithoutAnnotation", String.class) + new SubscriberMethodInfo(new SubscriberMethodInvoker() { + @Override + public void invoke(Object subscriber, Object event) { + ((EventBusIndexTest)subscriber).someMethodWithoutAnnotation((String)event); + } + }, "someMethodWithoutAnnotation", EventBusIndexTest.class, String.class) }; return new SimpleSubscriberInfo(EventBusIndexTest.class, false, methodInfos); } From 4def77c7f8b12442b3abecd393bd52d98f1e5c79 Mon Sep 17 00:00:00 2001 From: Mohammad Yasir Date: Fri, 27 Jan 2017 18:51:08 +0530 Subject: [PATCH 02/14] Code cleanup --- .../eventbus/meta/AbstractSubscriberInfo.java | 4 ++-- .../greenrobot/eventbus/meta/SimpleSubscriberInfo.java | 2 +- .../greenrobot/eventbus/meta/SubscriberMethodInfo.java | 10 +++------- .../EventBusAnnotationProcessor.java | 2 +- .../src/org/greenrobot/eventbus/EventBusIndexTest.java | 2 +- 5 files changed, 8 insertions(+), 12 deletions(-) diff --git a/EventBus/src/org/greenrobot/eventbus/meta/AbstractSubscriberInfo.java b/EventBus/src/org/greenrobot/eventbus/meta/AbstractSubscriberInfo.java index 4f788bd1..c41885d6 100644 --- a/EventBus/src/org/greenrobot/eventbus/meta/AbstractSubscriberInfo.java +++ b/EventBus/src/org/greenrobot/eventbus/meta/AbstractSubscriberInfo.java @@ -58,9 +58,9 @@ public boolean shouldCheckSuperclass() { return shouldCheckSuperclass; } - protected SubscriberMethod createSubscriberMethod(SubscriberMethodInvoker invoker, String methodName, Class declaringClass, Class eventType, ThreadMode threadMode, + protected SubscriberMethod createSubscriberMethod(SubscriberMethodInvoker invoker, String methodName, Class eventType, ThreadMode threadMode, int priority, boolean sticky) { - return new GeneratedSubscriberMethod(invoker, methodName, declaringClass, eventType, threadMode, priority, sticky); + return new GeneratedSubscriberMethod(invoker, methodName, getSubscriberClass(), eventType, threadMode, priority, sticky); } } diff --git a/EventBus/src/org/greenrobot/eventbus/meta/SimpleSubscriberInfo.java b/EventBus/src/org/greenrobot/eventbus/meta/SimpleSubscriberInfo.java index a4960cb1..807d39e1 100644 --- a/EventBus/src/org/greenrobot/eventbus/meta/SimpleSubscriberInfo.java +++ b/EventBus/src/org/greenrobot/eventbus/meta/SimpleSubscriberInfo.java @@ -35,7 +35,7 @@ public synchronized SubscriberMethod[] getSubscriberMethods() { SubscriberMethod[] methods = new SubscriberMethod[length]; for (int i = 0; i < length; i++) { SubscriberMethodInfo info = methodInfos[i]; - methods[i] = createSubscriberMethod(info.invoker, info.methodString, info.declaringClass, info.eventType, info.threadMode, + methods[i] = createSubscriberMethod(info.invoker, info.methodString, info.eventType, info.threadMode, info.priority, info.sticky); } return methods; diff --git a/EventBus/src/org/greenrobot/eventbus/meta/SubscriberMethodInfo.java b/EventBus/src/org/greenrobot/eventbus/meta/SubscriberMethodInfo.java index e236db10..38c7f651 100644 --- a/EventBus/src/org/greenrobot/eventbus/meta/SubscriberMethodInfo.java +++ b/EventBus/src/org/greenrobot/eventbus/meta/SubscriberMethodInfo.java @@ -20,7 +20,6 @@ public class SubscriberMethodInfo { final SubscriberMethodInvoker invoker; final String methodString; - final Class declaringClass; final ThreadMode threadMode; final Class eventType; final int priority; @@ -28,12 +27,10 @@ public class SubscriberMethodInfo { public SubscriberMethodInfo(SubscriberMethodInvoker invoker, String methodString, - Class declaringClass, Class eventType, ThreadMode threadMode, int priority, boolean sticky) { this.invoker = invoker; this.methodString = methodString; - this.declaringClass = declaringClass; this.threadMode = threadMode; this.eventType = eventType; this.priority = priority; @@ -42,13 +39,12 @@ public SubscriberMethodInfo(SubscriberMethodInvoker invoker, public SubscriberMethodInfo(SubscriberMethodInvoker invoker, String methodString, - Class declaringClass, Class eventType) { - this(invoker, methodString, declaringClass, eventType, ThreadMode.POSTING, 0, false); + this(invoker, methodString, eventType, ThreadMode.POSTING, 0, false); } - public SubscriberMethodInfo(SubscriberMethodInvoker invoker, String methodString, Class declaringClass, Class eventType, ThreadMode threadMode) { - this(invoker, methodString, declaringClass, eventType, threadMode, 0, false); + public SubscriberMethodInfo(SubscriberMethodInvoker invoker, String methodString, Class eventType, ThreadMode threadMode) { + this(invoker, methodString, eventType, threadMode, 0, false); } } \ No newline at end of file diff --git a/EventBusAnnotationProcessor/src/org/greenrobot/eventbus/annotationprocessor/EventBusAnnotationProcessor.java b/EventBusAnnotationProcessor/src/org/greenrobot/eventbus/annotationprocessor/EventBusAnnotationProcessor.java index 1bf63ce4..c642ca05 100644 --- a/EventBusAnnotationProcessor/src/org/greenrobot/eventbus/annotationprocessor/EventBusAnnotationProcessor.java +++ b/EventBusAnnotationProcessor/src/org/greenrobot/eventbus/annotationprocessor/EventBusAnnotationProcessor.java @@ -285,7 +285,7 @@ private void writeCreateSubscriberMethods(BufferedWriter writer, String subscrib Subscribe subscribe = method.getAnnotation(Subscribe.class); List parts = new ArrayList<>(); String invoker = "new SubscriberMethodInvoker(){public void invoke(Object subscriber, Object event){(("+subscriberClass+")subscriber)." + methodName + "(("+ eventClassString+ ")event);}}"; - parts.add(callPrefix + "(" + invoker + ", \"" + methodName + "\", " + subscriberClass + ".class, "); + parts.add(callPrefix + "(" + invoker + ", \"" + methodName + "\", "); String lineEnd = "),"; if (subscribe.priority() == 0 && !subscribe.sticky()) { if (subscribe.threadMode() == ThreadMode.POSTING) { diff --git a/EventBusTest/src/org/greenrobot/eventbus/EventBusIndexTest.java b/EventBusTest/src/org/greenrobot/eventbus/EventBusIndexTest.java index c18cdcc0..d8d69b4d 100644 --- a/EventBusTest/src/org/greenrobot/eventbus/EventBusIndexTest.java +++ b/EventBusTest/src/org/greenrobot/eventbus/EventBusIndexTest.java @@ -41,7 +41,7 @@ public SubscriberInfo getSubscriberInfo(Class subscriberClass) { public void invoke(Object subscriber, Object event) { ((EventBusIndexTest)subscriber).someMethodWithoutAnnotation((String)event); } - }, "someMethodWithoutAnnotation", EventBusIndexTest.class, String.class) + }, "someMethodWithoutAnnotation", String.class) }; return new SimpleSubscriberInfo(EventBusIndexTest.class, false, methodInfos); } From d2a96db5dab0db14795e7f74977dd8efbbdbaf92 Mon Sep 17 00:00:00 2001 From: Mohammad Yasir Date: Fri, 27 Jan 2017 19:01:19 +0530 Subject: [PATCH 03/14] Code cleanups --- .../greenrobot/eventbus/meta/AbstractSubscriberInfo.java | 4 ---- .../org/greenrobot/eventbus/meta/SimpleSubscriberInfo.java | 7 +++++++ .../greenrobot/eventbus/meta/SubscriberMethodInvoker.java | 4 +++- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/EventBus/src/org/greenrobot/eventbus/meta/AbstractSubscriberInfo.java b/EventBus/src/org/greenrobot/eventbus/meta/AbstractSubscriberInfo.java index c41885d6..1a9f5255 100644 --- a/EventBus/src/org/greenrobot/eventbus/meta/AbstractSubscriberInfo.java +++ b/EventBus/src/org/greenrobot/eventbus/meta/AbstractSubscriberInfo.java @@ -58,9 +58,5 @@ public boolean shouldCheckSuperclass() { return shouldCheckSuperclass; } - protected SubscriberMethod createSubscriberMethod(SubscriberMethodInvoker invoker, String methodName, Class eventType, ThreadMode threadMode, - int priority, boolean sticky) { - return new GeneratedSubscriberMethod(invoker, methodName, getSubscriberClass(), eventType, threadMode, priority, sticky); - } } diff --git a/EventBus/src/org/greenrobot/eventbus/meta/SimpleSubscriberInfo.java b/EventBus/src/org/greenrobot/eventbus/meta/SimpleSubscriberInfo.java index 807d39e1..e5cd922e 100644 --- a/EventBus/src/org/greenrobot/eventbus/meta/SimpleSubscriberInfo.java +++ b/EventBus/src/org/greenrobot/eventbus/meta/SimpleSubscriberInfo.java @@ -15,7 +15,9 @@ */ package org.greenrobot.eventbus.meta; +import org.greenrobot.eventbus.GeneratedSubscriberMethod; import org.greenrobot.eventbus.SubscriberMethod; +import org.greenrobot.eventbus.ThreadMode; /** * Uses {@link SubscriberMethodInfo} objects to create {@link org.greenrobot.eventbus.SubscriberMethod} objects on demand. @@ -40,4 +42,9 @@ public synchronized SubscriberMethod[] getSubscriberMethods() { } return methods; } + + protected SubscriberMethod createSubscriberMethod(SubscriberMethodInvoker invoker, String methodName, Class eventType, ThreadMode threadMode, + int priority, boolean sticky) { + return new GeneratedSubscriberMethod(invoker, methodName, getSubscriberClass(), eventType, threadMode, priority, sticky); + } } \ No newline at end of file diff --git a/EventBus/src/org/greenrobot/eventbus/meta/SubscriberMethodInvoker.java b/EventBus/src/org/greenrobot/eventbus/meta/SubscriberMethodInvoker.java index e008c829..8a4ca822 100644 --- a/EventBus/src/org/greenrobot/eventbus/meta/SubscriberMethodInvoker.java +++ b/EventBus/src/org/greenrobot/eventbus/meta/SubscriberMethodInvoker.java @@ -1,7 +1,9 @@ package org.greenrobot.eventbus.meta; - +/** + * Interface for generated method invocation to avoid using reflection + */ public interface SubscriberMethodInvoker { void invoke(Object subscriber, Object event); } From b8f74322bd82a36be55be44c5352bb556ac7e190 Mon Sep 17 00:00:00 2001 From: Mohammad Yasir Date: Fri, 27 Jan 2017 21:44:58 +0530 Subject: [PATCH 04/14] Better code indentation --- .../EventBusAnnotationProcessor.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/EventBusAnnotationProcessor/src/org/greenrobot/eventbus/annotationprocessor/EventBusAnnotationProcessor.java b/EventBusAnnotationProcessor/src/org/greenrobot/eventbus/annotationprocessor/EventBusAnnotationProcessor.java index c642ca05..cdaab65f 100644 --- a/EventBusAnnotationProcessor/src/org/greenrobot/eventbus/annotationprocessor/EventBusAnnotationProcessor.java +++ b/EventBusAnnotationProcessor/src/org/greenrobot/eventbus/annotationprocessor/EventBusAnnotationProcessor.java @@ -76,7 +76,6 @@ public boolean process(Set annotations, RoundEnvironment " passed to annotation processor"); return false; } - System.out.println("Yasir here :" + index); verbose = Boolean.parseBoolean(processingEnv.getOptions().get(OPTION_VERBOSE)); int lastPeriod = index.lastIndexOf('.'); String indexPackage = lastPeriod != -1 ? index.substring(0, lastPeriod) : null; @@ -284,8 +283,12 @@ private void writeCreateSubscriberMethods(BufferedWriter writer, String subscrib Subscribe subscribe = method.getAnnotation(Subscribe.class); List parts = new ArrayList<>(); - String invoker = "new SubscriberMethodInvoker(){public void invoke(Object subscriber, Object event){(("+subscriberClass+")subscriber)." + methodName + "(("+ eventClassString+ ")event);}}"; - parts.add(callPrefix + "(" + invoker + ", \"" + methodName + "\", "); + writeLine(writer, 4, callPrefix , "(new SubscriberMethodInvoker() {"); + writeLine(writer, 5,"public void invoke(Object subscriber, Object event) {"); + writeLine(writer, 6,"((" + subscriberClass + ")subscriber)." + methodName + "((" + eventClassString + ")event);"); + writeLine(writer, 5, "}"); + + parts.add("}, \"" + methodName + "\", "); String lineEnd = "),"; if (subscribe.priority() == 0 && !subscribe.sticky()) { if (subscribe.threadMode() == ThreadMode.POSTING) { @@ -300,7 +303,7 @@ private void writeCreateSubscriberMethods(BufferedWriter writer, String subscrib parts.add(subscribe.priority() + ","); parts.add(subscribe.sticky() + lineEnd); } - writeLine(writer, 3, parts.toArray(new String[parts.size()])); + writeLine(writer, 4, parts.toArray(new String[parts.size()])); if (verbose) { processingEnv.getMessager().printMessage(Diagnostic.Kind.NOTE, "Indexed @Subscribe at " + From 7da7b02dd77d5329b1b268a728e5f845d1b29193 Mon Sep 17 00:00:00 2001 From: Mohammad Yasir Date: Fri, 27 Jan 2017 23:19:43 +0530 Subject: [PATCH 05/14] Moving to latest version of SDK and gradle --- .travis.yml | 4 ++-- EventBusPerformance/build.gradle | 7 ++++--- EventBusTest/build.gradle | 4 ++-- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5f3aa2fd..412489de 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,8 +7,8 @@ jdk: android: components: - tools - - build-tools-23.0.2 - - android-10 + - build-tools-25.0.2 + - android-25 - extra-android-m2repository before_script: diff --git a/EventBusPerformance/build.gradle b/EventBusPerformance/build.gradle index 53180e6e..17499461 100644 --- a/EventBusPerformance/build.gradle +++ b/EventBusPerformance/build.gradle @@ -4,7 +4,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:2.2.1' + classpath 'com.android.tools.build:gradle:2.2.3' classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' } } @@ -29,8 +29,9 @@ apt { } android { - buildToolsVersion '23.0.2' // When updating, don't forget to adjust .travis.yml - compileSdkVersion 19 + buildToolsVersion "25.0.2" // When updating, don't forget to adjust .travis.yml + compileSdkVersion 25 + sourceSets { main { diff --git a/EventBusTest/build.gradle b/EventBusTest/build.gradle index a1d04468..30082108 100644 --- a/EventBusTest/build.gradle +++ b/EventBusTest/build.gradle @@ -27,8 +27,8 @@ dependencies { } android { - buildToolsVersion '23.0.2' // When updating, don't forget to adjust .travis.yml - compileSdkVersion 19 + buildToolsVersion "25.0.2" // When updating, don't forget to adjust .travis.yml + compileSdkVersion 25 compileOptions { sourceCompatibility = JavaVersion.VERSION_1_7 From 97d10f93bc9b9ba4252d7ad4e24b60855a17a5a0 Mon Sep 17 00:00:00 2001 From: Mohammad Yasir Date: Fri, 27 Jan 2017 23:31:14 +0530 Subject: [PATCH 06/14] Fixing Travis build --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 412489de..a459a92b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,7 @@ sudo: false language: android jdk: - - oraclejdk7 + - oraclejdk8 # http://docs.travis-ci.com/user/languages/android/ android: From a337aedb2d6e0e176b9475dd601fa66ce8372c9b Mon Sep 17 00:00:00 2001 From: Mohammad Yasir Date: Fri, 27 Jan 2017 23:49:24 +0530 Subject: [PATCH 07/14] Fixing lint issues --- EventBusPerformance/AndroidManifest.xml | 2 +- EventBusPerformance/project.properties | 2 +- .../greenrobot/eventbusperf/TestRunnerActivity.java | 12 +++++++++++- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/EventBusPerformance/AndroidManifest.xml b/EventBusPerformance/AndroidManifest.xml index af353b5d..43c0018b 100644 --- a/EventBusPerformance/AndroidManifest.xml +++ b/EventBusPerformance/AndroidManifest.xml @@ -6,7 +6,7 @@ + android:targetSdkVersion="25" /> Date: Sat, 28 Jan 2017 00:08:21 +0530 Subject: [PATCH 08/14] Fixing lint issues --- .../src/org/greenrobot/eventbusperf/TestRunnerActivity.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/EventBusPerformance/src/org/greenrobot/eventbusperf/TestRunnerActivity.java b/EventBusPerformance/src/org/greenrobot/eventbusperf/TestRunnerActivity.java index 5ed4d1b2..86514207 100644 --- a/EventBusPerformance/src/org/greenrobot/eventbusperf/TestRunnerActivity.java +++ b/EventBusPerformance/src/org/greenrobot/eventbusperf/TestRunnerActivity.java @@ -17,6 +17,8 @@ package org.greenrobot.eventbusperf; import android.app.Activity; +import android.database.Cursor; +import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Process; @@ -84,6 +86,7 @@ public void onEventMainThread(TestFinishedEvent event) { private Spanned fromHtml(String text) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) { + //noinspection deprecation return Html.fromHtml(text); } else { return Html.fromHtml(text, Html.FROM_HTML_MODE_LEGACY); @@ -99,6 +102,8 @@ public void onClickCancel(View view) { finish(); } + + public void onClickKillProcess(View view) { Process.killProcess(Process.myPid()); } From 1b979853c18ec57ff56ef1c8a77f04aea290dac2 Mon Sep 17 00:00:00 2001 From: "anirudh.r" Date: Sat, 28 Jan 2017 00:46:45 +0530 Subject: [PATCH 09/14] fixed lint warnings that was mentioned in the generated lint report. --- EventBusPerformance/AndroidManifest.xml | 5 ++++- EventBusPerformance/build.gradle | 3 +++ .../res/layout/activity_setuptests.xml | 13 +++++++++++-- EventBusPerformance/res/values/strings.xml | 4 +++- .../src/org/greenrobot/eventbusperf/Test.java | 15 ++++++--------- .../org/greenrobot/eventbusperf/TestRunner.java | 11 ++++++----- .../eventbusperf/TestRunnerActivity.java | 2 -- .../eventbusperf/TestSetupActivity.java | 9 +++++---- .../testsubject/PerfTestEventBus.java | 10 ++++++---- .../eventbusperf/testsubject/PerfTestOtto.java | 9 ++++++--- .../SubscribeClassEventBusDefault.java | 3 ++- 11 files changed, 52 insertions(+), 32 deletions(-) diff --git a/EventBusPerformance/AndroidManifest.xml b/EventBusPerformance/AndroidManifest.xml index 43c0018b..1c850bb5 100644 --- a/EventBusPerformance/AndroidManifest.xml +++ b/EventBusPerformance/AndroidManifest.xml @@ -1,5 +1,6 @@ @@ -14,7 +15,9 @@ + android:allowBackup="false" + android:label="@string/app_name" + tools:ignore="GoogleAppIndexingWarning"> diff --git a/EventBusPerformance/build.gradle b/EventBusPerformance/build.gradle index 17499461..ef79778c 100644 --- a/EventBusPerformance/build.gradle +++ b/EventBusPerformance/build.gradle @@ -32,6 +32,9 @@ android { buildToolsVersion "25.0.2" // When updating, don't forget to adjust .travis.yml compileSdkVersion 25 + lintOptions { + disable 'IconMissingDensityFolder' + } sourceSets { main { diff --git a/EventBusPerformance/res/layout/activity_setuptests.xml b/EventBusPerformance/res/layout/activity_setuptests.xml index 27064758..ed8c12a0 100644 --- a/EventBusPerformance/res/layout/activity_setuptests.xml +++ b/EventBusPerformance/res/layout/activity_setuptests.xml @@ -40,6 +40,7 @@ android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginLeft="48dp" + android:layout_marginStart="48dp" android:entries="@array/spinnerThreadModes" /> + android:text="@string/thousand" /> @@ -119,8 +125,9 @@ android:layout_width="90dp" android:layout_height="wrap_content" android:layout_alignParentRight="true" + android:layout_alignParentEnd="true" android:inputType="number" - android:text="1" /> + android:text="@string/number_one" /> diff --git a/EventBusPerformance/res/values/strings.xml b/EventBusPerformance/res/values/strings.xml index feed5953..84e285d1 100644 --- a/EventBusPerformance/res/values/strings.xml +++ b/EventBusPerformance/res/values/strings.xml @@ -28,5 +28,7 @@ Test Is \nRunning! Cancel Kill Process - + 1000 + 1 + \ No newline at end of file diff --git a/EventBusPerformance/src/org/greenrobot/eventbusperf/Test.java b/EventBusPerformance/src/org/greenrobot/eventbusperf/Test.java index ee2d405d..3f4aab70 100644 --- a/EventBusPerformance/src/org/greenrobot/eventbusperf/Test.java +++ b/EventBusPerformance/src/org/greenrobot/eventbusperf/Test.java @@ -21,7 +21,6 @@ import java.util.concurrent.atomic.AtomicLong; public abstract class Test { - protected final Context context; protected final TestParams params; public final AtomicLong eventsReceivedCount = new AtomicLong(); protected long primaryResultMicros; @@ -30,12 +29,11 @@ public abstract class Test { protected boolean canceled; - public Test(Context context, TestParams params) { - this.context = context; + protected Test(Context context, TestParams params) { this.params = params; } - public void cancel() { + void cancel() { canceled = true; } @@ -57,16 +55,15 @@ protected void waitForReceivedEventCount(int expectedEventCount) { } } - public long getPrimaryResultMicros() { + long getPrimaryResultMicros() { return primaryResultMicros; } - public double getPrimaryResultRate() { + double getPrimaryResultRate() { return primaryResultCount / (primaryResultMicros / 1000000d); } - public String getOtherTestResults() { + String getOtherTestResults() { return otherTestResults; } - -} +} \ No newline at end of file diff --git a/EventBusPerformance/src/org/greenrobot/eventbusperf/TestRunner.java b/EventBusPerformance/src/org/greenrobot/eventbusperf/TestRunner.java index 4c0f941f..9ceda5be 100644 --- a/EventBusPerformance/src/org/greenrobot/eventbusperf/TestRunner.java +++ b/EventBusPerformance/src/org/greenrobot/eventbusperf/TestRunner.java @@ -27,14 +27,15 @@ /** * This thread initialize all selected tests and runs them through. Also the thread skips the tests, when it is canceled */ -public class TestRunner extends Thread { - private List tests; +@SuppressWarnings("UnusedAssignment") +class TestRunner extends Thread { + private final List tests; private volatile boolean canceled; private final EventBus controlBus; - public TestRunner(Context context, TestParams testParams, EventBus controlBus) { + TestRunner(Context context, TestParams testParams, EventBus controlBus) { this.controlBus = controlBus; - tests = new ArrayList(); + tests = new ArrayList<>(); for (Class testClazz : testParams.getTestClasses()) { try { Constructor[] constructors = testClazz.getConstructors(); @@ -57,7 +58,7 @@ public void run() { Thread.sleep(300); System.gc(); Thread.sleep(300); - } catch (InterruptedException e) { + } catch (InterruptedException ignored) { } test.prepareTest(); diff --git a/EventBusPerformance/src/org/greenrobot/eventbusperf/TestRunnerActivity.java b/EventBusPerformance/src/org/greenrobot/eventbusperf/TestRunnerActivity.java index 86514207..89f588f5 100644 --- a/EventBusPerformance/src/org/greenrobot/eventbusperf/TestRunnerActivity.java +++ b/EventBusPerformance/src/org/greenrobot/eventbusperf/TestRunnerActivity.java @@ -17,8 +17,6 @@ package org.greenrobot.eventbusperf; import android.app.Activity; -import android.database.Cursor; -import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Process; diff --git a/EventBusPerformance/src/org/greenrobot/eventbusperf/TestSetupActivity.java b/EventBusPerformance/src/org/greenrobot/eventbusperf/TestSetupActivity.java index 3488b8da..68fe164b 100644 --- a/EventBusPerformance/src/org/greenrobot/eventbusperf/TestSetupActivity.java +++ b/EventBusPerformance/src/org/greenrobot/eventbusperf/TestSetupActivity.java @@ -32,15 +32,16 @@ import org.greenrobot.eventbusperf.testsubject.PerfTestEventBus; import org.greenrobot.eventbusperf.testsubject.PerfTestOtto; +@SuppressWarnings("StatementWithEmptyBody") public class TestSetupActivity extends Activity { @SuppressWarnings("rawtypes") - static final Class[] TEST_CLASSES_EVENTBUS = {PerfTestEventBus.Post.class,// + private static final Class[] TEST_CLASSES_EVENTBUS = {PerfTestEventBus.Post.class,// PerfTestEventBus.RegisterOneByOne.class,// PerfTestEventBus.RegisterAll.class, // PerfTestEventBus.RegisterFirstTime.class}; - static final Class[] TEST_CLASSES_OTTO = {PerfTestOtto.Post.class,// + private static final Class[] TEST_CLASSES_OTTO = {PerfTestOtto.Post.class,// PerfTestOtto.RegisterOneByOne.class,// PerfTestOtto.RegisterAll.class, // PerfTestOtto.RegisterFirstTime.class}; @@ -99,9 +100,9 @@ public void startClick(View v) { startActivity(intent); } - @SuppressWarnings("unchecked") + @SuppressWarnings({"unchecked", "StatementWithEmptyBody"}) private ArrayList> initTestClasses(int testPos) { - ArrayList> testClasses = new ArrayList>(); + ArrayList> testClasses = new ArrayList<>(); // the attributes are putted in the intent (eventbus, otto, broadcast, local broadcast) final CheckBox checkBoxEventBus = (CheckBox) findViewById(R.id.checkBoxEventBus); final CheckBox checkBoxOtto = (CheckBox) findViewById(R.id.checkBoxOtto); diff --git a/EventBusPerformance/src/org/greenrobot/eventbusperf/testsubject/PerfTestEventBus.java b/EventBusPerformance/src/org/greenrobot/eventbusperf/testsubject/PerfTestEventBus.java index 7ceb8e6d..6ae4321c 100644 --- a/EventBusPerformance/src/org/greenrobot/eventbusperf/testsubject/PerfTestEventBus.java +++ b/EventBusPerformance/src/org/greenrobot/eventbusperf/testsubject/PerfTestEventBus.java @@ -31,6 +31,7 @@ import org.greenrobot.eventbusperf.TestEvent; import org.greenrobot.eventbusperf.TestParams; +@SuppressWarnings("ALL") public abstract class PerfTestEventBus extends Test { private final EventBus eventBus; @@ -39,11 +40,11 @@ public abstract class PerfTestEventBus extends Test { private final int eventCount; private final int expectedEventCount; - public PerfTestEventBus(Context context, TestParams params) { + PerfTestEventBus(Context context, TestParams params) { super(context, params); eventBus = EventBus.builder().eventInheritance(params.isEventInheritance()).addIndex(new MyEventBusIndex()) .ignoreGeneratedIndex(params.isIgnoreGeneratedIndex()).build(); - subscribers = new ArrayList(); + subscribers = new ArrayList<>(); eventCount = params.getEventCount(); expectedEventCount = eventCount * params.getSubscriberCount(); subscriberClass = getSubscriberClassForThreadMode(); @@ -142,9 +143,9 @@ public String getDisplayName() { } public static class RegisterOneByOne extends PerfTestEventBus { - protected Method clearCachesMethod; + Method clearCachesMethod; - public RegisterOneByOne(Context context, TestParams params) { + RegisterOneByOne(Context context, TestParams params) { super(context, params); } @@ -205,6 +206,7 @@ public String getDisplayName() { } + @SuppressWarnings({"EmptyMethod", "unused"}) public class SubscribeClassEventBusMain { @Subscribe(threadMode = ThreadMode.MAIN) public void onEventMainThread(TestEvent event) { diff --git a/EventBusPerformance/src/org/greenrobot/eventbusperf/testsubject/PerfTestOtto.java b/EventBusPerformance/src/org/greenrobot/eventbusperf/testsubject/PerfTestOtto.java index 646256ed..133f7f6d 100644 --- a/EventBusPerformance/src/org/greenrobot/eventbusperf/testsubject/PerfTestOtto.java +++ b/EventBusPerformance/src/org/greenrobot/eventbusperf/testsubject/PerfTestOtto.java @@ -16,6 +16,7 @@ package org.greenrobot.eventbusperf.testsubject; +import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.os.Looper; @@ -44,7 +45,7 @@ public abstract class PerfTestOtto extends Test { public PerfTestOtto(Context context, TestParams params) { super(context, params); eventBus = new Bus(ThreadEnforcer.ANY); - subscribers = new ArrayList(); + subscribers = new ArrayList<>(); eventCount = params.getEventCount(); expectedEventCount = eventCount * params.getSubscriberCount(); subscriberClass = Subscriber.class; @@ -117,9 +118,9 @@ public String getDisplayName() { } public static class RegisterOneByOne extends PerfTestOtto { - protected Field cacheField; + Field cacheField; - public RegisterOneByOne(Context context, TestParams params) { + RegisterOneByOne(Context context, TestParams params) { super(context, params); } @@ -182,6 +183,8 @@ public String getDisplayName() { } + @SuppressWarnings("EmptyMethod") + @SuppressLint("Registered") public class Subscriber extends Activity { public Subscriber() { } diff --git a/EventBusPerformance/src/org/greenrobot/eventbusperf/testsubject/SubscribeClassEventBusDefault.java b/EventBusPerformance/src/org/greenrobot/eventbusperf/testsubject/SubscribeClassEventBusDefault.java index 54a11423..37f30637 100644 --- a/EventBusPerformance/src/org/greenrobot/eventbusperf/testsubject/SubscribeClassEventBusDefault.java +++ b/EventBusPerformance/src/org/greenrobot/eventbusperf/testsubject/SubscribeClassEventBusDefault.java @@ -20,8 +20,9 @@ import org.greenrobot.eventbusperf.TestEvent; +@SuppressWarnings("EmptyMethod") public class SubscribeClassEventBusDefault { - private PerfTestEventBus perfTestEventBus; + private final PerfTestEventBus perfTestEventBus; public SubscribeClassEventBusDefault(PerfTestEventBus perfTestEventBus) { this.perfTestEventBus = perfTestEventBus; From fcf3c2d74da85395675787161170368ceb618b07 Mon Sep 17 00:00:00 2001 From: "anirudh.r" Date: Sat, 28 Jan 2017 01:00:46 +0530 Subject: [PATCH 10/14] noinspection --- EventBusPerformance/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/EventBusPerformance/build.gradle b/EventBusPerformance/build.gradle index ef79778c..2a8f70fa 100644 --- a/EventBusPerformance/build.gradle +++ b/EventBusPerformance/build.gradle @@ -32,6 +32,7 @@ android { buildToolsVersion "25.0.2" // When updating, don't forget to adjust .travis.yml compileSdkVersion 25 + //noinspection GroovyMissingReturnStatement lintOptions { disable 'IconMissingDensityFolder' } From c1b1e9902d582cc114c69bfd49379611db01120f Mon Sep 17 00:00:00 2001 From: "anirudh.r" Date: Sat, 28 Jan 2017 01:10:53 +0530 Subject: [PATCH 11/14] added icon for diff density --- .../res/drawable-xxhdpi/ic_launcher.png | Bin 0 -> 27358 bytes .../res/drawable-xxxhdpi/ic_launcher.png | Bin 0 -> 43603 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 EventBusPerformance/res/drawable-xxhdpi/ic_launcher.png create mode 100644 EventBusPerformance/res/drawable-xxxhdpi/ic_launcher.png diff --git a/EventBusPerformance/res/drawable-xxhdpi/ic_launcher.png b/EventBusPerformance/res/drawable-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..8291f4fc449780005a9c29e50c35da5685d0bccf GIT binary patch literal 27358 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%0DW`j+3@DW#mOKXl{5v%Z`Q@?O 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

diuDB_W)v%h1Xq`$t> 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 Date: Sat, 28 Jan 2017 01:18:26 +0530 Subject: [PATCH 12/14] supress deprecation warning --- .../src/org/greenrobot/eventbusperf/TestRunnerActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EventBusPerformance/src/org/greenrobot/eventbusperf/TestRunnerActivity.java b/EventBusPerformance/src/org/greenrobot/eventbusperf/TestRunnerActivity.java index 89f588f5..eb9eec75 100644 --- a/EventBusPerformance/src/org/greenrobot/eventbusperf/TestRunnerActivity.java +++ b/EventBusPerformance/src/org/greenrobot/eventbusperf/TestRunnerActivity.java @@ -34,6 +34,7 @@ * after that, if a test is finished. When a test is finished, the activity appends it on the textview analyse. If all * test are finished, it cancels the timer. */ +@SuppressWarnings("deprecation") public class TestRunnerActivity extends Activity { private TestRunner testRunner; @@ -84,7 +85,6 @@ public void onEventMainThread(TestFinishedEvent event) { private Spanned fromHtml(String text) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) { - //noinspection deprecation return Html.fromHtml(text); } else { return Html.fromHtml(text, Html.FROM_HTML_MODE_LEGACY); From e77e33932f48c4e9635ed3656455fac1f30fe948 Mon Sep 17 00:00:00 2001 From: Mohammad Yasir Date: Tue, 14 Feb 2017 23:45:27 +0530 Subject: [PATCH 13/14] Potential Build fix --- .travis.yml | 4 +--- build.gradle | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index a459a92b..be105f66 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,6 @@ sudo: false language: android -jdk: - - oraclejdk8 +jdk: oraclejdk8 # http://docs.travis-ci.com/user/languages/android/ android: @@ -12,7 +11,6 @@ android: - extra-android-m2repository before_script: - - chmod +x gradlew # - echo no | android create avd --force -n test -t android-10 --abi armeabi # - emulator -avd test -no-skin -no-audio -no-window & # - android-wait-for-emulator diff --git a/build.gradle b/build.gradle index 9c519b5c..9ef8087f 100644 --- a/build.gradle +++ b/build.gradle @@ -7,5 +7,5 @@ if (JavaVersion.current().isJava8Compatible()) { } task wrapper(type: Wrapper) { - gradleVersion = '2.14.1' + gradleVersion = '3.3' } From f6f842bb40a8a8327192a2557e5b095a8b95c191 Mon Sep 17 00:00:00 2001 From: Mohammad Yasir Date: Thu, 13 Apr 2017 02:00:09 +0530 Subject: [PATCH 14/14] Removing bad merge --- build.gradle | 1 - 1 file changed, 1 deletion(-) diff --git a/build.gradle b/build.gradle index 8e42da67..958c35ba 100644 --- a/build.gradle +++ b/build.gradle @@ -7,6 +7,5 @@ if (JavaVersion.current().isJava8Compatible()) { } task wrapper(type: Wrapper) { - gradleVersion = '3.3' gradleVersion = '3.4.1' }