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 all commits
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
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,8 @@

String[] actions();

String[] dataSchemes() default {};

RegisterAt registerAt() default RegisterAt.OnCreateOnDestroy;

boolean local() default false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,10 +63,11 @@ public void process(Element element, HasReceiverRegistration holder) throws Exce

Receiver annotation = element.getAnnotation(Receiver.class);
String[] actions = annotation.actions();
String[] dataSchemes = annotation.dataSchemes();
Receiver.RegisterAt registerAt = annotation.registerAt();
boolean local = annotation.local();

JFieldVar intentFilterField = holder.getIntentFilterField(actions);
JFieldVar intentFilterField = holder.getIntentFilterField(actions, dataSchemes);
JFieldVar receiverField = createReceiverField(holder, receiverName, methodName, hasIntentParam);
registerAndUnregisterReceiver(holder, registerAt, intentFilterField, receiverField, local);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -723,8 +723,8 @@ public JBlock getOnDetachBeforeSuperBlock() {
}

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

}
Original file line number Diff line number Diff line change
Expand Up @@ -436,8 +436,8 @@ public JVar getOnActivityResultResultCodeParam() {
}

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

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,8 +84,8 @@ public JDefinedClass getIntentBuilderClass() {
}

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

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@
public interface HasReceiverRegistration extends GeneratedClassHolder {

JExpression getContextRef();
JFieldVar getIntentFilterField(String[] actions);

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

JBlock getOnCreateAfterSuperBlock();
JBlock getOnDestroyBeforeSuperBlock();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,33 +28,35 @@
public class ReceiverRegistrationHolder {

private EComponentHolder holder;
private Map<Set<String>, JFieldVar> intentFilterFields = new HashMap<Set<String>, JFieldVar>();
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) {
this.holder = holder;
}

public JFieldVar getIntentFilterField(String[] actions) {
Arrays.sort(actions);
Set<String> actionSet = new HashSet<String>(Arrays.asList(actions));
JFieldVar intentFilterField = intentFilterFields.get(actionSet);
public JFieldVar getIntentFilterField(String[] actions, String[] dataSchemes) {
IntentFilterData intentFilterData = new IntentFilterData(actions, dataSchemes);
JFieldVar intentFilterField = intentFilterFields.get(intentFilterData);
if (intentFilterField == null) {
intentFilterField = createIntentFilterField(actionSet);
intentFilterFields.put(actionSet, intentFilterField);
intentFilterField = createIntentFilterField(intentFilterData);
intentFilterFields.put(intentFilterData, intentFilterField);
}
return intentFilterField;
}

private JFieldVar createIntentFilterField(Set<String> actionSet) {
String intentFilterName = "intentFilter"+(intentFilterFields.size()+1)+ ModelConstants.GENERATION_SUFFIX;
private JFieldVar createIntentFilterField(IntentFilterData intentFilterData) {
String intentFilterName = "intentFilter" + (intentFilterFields.size() + 1) + ModelConstants.GENERATION_SUFFIX;
JExpression newIntentFilterExpr = _new(classes().INTENT_FILTER);
JFieldVar intentFilterField = getGeneratedClass().field(PRIVATE | FINAL, classes().INTENT_FILTER, intentFilterName, newIntentFilterExpr);

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

return intentFilterField;
}
Expand Down Expand Up @@ -86,4 +88,61 @@ public JDefinedClass getGeneratedClass() {
public ProcessHolder.Classes classes() {
return holder.classes();
}

private static class IntentFilterData {

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

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

public Set<String> getActionSet() {
return actionSet;
}

public Set<String> getDataSchemeSet() {
return dataSchemeSet;
}

@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + (actionSet == null ? 0 : actionSet.hashCode());
result = prime * result + (dataSchemeSet == null ? 0 : dataSchemeSet.hashCode());
return result;
}

@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
IntentFilterData other = (IntentFilterData) obj;
if (actionSet == null) {
if (other.actionSet != null) {
return false;
}
} else if (!actionSet.equals(other.actionSet)) {
return false;
}
if (dataSchemeSet == null) {
if (other.dataSchemeSet != null) {
return false;
}
} else if (!dataSchemeSet.equals(other.dataSchemeSet)) {
return false;
}
return true;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
package org.androidannotations.test15.receiver;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricTestRunner;

import android.content.Intent;
import android.net.Uri;
import android.net.wifi.WifiManager;
import android.support.v4.content.LocalBroadcastManager;

@RunWith(RobolectricTestRunner.class)
public class ActivityWithReceiverTest {

private ActivityWithReceiver_ activity;

@Before
public void setup() {
activity = Robolectric.buildActivity(ActivityWithReceiver_.class)
.create().start().resume().get();
}

@Test
public void onWifiStateChangedTest() {
Intent intent = new Intent(WifiManager.NETWORK_STATE_CHANGED_ACTION);
activity.sendBroadcast(intent);

assertTrue(activity.wifiChangeIntentReceived);
}

@Test
public void onLocalWifiStateChangedTest() {
Intent intent = new Intent(WifiManager.NETWORK_STATE_CHANGED_ACTION);

LocalBroadcastManager.getInstance(Robolectric.application)
.sendBroadcast(intent);

assertTrue(activity.localWifiChangeIntentReceived);
}

// @Test
// due to a bug in robolectric this test does not yet work
// see https://github.com/robolectric/robolectric/issues/1244
public void onDataShemeHttpTest() {
Intent intentFtp = new Intent("CUSTOM_HTTP_ACTION");
intentFtp.setData(Uri.parse("ftp://androidannotations.org"));
activity.sendBroadcast(intentFtp);

assertFalse(activity.dataSchemeHttpIntentReceived);

Intent intentHttp = new Intent("CUSTOM_HTTP_ACTION");
intentHttp.setData(Uri.parse("http://androidannotations.org"));
activity.sendBroadcast(intentHttp);

assertTrue(activity.dataSchemeHttpIntentReceived);
}

@Test
public void onBroadcastWithTwoActionsTest() {
Intent intent1 = new Intent("org.androidannotations.ACTION_1");
Intent intent2 = new Intent("org.androidannotations.ACTION_2");

assertFalse(activity.action1Fired);
assertFalse(activity.action2Fired);

activity.sendBroadcast(intent1);
assertTrue(activity.action1Fired);
assertFalse(activity.action2Fired);

activity.sendBroadcast(intent2);
assertTrue(activity.action1Fired);
assertTrue(activity.action2Fired);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -18,26 +18,42 @@
import android.app.Activity;
import android.content.Intent;
import android.net.wifi.WifiManager;

import org.androidannotations.annotations.EActivity;
import org.androidannotations.annotations.Receiver;

@EActivity
public class ActivityWithReceiver extends Activity {

public boolean localWifiChangeIntentReceived = false;
public boolean dataSchemeHttpIntentReceived = false;
public boolean wifiChangeIntentReceived = false;
public boolean action1Fired = false;
public boolean action2Fired = false;

@Receiver(actions = WifiManager.NETWORK_STATE_CHANGED_ACTION, registerAt = Receiver.RegisterAt.OnResumeOnPause)
protected void onWifiStateChanged(Intent intent) {

wifiChangeIntentReceived = true;
}

@Receiver(actions = WifiManager.NETWORK_STATE_CHANGED_ACTION, registerAt = Receiver.RegisterAt.OnStartOnStop, local = true)
protected void onWifiStateChangedWithSameActions() {
protected void onLocalWifiStateChanged() {
localWifiChangeIntentReceived = true;
}

@Receiver(actions = "CUSTOM_HTTP_ACTION", dataSchemes = "http", registerAt = Receiver.RegisterAt.OnCreateOnDestroy)
protected void onDataShemeHttp(Intent intent) {
dataSchemeHttpIntentReceived = true;
}

@Receiver(actions = {"org.androidannotations.ACTION_1", "org.androidannotations.ACTION_2"},
registerAt = Receiver.RegisterAt.OnCreateOnDestroy)
@Receiver(actions = { "org.androidannotations.ACTION_1",
"org.androidannotations.ACTION_2" }, registerAt = Receiver.RegisterAt.OnCreateOnDestroy)
protected void onBroadcastWithTwoActions(Intent intent) {

String action = intent.getAction();
if (action.equals("org.androidannotations.ACTION_1")) {
action1Fired = true;
} else if (action.equals("org.androidannotations.ACTION_2")) {
action2Fired = true;
}
}

}