package com.num.services;
import java.util.concurrent.TimeUnit;
import org.json.JSONObject;
import com.num.Values;
import com.num.helpers.ServiceHelper;
import com.num.helpers.ThreadPoolHelper;
import com.num.helpers.UserDataHelper;
import com.num.listeners.BaseResponseListener;
import com.num.listeners.FakeListener;
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.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.tasks.MeasurementTask;
import com.num.tasks.ParameterTask;
import com.num.utils.StateUtil;
import android.app.IntentService;
import android.content.Context;
import android.content.Intent;
import android.os.Handler;
import android.os.Message;
import android.os.PowerManager;
import android.util.Log;
public class MeasurementService extends IntentService {
private PowerManager.WakeLock wakeLock;
public static boolean isExecuting;
private ThreadPoolHelper serverhelper;
private boolean doThroughput;
private Context context;
public MeasurementService() {
super(MeasurementService.class.getName());
}
public void onBegin() {
isExecuting = true;
// obtain wake lock, otherways our service ma stop executing
try {
PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
MeasurementService.class.getName());
wakeLock.acquire();
} catch (Exception e) {
ClientLog.log(context, e.getLocalizedMessage(), "wakelock-acquire");
}
System.out.println("wakelock acquired");
try {
ServiceHelper.recurringStartService(this);
} catch (Exception e) {
ClientLog.log(context, e, "service-recurring");
}
}
private void onEnd() {
try {
wakeLock.release();
} catch (Exception e) {
ClientLog.log(context, e, "wakelock-release");
}
System.out.println("wakelock released");
isExecuting = false;
}
@Override
protected void onHandleIntent(Intent intent) {
context = this;
try {
onBegin();
runTask();
onEnd();
} catch (Exception e) {
ClientLog.log(context, e, "service-onHandle");
}
}
private void runTask() {
Values session = (Values) this.getApplicationContext();
serverhelper = new ThreadPoolHelper(1, session.THREADPOOL_KEEPALIVE_SEC);
doThroughput = session.doThroughput();
session.incrementThroughput();
if (doThroughput) {
StateUtil stateutil = new StateUtil(this);
boolean clear = stateutil.isNetworkClear();
if (!clear) {
session.decrementThroughput();
doThroughput = false;
}
}
UserDataHelper userhelp = new UserDataHelper(this);
doThroughput = doThroughput && (userhelp.getDataEnable() == 1);
if (doThroughput) {
serverhelper.execute(new ParameterTask(this, (new Listener())));
} else {
serverhelper.execute(new MeasurementTask(this, new Throughput(), false,
new FakeListener()));
}
Log.i("MeasurementService", " Throughput:" + session.getThroughput());
serverhelper.waitOnTasks(240);
}
public static void poke(Context ctx) {
ctx.startService(new Intent(ctx, MeasurementService.class));
}
public class Listener extends BaseResponseListener {
Values session = (Values) context.getApplicationContext();
public void onComplete(String response) {
System.out.println("throughput succeed");
NoThroughputHandler.sendEmptyMessage(0);
}
public void onFail(String response) {
System.out.println("throughput failed");
session.decrementThroughput();
doThroughput = false;
NoThroughputHandler.sendEmptyMessage(0);
}
public void onCompletePing(Ping response) {
// TODO Auto-generated method stub
}
public void onCompleteMeasurement(Measurement response) {
// TODO Auto-generated method stub
}
public void onCompleteDevice(Device response) {
// TODO Auto-generated method stub
}
public void onCompleteBattery(Battery response) {
// TODO Auto-generated method stub
}
public void onUpdateProgress(int val) {
// TODO Auto-generated method stub
}
public void onCompleteGPS(GPS gps) {
// TODO Auto-generated method stub
}
public void onCompleteUsage(Usage usage) {
// TODO Auto-generated method stub
}
public void onCompleteThroughput(Throughput throughput) {
// TODO Auto-generated method stub
}
public void makeToast(String text) {
// TODO Auto-generated method stub
}
public void onCompleteSignal(String signalStrength) {
// TODO Auto-generated method stub
}
public void onCompleteWifi(Wifi wifiList) {
// TODO Auto-generated method stub
}
public void onCompleteNetwork(Network network) {
// TODO Auto-generated method stub
}
public void onCompleteSIM(Sim sim) {
// TODO Auto-generated method stub
}
public void onCompleteSummary(JSONObject Object) {
}
private Handler NoThroughputHandler = new Handler() {
public void handleMessage(Message msg) {
try {
serverhelper.execute(new MeasurementTask(context, null,
false, new FakeListener()));
} catch (Exception e) {
e.printStackTrace();
}
}
};
public void onCompleteLastMile(LastMile lastMile) {
// TODO Auto-generated method stub
}
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) {
// TODO Auto-generated method stub
}
public void onCompleteTracerouteHop(TracerouteEntry traceroute) {
// TODO Auto-generated method stub
}
public void onCompleteWarmupExperiment(WarmupExperiment experiment) {
// TODO Auto-generated method stub
}
public void onCompleteLoss(Loss loss) {
// TODO Auto-generated method stub
}
}
}