package com.zachklipp.captivate.test.service;
import java.util.ArrayList;
import com.zachklipp.captivate.service.PortalDetectorService;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
// Thread-safe
class MockBroadcastReceiver extends BroadcastReceiver
{
private static final String LOG_TAG = "captivate-tests";
private ArrayList<Intent> mReceivedIntents = new ArrayList<Intent>();
// Return true if expectedCount intents were received before timeoutMillis,
// else false.
public boolean waitForIntents(final int expectedCount, final long timeoutMillis)
{
int actualCount;
final long startTime = System.currentTimeMillis();
synchronized(mReceivedIntents)
{
actualCount = mReceivedIntents.size();
}
while (actualCount < expectedCount && System.currentTimeMillis() - startTime < timeoutMillis)
{
synchronized(mReceivedIntents)
{
Log.d(LOG_TAG, "Waiting for intent in thread " + Thread.currentThread().getName());
try
{
mReceivedIntents.wait(startTime + timeoutMillis - System.currentTimeMillis());
Log.d(LOG_TAG, "Received an intent while waiting! now have " + mReceivedIntents.size());
}
catch (InterruptedException e)
{
Log.d(LOG_TAG, "Interrupted while waiting for intents!");
}
actualCount = mReceivedIntents.size();
}
}
Log.d(LOG_TAG, String.format("Done waiting for intents: expected %d got %d", expectedCount, actualCount));
return (actualCount == expectedCount);
}
public Intent[] getReceivedIntentsAndClear()
{
Intent[] intents;
synchronized(mReceivedIntents)
{
intents = new Intent[mReceivedIntents.size()];
mReceivedIntents.toArray(intents);
mReceivedIntents.clear();
}
return intents;
}
@Override
public void onReceive(Context context, Intent intent)
{
StringBuilder message = new StringBuilder(String.format("Received intent: %s", intent.getAction()));
if (PortalDetectorService.ACTION_PORTAL_STATE_CHANGED.equals(intent.getAction()))
{
message.append(String.format(" new state=%s, portal=%s",
intent.getStringExtra(PortalDetectorService.EXTRA_PORTAL_STATE),
intent.getStringExtra(PortalDetectorService.EXTRA_PORTAL_URL)));
}
Log.d(LOG_TAG, message.toString());
synchronized(mReceivedIntents)
{
mReceivedIntents.add(intent);
mReceivedIntents.notify();
}
}
}