/* * Copyright (C) 2014 The Context Engine Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package uk.ac.tvu.mdse.contextengine; import java.util.ArrayList; import uk.ac.tvu.mdse.contextengine.contexts.LocationContextTest; import android.content.Context; import android.content.Intent; import android.location.Criteria; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.provider.Settings; import android.util.Log; public class LocationServices implements LocationListener { private LocationManager locationManager; private String provider; private Location location; public static final String LOG_TAG = "LocationServices"; public static final boolean D = true; Context context; // in real life you *DO NOT* want to do this, it may consume too many // resources // (time less than 60000ms for minTime is NOT recommended, used only for // testing) private int minTime = 3000; // in milliseconds private int minDistance = 1000; // in meters private ArrayList<LocationContextTest> locationContexts = new ArrayList<LocationContextTest>(); public LocationServices(Context c) { if (D) Log.d(LOG_TAG, "constructor"); this.context = c; locationManager = (LocationManager) c .getSystemService(Context.LOCATION_SERVICE); Criteria criteria = new Criteria(); criteria.setAccuracy(Criteria.ACCURACY_COARSE); criteria.setAltitudeRequired(false); criteria.setBearingRequired(false); criteria.setCostAllowed(true); criteria.setPowerRequirement(Criteria.NO_REQUIREMENT); provider = locationManager.getBestProvider(criteria, false); Log.v("LocationServices", "LocationServices3 " + provider.toString()); if (provider != null && locationManager.isProviderEnabled(provider)) { // set minTime(milliseconds) and minDistance(meters) locationManager.requestLocationUpdates(provider, minTime, minDistance, this); location = locationManager.getLastKnownLocation(provider); Log.v("constr-LocationServices", "Latitude= " + location.getLatitude() + " Longitude= " + location.getLongitude()); Log.v("LocationServices", "Location accuracy: " + location.getAccuracy()); } else { Intent myIntent = new Intent( Settings.ACTION_LOCATION_SOURCE_SETTINGS); c.startActivity(myIntent); } } public void setUpdatesCriteria(int time, int distance) { if (D) Log.d(LOG_TAG, "setUpdatesCriteria"); if ((time < minTime) || (distance < minDistance)) { this.minTime = time; this.minDistance = distance; locationManager.removeUpdates(this); locationManager.requestLocationUpdates(provider, minTime, minDistance, this); } } public void addLocationContext(LocationContextTest locationContext) { if (D) Log.d(LOG_TAG, "addLocationContext"); locationContexts.add(locationContext); } public Location getLocation() { if (D) Log.d(LOG_TAG, "getLocation"); return location; } public void onLocationChanged(Location locale) { if (D) Log.d(LOG_TAG, "onLocationChanged"); for (LocationContextTest locationContext : locationContexts) { locationContext.onLocationChanged(locale); } this.location = locale; } public void onProviderDisabled(String prv) { if (D) Log.v(LOG_TAG, "Provider " + prv + " disabled"); // if best provider disabled, make GPS default provider = locationManager.GPS_PROVIDER; // check if GPS enabled, if not - ask for it if (!locationManager.isProviderEnabled(provider)) { Intent gpsOptionsIntent = new Intent( android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS); context.startActivity(gpsOptionsIntent); } } public void onProviderEnabled(String prv) { if (D) Log.v(LOG_TAG, "Provider " + prv + " enabled"); locationManager.removeUpdates(this); locationManager.requestLocationUpdates(provider, minTime, minDistance, this); location = locationManager.getLastKnownLocation(provider); if (D) Log.v(LOG_TAG, "Latitude= " + location.getLatitude() + " Longitude= " + location.getLongitude()); if (D) Log.v(LOG_TAG, "Location accuracy: " + location.getAccuracy()); } public void onStatusChanged(String prv, int stat, Bundle extras) { if (stat == 2) { locationManager.removeUpdates(this); locationManager.requestLocationUpdates(provider, minTime, minDistance, this); location = locationManager.getLastKnownLocation(provider); if (D) Log.v(LOG_TAG, "Latitude= " + location.getLatitude() + " Longitude= " + location.getLongitude()); if (D) Log.v(LOG_TAG, "Location accuracy: " + location.getAccuracy()); } } public void stop() { locationManager.removeUpdates(this); if (D) Log.v(LOG_TAG, "Stopping"); } }