package com.android.launcher;
import java.util.ArrayList;
import java.util.HashMap;
import org.xmlpull.v1.XmlPullParser;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
/**
* @author AnderWeb
*
*/
public class CounterReceiver extends BroadcastReceiver {
private HashMap<String, FilterData> mReceiverFilter;
private OnCounterChangedListener mListener;
public CounterReceiver(Context context) {
mReceiverFilter=new HashMap<String, FilterData>();
parseFilters(context);
}
public void setCounterListener(OnCounterChangedListener l){
mListener=l;
}
public IntentFilter getFilter(){
IntentFilter tmp=new IntentFilter();
for(String key : mReceiverFilter.keySet()){
tmp.addAction(key);
}
return tmp;
}
@Override
public void onReceive(Context context, Intent intent) {
FilterData tmp=mReceiverFilter.get(intent.getAction());
if(tmp!=null){
int counter=0;
int color=0xFFFF0000;
String packagename=tmp.pname;
for(String extra:tmp.extras){
if("PNAME".equals(extra)){
packagename=intent.getStringExtra(extra);
}else if("COLOR".equals(extra)){
color=intent.getIntExtra(extra, color);
}else{
counter+=intent.getIntExtra(extra, 0);
}
}
if(mListener!=null){
mListener.onTrigger(packagename, counter, color);
}
}
}
private void parseFilters(Context context) {
XmlPullParser parser = context.getResources().getXml(R.xml.counter_filter);
try {
// auto-detect the encoding from the stream
int eventType = parser.getEventType();
FilterData currentItem = null;
boolean done = false;
while (eventType != XmlPullParser.END_DOCUMENT && !done){
String name = null;
switch (eventType){
case XmlPullParser.START_DOCUMENT:
break;
case XmlPullParser.START_TAG:
name = parser.getName();
if (name.equalsIgnoreCase("counter")){
currentItem = new FilterData();
//get attributes:
currentItem.action=parser.getAttributeValue(null, "action");
currentItem.pname=parser.getAttributeValue(null, "package");
currentItem.extras=new ArrayList<String>();
} else if (currentItem != null){
if (name.equalsIgnoreCase("extra")){
currentItem.extras.add(parser.nextText());
}
}
break;
case XmlPullParser.END_TAG:
name = parser.getName();
if (name.equalsIgnoreCase("counter") && currentItem != null){
mReceiverFilter.put(currentItem.action,currentItem);
} else if (name.equalsIgnoreCase("counters")){
done = true;
}
break;
}
eventType = parser.next();
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private class FilterData{
protected String action;
protected String pname;
protected ArrayList<String> extras;
}
/**
* Interface definition for a callback to be invoked when a update
* is required
*/
public interface OnCounterChangedListener {
void onTrigger(String pname, int counter, int color);
}
}