package net.i2p.android.router.service; import com.androidplot.xy.SimpleXYSeries; import com.androidplot.xy.XYSeries; import net.i2p.I2PAppContext; import net.i2p.stat.Rate; import net.i2p.stat.RateStat; import net.i2p.stat.RateSummaryListener; import java.util.Observable; import java.util.Observer; public class SummaryListener implements RateSummaryListener { public static final int HISTORY_SIZE = 30; private final I2PAppContext _context; private final Rate _rate; private String _name; private SimpleXYSeries _series; private MyObservable _notifier; public SummaryListener(Rate r) { _context = I2PAppContext.getGlobalContext(); _rate = r; _notifier = new MyObservable(); } // encapsulates management of the observers watching this rate for update events: class MyObservable extends Observable { @Override public void notifyObservers() { setChanged(); super.notifyObservers(); } } public void addObserver(Observer observer) { _notifier.addObserver(observer); } public void removeObserver(Observer observer) { _notifier.deleteObserver(observer); } public void add(double totalValue, long eventCount, double totalEventTime, long period) { long when = now(); double val = eventCount > 0 ? (totalValue / eventCount) : 0d; if (_series.size() > HISTORY_SIZE) _series.removeFirst(); _series.addLast(when, val); _notifier.notifyObservers(); } public Rate getRate() { return _rate; } public String getName() { return _name; } public XYSeries getSeries() { return _series; } long now() { return _context.clock().now(); } public void startListening() { RateStat rs = _rate.getRateStat(); long period = _rate.getPeriod(); _name = rs.getName() + "." + period; _series = new SimpleXYSeries(_name); _rate.setSummaryListener(this); } public void stopListening() { _rate.setSummaryListener(null); } }