package cn.mutils.app.io;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import cn.mutils.core.reflect.ReflectUtil;
@SuppressWarnings({"unchecked", "UnnecessaryInterfaceModifier"})
public class AppBroadcast<EXTRA extends Extra> implements IBroadcast {
public static interface OnReceiveListener<EXTRA extends Extra> {
public void onReceive(AppBroadcast<EXTRA> broadcast, EXTRA extra);
}
protected String mAction;
protected Context mContext;
protected boolean mStopped;
protected OnReceiveListener<EXTRA> mOnReceiveListener;
protected AppBroadcastReceiver mReceiver;
public AppBroadcast(Context context) {
mContext = context;
mStopped = true;
}
public String getAction() {
return mAction;
}
public void setAction(String action) {
mAction = action;
if (this.stop()) {
this.start();
}
}
@Override
public boolean isLocked() {
return true;
}
@Override
public void setLocked(boolean locked) {
}
@Override
public boolean isRunInBackground() {
return true;
}
@Override
public void setRunInBackground(boolean runInBackground) {
}
@Override
public boolean isStopped() {
return mStopped;
}
@Override
public boolean stop() {
if (mStopped) {
return false;
}
mStopped = true;
mContext.unregisterReceiver(mReceiver);
return true;
}
public AppBroadcast<EXTRA> start() {
this.stop();
if (mReceiver == null) {
mReceiver = new AppBroadcastReceiver();
}
IntentFilter filter = new IntentFilter();
filter.addAction(mAction);
mContext.registerReceiver(mReceiver, filter);
mStopped = false;
return this;
}
public void send(EXTRA extra) {
Intent intent = new Intent();
intent.setAction(mAction);
if (extra.putTo(intent)) {
mContext.sendBroadcast(intent);
}
}
@Override
public Context getContext() {
return mContext;
}
@Override
public void setContext(Context context) {
}
public void setOnReceiveListener(OnReceiveListener<EXTRA> listener) {
mOnReceiveListener = listener;
}
class AppBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (mOnReceiveListener != null) {
try {
Class<EXTRA> extraClass = (Class<EXTRA>) ReflectUtil
.getParamRawType(AppBroadcast.this.getClass(), 0);
EXTRA extra = extraClass.newInstance();
if (extra.getFrom(intent)) {
mOnReceiveListener.onReceive(AppBroadcast.this, extra);
}
} catch (Exception e) {
// Exception
}
}
}
}
}