Skip to content
This repository was archived by the owner on Feb 26, 2023. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
fix receiver registered at onAttach
  • Loading branch information
dodgex committed Jan 24, 2015
commit a123470788c21ac3c85c320f2b15f23277ee1734
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
import org.androidannotations.helper.APTCodeModelHelper;
import org.androidannotations.helper.ModelConstants;
import org.androidannotations.holder.HasReceiverRegistration;
import org.androidannotations.holder.ReceiverRegistrationHolder.IntentFilterData;
import org.androidannotations.model.AnnotationElements;
import org.androidannotations.process.IsValid;

Expand Down Expand Up @@ -89,7 +90,7 @@ public void process(Element element, HasReceiverRegistration holder) throws Exce
Receiver.RegisterAt registerAt = annotation.registerAt();
boolean local = annotation.local();

JFieldVar intentFilterField = holder.getIntentFilterField(actions, dataSchemes);
JFieldVar intentFilterField = holder.getIntentFilterField(new IntentFilterData(actions, dataSchemes, registerAt));
JFieldVar receiverField = createReceiverField(holder, receiverName, methodName, (ExecutableElement) element);
registerAndUnregisterReceiver(holder, registerAt, intentFilterField, receiverField, local);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@
import org.androidannotations.helper.CanonicalNameConstants;
import org.androidannotations.helper.IntentBuilder;
import org.androidannotations.helper.OrmLiteHelper;
import org.androidannotations.holder.ReceiverRegistrationHolder.IntentFilterData;
import org.androidannotations.process.ProcessHolder;

