package com.youplayer.player.fullplayer;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import java.util.Vector;
import com.youplayer.util.LOG;
public abstract class YouPlayerEventFilter {
public static final int EVENT_ALL = -1;
List<Integer> filters = new Vector();
HashMap<Integer,Integer> unfilters = new HashMap();
public void addFilter(int filter_event,int unfilter_event){
if( !filters.contains(filter_event) ){
filters.add(filter_event);
unfilters.put(unfilter_event, filter_event);
}
}
public void removeAll(){
filters.clear();
for (TimerData data :timer_policys.values()) {
if( data.task != null ){
data.task.cancel();
data.task = null;
}
}
}
public final boolean filter(int eventid){
if( filters.contains(EVENT_ALL)|| filters.contains(eventid) ){
LOG.v("PlayerAdapter", "EventFilter", "filter event id:"+eventid);
return true;
}
if( unfilters.containsKey(eventid) ){
filters.remove(unfilters.get(eventid));
unfilters.remove(eventid);
//return false;
}
if( policies.containsKey(eventid) ){
String filterstr = policies.get(eventid);
LOG.v("PlayerAdapter", "EventFilter", "contains policy:"+eventid+"_"+filterstr);
int fe = Integer.parseInt( filterstr.substring(0,filterstr.indexOf('_')) );
int ufe = Integer.parseInt( filterstr.substring(filterstr.indexOf('_')+1) );
addFilter(fe,ufe);
}
for (TimerData data :timer_policys.values()) {
if( data.isCancelEvent(eventid) ){
LOG.v("PlayerAdapter", "EventFilter", "cancel timer:" + eventid);
cancelTimer(data.on_event);
}
}
if( timer_policys.containsKey(eventid) ){
LOG.v("PlayerAdapter", "EventFilter", "create timer id:" + eventid);
final TimerData td = timer_policys.get(eventid);
TimerTask task = new TimerTask(){
@Override
public void run() {
synchronized (timer_policys) {
if( !filter( td.event ) )
sendEvent(td);
}
}
};
timer.schedule(task,td.delay);
td.task = task;
}
return false;
}
HashMap<Integer,String> policies = new HashMap();
public void addPolicy(int on_event,int filter_event,int unfilter_event){
policies.put(on_event,filter_event+"_"+unfilter_event);
}
Timer timer = new Timer();
HashMap<Integer,TimerData> timer_policys = new HashMap();
public void addTimerPolicy(final int on_event,long delay,final int send_event,final Object send_arg,int[] cancel_events ){
Arrays.sort(cancel_events);
TimerData td = new TimerData(on_event,delay,send_event,send_arg,cancel_events);
timer_policys.put(on_event,td);
}
public abstract void sendEvent(TimerData data);
public void cancelTimer(int on_event){
synchronized (timer_policys) {
if( timer_policys.containsKey(on_event) ){
if(timer_policys.get(on_event).task != null){
LOG.v("PlayerAdapter", "EventFilter", "cancelTimer task:" + on_event);
timer_policys.get(on_event).task.cancel();
timer_policys.get(on_event).task = null;
}
}
}
}
public void cancelTimer(){
timer.cancel();
}
}
class TimerData{
int on_event;
long delay;
int event;
Object arg;
int[] cancel_events;
TimerTask task;
public TimerData(int on_event,long delay,int event,Object arg,int[] cancel_events){
this.on_event = on_event;
this.delay = delay;
this.event = event;
this.arg = arg;
this.cancel_events = cancel_events;
}
public boolean isCancelEvent(int event){
return (cancel_events != null
&& cancel_events.length > 0
&&( cancel_events[0] == YouPlayerEventFilter.EVENT_ALL || (java.util.Arrays.binarySearch(cancel_events,event) > -1)));
}
}