/**
  * 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;
 }