import com.sun.codemodel.JBlock;
Expand Down Expand Up @@ -74,7 +75,7 @@ public class EActivityHolder extends EComponentWithViewSupportHolder implements
private JDefinedClass intentBuilderClass;
private InstanceStateHolder instanceStateHolder;
private OnActivityResultHolder onActivityResultHolder;
private ReceiverRegistrationHolder receiverRegistrationHolder;
private ReceiverRegistrationHolder<EActivityHolder> receiverRegistrationHolder;
private RoboGuiceHolder roboGuiceHolder;
private JMethod injectExtrasMethod;
private JBlock injectExtrasBlock;
Expand Down Expand Up @@ -102,7 +103,7 @@ public EActivityHolder(ProcessHolder processHolder, TypeElement annotatedElement
super(processHolder, annotatedElement);
instanceStateHolder = new InstanceStateHolder(this);
onActivityResultHolder = new OnActivityResultHolder(this);
receiverRegistrationHolder = new ReceiverRegistrationHolder(this);
receiverRegistrationHolder = new ReceiverRegistrationHolder<EActivityHolder>(this);
setSetContentView();
intentBuilder = new ActivityIntentBuilder(this, androidManifest);
intentBuilder.build();
Expand Down Expand Up @@ -758,8 +759,13 @@ public JBlock getOnDetachBeforeSuperBlock() {
}

@Override
public JFieldVar getIntentFilterField(String[] actions, String[] dataSchemes) {
return receiverRegistrationHolder.getIntentFilterField(actions, dataSchemes);
public JFieldVar getIntentFilterField(IntentFilterData intentFilterData) {
return receiverRegistrationHolder.getIntentFilterField(intentFilterData);
}

@Override
public JBlock getIntentFilterInitializationBlock(IntentFilterData intentFilterData) {
return getInitBody();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,11 @@
import javax.lang.model.type.TypeMirror;

import org.androidannotations.annotations.EFragment;
import org.androidannotations.annotations.Receiver.RegisterAt;
import org.androidannotations.helper.ActionBarSherlockHelper;
import org.androidannotations.helper.AnnotationHelper;
import org.androidannotations.helper.OrmLiteHelper;
import org.androidannotations.holder.ReceiverRegistrationHolder.IntentFilterData;
import org.androidannotations.process.ProcessHolder;

import com.sun.codemodel.JBlock;
Expand Down Expand Up @@ -65,7 +67,7 @@ public class EFragmentHolder extends EComponentWithViewSupportHolder implements
private JVar injectBundleArgs;
private InstanceStateHolder instanceStateHolder;
private OnActivityResultHolder onActivityResultHolder;
private ReceiverRegistrationHolder receiverRegistrationHolder;
private ReceiverRegistrationHolder<EFragmentHolder> receiverRegistrationHolder;
private JBlock onCreateOptionsMenuMethodBody;
private JVar onCreateOptionsMenuMenuInflaterVar;
private JVar onCreateOptionsMenuMenuParam;
Expand All @@ -85,7 +87,7 @@ public EFragmentHolder(ProcessHolder processHolder, TypeElement annotatedElement
super(processHolder, annotatedElement);
instanceStateHolder = new InstanceStateHolder(this);
onActivityResultHolder = new OnActivityResultHolder(this);
receiverRegistrationHolder = new ReceiverRegistrationHolder(this);
receiverRegistrationHolder = new ReceiverRegistrationHolder<EFragmentHolder>(this);
setOnCreate();
setOnViewCreated();
setFragmentBuilder();
Expand Down Expand Up @@ -478,8 +480,8 @@ public JMethod getOnActivityResultMethod() {
}

@Override
public JFieldVar getIntentFilterField(String[] actions, String[] dataSchemes) {
return receiverRegistrationHolder.getIntentFilterField(actions, dataSchemes);
public JFieldVar getIntentFilterField(IntentFilterData intentFilterData) {
return receiverRegistrationHolder.getIntentFilterField(intentFilterData);
}

@Override
Expand Down Expand Up @@ -546,6 +548,14 @@ public JBlock getOnDetachBeforeSuperBlock() {
return onDetachBeforeSuperBlock;
}

@Override
public JBlock getIntentFilterInitializationBlock(IntentFilterData intentFilterData) {
if (RegisterAt.OnAttachOnDetach.equals(intentFilterData.getRegisterAt())) {
return getOnAttachAfterSuperBlock();
}
return getInitBody();
}

@Override
protected JFieldVar setDatabaseHelperRef(TypeMirror databaseHelperTypeMirror) {
JFieldVar databaseHelperRef = super.setDatabaseHelperRef(databaseHelperTypeMirror);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,30 +20,31 @@
import static com.sun.codemodel.JMod.PUBLIC;

import javax.lang.model.element.TypeElement;
import javax.lang.model.type.TypeMirror;

import org.androidannotations.helper.AndroidManifest;
import org.androidannotations.helper.IntentBuilder;
import org.androidannotations.helper.OrmLiteHelper;
import org.androidannotations.helper.ServiceIntentBuilder;
import org.androidannotations.holder.ReceiverRegistrationHolder.IntentFilterData;
import org.androidannotations.process.ProcessHolder;

import com.sun.codemodel.JBlock;
import com.sun.codemodel.JDefinedClass;
import com.sun.codemodel.JExpr;
import com.sun.codemodel.JFieldVar;
import com.sun.codemodel.JMethod;
import javax.lang.model.type.TypeMirror;

public class EServiceHolder extends EComponentHolder implements HasIntentBuilder, HasReceiverRegistration {

private ServiceIntentBuilder intentBuilder;
private JDefinedClass intentBuilderClass;
private ReceiverRegistrationHolder receiverRegistrationHolder;
private ReceiverRegistrationHolder<EServiceHolder> receiverRegistrationHolder;
private JBlock onDestroyBeforeSuperBlock;

public EServiceHolder(ProcessHolder processHolder, TypeElement annotatedElement, AndroidManifest androidManifest) throws Exception {
super(processHolder, annotatedElement);
receiverRegistrationHolder = new ReceiverRegistrationHolder(this);
receiverRegistrationHolder = new ReceiverRegistrationHolder<EServiceHolder>(this);
intentBuilder = new ServiceIntentBuilder(this, androidManifest);
intentBuilder.build();
}
Expand Down Expand Up @@ -91,8 +92,13 @@ public JDefinedClass getIntentBuilderClass() {
}

@Override
public JFieldVar getIntentFilterField(String[] actions, String[] dataSchemes) {
return receiverRegistrationHolder.getIntentFilterField(actions, dataSchemes);
public JFieldVar getIntentFilterField(IntentFilterData intentFilterData) {
return receiverRegistrationHolder.getIntentFilterField(intentFilterData);
}

@Override
public JBlock getIntentFilterInitializationBlock(IntentFilterData intentFilterData) {
return getInitBody();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,17 @@
*/
package org.androidannotations.holder;

import org.androidannotations.holder.ReceiverRegistrationHolder.IntentFilterData;

import com.sun.codemodel.JBlock;
import com.sun.codemodel.JExpression;
import com.sun.codemodel.JFieldVar;

public interface HasReceiverRegistration extends HasLifecycleMethods {

JExpression getContextRef();

JFieldVar getIntentFilterField(String[] actions, String[] dataSchemas);
JFieldVar getIntentFilterField(IntentFilterData intentFilterData);

JBlock getIntentFilterInitializationBlock(IntentFilterData intentFilterData);
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import java.util.Map;
import java.util.Set;

import org.androidannotations.annotations.Receiver.RegisterAt;
import org.androidannotations.helper.ModelConstants;
import org.androidannotations.process.ProcessHolder;

Expand All @@ -33,18 +34,17 @@
import com.sun.codemodel.JExpression;
import com.sun.codemodel.JFieldVar;

public class ReceiverRegistrationHolder {
public class ReceiverRegistrationHolder<T extends EComponentHolder & HasReceiverRegistration> {

private EComponentHolder holder;
private T holder;
private Map<IntentFilterData, JFieldVar> intentFilterFields = new HashMap<IntentFilterData, JFieldVar>();
private IllegalStateException illegalStateException = new IllegalStateException("This shouldn't happen unless the validation is bad");

public ReceiverRegistrationHolder(EComponentHolder holder) {
public ReceiverRegistrationHolder(T holder) {
this.holder = holder;
}

public JFieldVar getIntentFilterField(String[] actions, String[] dataSchemes) {
IntentFilterData intentFilterData = new IntentFilterData(actions, dataSchemes);
public JFieldVar getIntentFilterField(IntentFilterData intentFilterData) {
JFieldVar intentFilterField = intentFilterFields.get(intentFilterData);
if (intentFilterField == null) {
intentFilterField = createIntentFilterField(intentFilterData);
Expand All @@ -58,12 +58,12 @@ private JFieldVar createIntentFilterField(IntentFilterData intentFilterData) {
JExpression newIntentFilterExpr = _new(classes().INTENT_FILTER);
JFieldVar intentFilterField = getGeneratedClass().field(PRIVATE | FINAL, classes().INTENT_FILTER, intentFilterName, newIntentFilterExpr);

JBlock initBody = holder.getInitBody();
JBlock intentFilterTarget = holder.getIntentFilterInitializationBlock(intentFilterData);
for (String action : intentFilterData.getActionSet()) {
initBody.invoke(intentFilterField, "addAction").arg(action);
intentFilterTarget.invoke(intentFilterField, "addAction").arg(action);
}
for (String dataScheme : intentFilterData.getDataSchemeSet()) {
initBody.invoke(intentFilterField, "addDataScheme").arg(dataScheme);
intentFilterTarget.invoke(intentFilterField, "addDataScheme").arg(dataScheme);
}

return intentFilterField;
Expand Down Expand Up @@ -97,16 +97,22 @@ public ProcessHolder.Classes classes() {
return holder.classes();
}

private static class IntentFilterData {
public static class IntentFilterData {

private final RegisterAt registerAt;
private final Set<String> actionSet;
private final Set<String> dataSchemeSet;

public IntentFilterData(String[] actions, String[] dataSchemes) {
public IntentFilterData(String[] actions, String[] dataSchemes, RegisterAt registerAt) {
this.registerAt = registerAt;
actionSet = new HashSet<String>(Arrays.asList(actions));
dataSchemeSet = new HashSet<String>(Arrays.asList(dataSchemes));
}

public RegisterAt getRegisterAt() {
return registerAt;
}

public Set<String> getActionSet() {
return actionSet;
}
Expand All @@ -120,6 +126,7 @@ public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + (actionSet == null ? 0 : actionSet.hashCode());
result = prime * result + (registerAt == null ? 0 : registerAt.hashCode());
result = prime * result + (dataSchemeSet == null ? 0 : dataSchemeSet.hashCode());
return result;
}
Expand All @@ -143,6 +150,13 @@ public boolean equals(Object obj) {
} else if (!actionSet.equals(other.actionSet)) {
return false;
}
if (registerAt == null) {
if (other.registerAt != null) {
return false;
}
} else if (!registerAt.equals(other.registerAt)) {
return false;
}
if (dataSchemeSet == null) {
if (other.dataSchemeSet != null) {
return false;
Expand Down