package org.openiot.cupus.mobile.sensors.implementations; /** * Created by kpripuzic on 1/14/14. */ import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.telephony.CellLocation; import android.telephony.TelephonyManager; import org.openiot.cupus.artefact.TripletAnnouncement; import org.openiot.cupus.mobile.sensors.common.PullMultiSensor; import org.openiot.cupus.mobile.sensors.common.ReadingDefinition; import org.openiot.cupus.mobile.sensors.common.SensorReading; import java.util.ArrayList; import java.util.List; public class LocationPullSensor extends PullMultiSensor { private Location currentLocation; private GPSListener gpsListener; private LocationManager locationManager; private long locationUpdateRate; private TelephonyManager telephonyManager; public LocationPullSensor(LocationManager locationManager, long locationUpdateRate, TelephonyManager telephonyManager) { this.telephonyManager = telephonyManager; this.locationManager = locationManager; this.locationUpdateRate = locationUpdateRate; this.readingDefinitions = new ArrayList<ReadingDefinition>(); this.tripletAnnouncements = new ArrayList<TripletAnnouncement>(); } @Override public boolean initialize() { //GPS initialization if (locationManager != null && locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, locationUpdateRate, 0, gpsListener = new GPSListener()); Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER); if (location != null) { currentLocation = location; } readingDefinitions.add(new ReadingDefinition("latitude")); TripletAnnouncement tripletAnnouncementLat = new TripletAnnouncement(-1, System.currentTimeMillis()); tripletAnnouncementLat.addNumericalPredicate("latitude"); tripletAnnouncements.add(tripletAnnouncementLat); readingDefinitions.add(new ReadingDefinition("longitude")); TripletAnnouncement tripletAnnouncementLong = new TripletAnnouncement(-1, System.currentTimeMillis()); tripletAnnouncementLong.addNumericalPredicate("longitude"); tripletAnnouncements.add(tripletAnnouncementLong); } //CellId initialization if (telephonyManager != null) { readingDefinitions.add(new ReadingDefinition("cellid")); TripletAnnouncement tripletAnnouncementCellId = new TripletAnnouncement(-1, System.currentTimeMillis()); tripletAnnouncementCellId.addTextualPdredicate("cellid"); tripletAnnouncements.add(tripletAnnouncementCellId); } if (!readingDefinitions.isEmpty()) { super.setInitialized(true); return true; } //initialization failed super.setInitialized(false); return false; } private String getCellIds() { CellLocation cellLocation = telephonyManager.getCellLocation(); return cellLocation.toString(); } @Override public boolean terminate() { if (locationManager != null && locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER) && gpsListener != null) { //stop listening location changes locationManager.removeUpdates(gpsListener); } return true; } @Override public int getId() { return hashCode(); } public final SensorReading pullReading(String readingDefinition) { if (readingDefinition.equals("latitude") && currentLocation != null) return new SensorReading(currentLocation.getLatitude()); else if (readingDefinition.equals("longitude") && currentLocation != null) return new SensorReading(currentLocation.getLongitude()); else if (readingDefinition.equals("cellid") && telephonyManager != null) { return new SensorReading<String>(getCellIds()); } else return null; } public final List<SensorReading> pullReadings() { List<SensorReading> readings = new ArrayList<SensorReading>(); for (ReadingDefinition readingDefinition : readingDefinitions) { readings.add(pullReading(readingDefinition.getName())); } return readings; } private class GPSListener implements LocationListener { public void onLocationChanged(Location location) { currentLocation = location; } public void onProviderDisabled(String provider) { } public void onProviderEnabled(String provider) { } public void onStatusChanged(String provider, int status, Bundle extras) { } } }