package com.num.tasks;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import org.json.JSONObject;
import android.content.Context;
import android.location.Location;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import com.num.Values;
import com.num.database.datasource.LatencyDataSource;
import com.num.helpers.MeasurementHelper;
import com.num.helpers.ThreadPoolHelper;
import com.num.listeners.BaseResponseListener;
import com.num.listeners.FakeListener;
import com.num.listeners.ResponseListener;
import com.num.models.Address;
import com.num.models.Battery;
import com.num.models.ClientLog;
import com.num.models.Device;
import com.num.models.GPS;
import com.num.models.LastMile;
import com.num.models.Link;
import com.num.models.Loss;
import com.num.models.Measurement;
import com.num.models.Network;
import com.num.models.Ping;
import com.num.models.Screen;
import com.num.models.Sim;
import com.num.models.Throughput;
import com.num.models.Traceroute;
import com.num.models.TracerouteEntry;
import com.num.models.Usage;
import com.num.models.WarmupExperiment;
import com.num.models.Wifi;
import com.num.utils.GPSUtil;
import com.num.utils.GPSUtil.LocationResult;
import com.num.utils.SignalUtil;
import com.num.utils.SignalUtil.SignalResult;
/*
* Measurement Task
* set tasks to run and give ip address to ping and more
*
* Call another task to backend
*
*
*/
public class MeasurementTask extends ServerTask {
ThreadPoolHelper serverhelper;
Values session;
MeasurementListener listener;
Throughput throughput;
LatencyDataSource dataSource = new LatencyDataSource(getContext());
Measurement measurement;
ArrayList<Ping> pings = new ArrayList<Ping>();
ArrayList<LastMile> lastMiles = new ArrayList<LastMile>();
public MeasurementTask(Context context, Throughput throughput,
boolean isManual, ResponseListener listener) {
super(context, new HashMap<String, String>(), listener);
measurement = new Measurement();
measurement.setManual(isManual);
this.listener = new MeasurementListener();
session = this.getValues();
serverhelper = new ThreadPoolHelper(session.THREADPOOL_MAX_SIZE,
session.THREADPOOL_KEEPALIVE_SEC);
this.throughput = throughput;
}
public void killAll() {
try {
serverhelper.shutdown();
} catch (Exception e) {
ClientLog.log(getContext(), e, toString());
}
}
public void runTask() {
ArrayList<Address> dsts = session.getPingServers(getContext());
Calendar calendar = Calendar.getInstance();
if(throughput!=null)
listener.onCompleteThroughput(throughput);
serverhelper.execute(new WarmupSequenceTask(getContext(), listener));
serverhelper.execute(new DeviceTask(getContext(),
new HashMap<String, String>(), listener, measurement));
serverhelper.waitOnTasks();
// serverhelper.execute(new InstallBinariesTask(getContext(),new
// HashMap<String,String>(), new String[0], new FakeListener()));
serverhelper.execute(new UsageTask(getContext(),
new HashMap<String, String>(), listener));
serverhelper.execute(new BatteryTask(getContext(),
new HashMap<String, String>(), listener));
serverhelper.execute(new SignalStrengthTask(getContext(),
new HashMap<String, String>(), listener));
//if((calendar.get(Calendar.HOUR)%2==0)&&(calendar.get(Calendar.MINUTE)>45))
{
serverhelper.execute(new LossTask(getContext(),
new HashMap<String, String>(), listener));
}
//serverhelper.execute(new TracerouteTask(getContext(),
// new HashMap<String, String>(), null, 0, listener));
for (Address dst : dsts) {
serverhelper.execute(new PingTask(getContext(),
new HashMap<String, String>(), dst, 5, listener));
}
measurement.setPings(pings);
measurement.setLastMiles(lastMiles);
serverhelper.waitOnTasks();
getResponseListener().onCompleteMeasurement(measurement);
MeasurementHelper.sendMeasurement(getContext(), measurement);
}
@Override
public String toString() {
return "Measurement Task";
}
private class MeasurementListener extends BaseResponseListener {
public void onCompletePing(Ping response) {
pings.add(response);
dataSource.insert(response);
}
public void onComplete(String response) {
}
public void onCompleteMeasurement(Measurement response) {
getResponseListener().onCompleteMeasurement(response);
}
public void onCompleteDevice(Device response) {
getResponseListener().onCompleteDevice(response);
}
public void onUpdateProgress(int val) {
// TODO Auto-generated method stub
}
public void onCompleteGPS(GPS gps) {
measurement.setGps(gps);
getResponseListener().onCompleteGPS(gps);
}
public void makeToast(String text) {
getResponseListener().makeToast(text);
}
public void onCompleteSignal(String signalStrength) {
Network network = measurement.getNetwork();
network.setSignalStrength(signalStrength);
measurement.setNetwork(network);
}
public void onCompleteUsage(Usage usage) {
measurement.setUsage(usage);
getResponseListener().onCompleteUsage(usage);
}
public void onCompleteThroughput(Throughput throughput) {
measurement.setThroughput(throughput);
getResponseListener().onCompleteThroughput(throughput);
}
public void onCompleteWifi(Wifi wifi) {
if (wifi.isWifi()) {
measurement.setWifi(wifi);
getResponseListener().onCompleteWifi(wifi);
}
}
public void onCompleteNetwork(Network network) {
getResponseListener().onCompleteNetwork(network);
}
public void onCompleteSIM(Sim sim) {
getResponseListener().onCompleteSIM(sim);
}
public void onCompleteBattery(Battery response) {
measurement.setBattery(response);
getResponseListener().onCompleteBattery(response);
}
public void onCompleteSummary(JSONObject Object) {
// TODO Auto-generated method stub
}
public void onFail(String response) {
// TODO Auto-generated method stub
}
public void onCompleteLastMile(LastMile lastMile) {
lastMiles.add(lastMile);
dataSource.insert(lastMile);
}
public void onUpdateUpLink(Link link) {
// TODO Auto-generated method stub
}
public void onUpdateDownLink(Link link) {
// TODO Auto-generated method stub
}
public void onUpdateThroughput(Throughput throughput) {
// TODO Auto-generated method stub
}
public void onCompleteTraceroute(Traceroute traceroute) {
//
}
public void onCompleteTracerouteHop(TracerouteEntry traceroute) {
// TODO Auto-generated method stub
}
public void onCompleteWarmupExperiment(WarmupExperiment experiment) {
measurement.setWarmupExperiment(experiment);
}
public void onCompleteLoss(Loss loss) {
measurement.setLoss(loss);
getResponseListener().onCompleteLoss(loss);
}
}
/*private Handler GPSHandler = new Handler() {
public void handleMessage(Message msg) {
try {
boolean gps = GPSUtil.getLocation(getContext(), locationResult);
} catch (Exception e) {
e.printStackTrace();
}
}
};*/
public LocationResult locationResult = new LocationResult() {
@Override
public void gotLocation(final Location location) {
GPS gps = new GPS();
if (location != null) {
gps.setAltitude("" + location.getAltitude());
gps.setLatitude("" + location.getLatitude());
gps.setLongitude("" + location.getLongitude());
// gpsRunning = false;
} else {
gps = new GPS("Not Found", "Not Found", "Not Found");
// gpsRunning = false;
}
(new MeasurementListener()).onCompleteGPS(gps);
}
};
}