/** * The call() method that broadcast intents before the measurement starts and after the * measurement finishes. */ @Override public MeasurementResult[] call() throws MeasurementError { MeasurementResult[] results = null; PhoneUtils phoneUtils = PhoneUtils.getPhoneUtils(); try { phoneUtils.acquireWakeLock(); broadcastMeasurementStart(); contextCollector.setInterval(realTask.getDescription().contextIntervalSec); contextCollector.startCollector(); results = realTask.call(); ArrayList<HashMap<String, String>> contextResults = contextCollector.stopCollector(); for (MeasurementResult r : results) { r.addContextResults(contextResults); r.getDeviceProperty().dnResolvability = contextCollector.dnsConnectivity; r.getDeviceProperty().ipConnectivity = contextCollector.ipConnectivity; } } catch (MeasurementError e) { Logger.e("User measurement " + realTask.getDescriptor() + " has failed"); Logger.e(e.getMessage()); results = MeasurementResult.getFailureResult(realTask, e); } catch (Exception e) { Logger.e("User measurement " + realTask.getDescriptor() + " has failed"); Logger.e("Unexpected Exception: " + e.getMessage()); results = MeasurementResult.getFailureResult(realTask, e); } finally { broadcastMeasurementEnd(results); MeasurementTask currentTask = scheduler.getCurrentTask(); if (currentTask != null && currentTask.equals(realTask)) { scheduler.setCurrentTask(null); } phoneUtils.releaseWakeLock(); } return results; }