package com.v7lin.style.event;
import java.util.concurrent.atomic.AtomicBoolean;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v4.content.LocalBroadcastManager;
import android.text.TextUtils;
/**
*
*
* @author v7lin E-mail:v7lin@qq.com
*/
class EventSession implements EventConst {
final String mEventKey;
final EventMode mMode;
final EventReceiver mReceiver;
final String[] mActions;
BroadcastReceiver mBroadcastReceiver;
IntentFilter mIntentFilter;
final AtomicBoolean mRegister = new AtomicBoolean(false);
EventSession(String eventKey, EventMode mode, EventReceiver receiver, String... actions) {
super();
mEventKey = eventKey;
mMode = mode;
mReceiver = receiver;
mActions = actions;
ensureBroadcastReceiver();
ensureIntentFilter();
}
void ensureBroadcastReceiver() {
if (mBroadcastReceiver == null) {
mBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
mReceiver.onEvent(intent.getAction(), intent.getBundleExtra(KEY_BUNDLE_EVENT));
}
};
}
}
public void ensureIntentFilter() {
if (mIntentFilter == null) {
mIntentFilter = new IntentFilter();
final int len = mActions != null ? mActions.length : 0;
for (int i = 0; i < len; i ++) {
mIntentFilter.addAction(mActions[i]);
}
}
}
void registerReceiver(Context context, EventFilter filter, boolean isLocal) {
if (filter == null || filter.accept(mMode)) {
if (mRegister.compareAndSet(false, true)) {
if (isLocal) {
LocalBroadcastManager.getInstance(context).registerReceiver(mBroadcastReceiver, mIntentFilter);
} else {
context.registerReceiver(mBroadcastReceiver, mIntentFilter);
}
}
}
}
void unregisterReceiver(Context context, EventFilter filter, boolean isLocal) {
if (filter == null || filter.accept(mMode)) {
if (mRegister.compareAndSet(true, false)) {
if (isLocal) {
LocalBroadcastManager.getInstance(context).unregisterReceiver(mBroadcastReceiver);
} else {
context.unregisterReceiver(mBroadcastReceiver);
}
}
}
}
@Override
public int hashCode() {
return !TextUtils.isEmpty(mEventKey) ? mEventKey.hashCode() : "null".hashCode();// super.hashCode();
}
@Override
public boolean equals(Object o) {
boolean result = super.equals(o);
if (!result) {
if (o != null && o instanceof EventSession) {
EventSession other = (EventSession) o;
result = TextUtils.equals(mEventKey, other.mEventKey);
}
}
return result;
}
}