diff options
Diffstat (limited to 'src/com/android/camera/LocationManager.java')
-rw-r--r-- | src/com/android/camera/LocationManager.java | 181 |
1 files changed, 181 insertions, 0 deletions
diff --git a/src/com/android/camera/LocationManager.java b/src/com/android/camera/LocationManager.java new file mode 100644 index 000000000..fcf21b60f --- /dev/null +++ b/src/com/android/camera/LocationManager.java @@ -0,0 +1,181 @@ +/* + * Copyright (C) 2011 The Android Open Source 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 com.android.camera; + +import android.content.Context; +import android.location.Location; +import android.location.LocationProvider; +import android.os.Bundle; +import android.util.Log; + +/** + * A class that handles everything about location. + */ +public class LocationManager { + private static final String TAG = "LocationManager"; + + private Context mContext; + private Listener mListener; + private android.location.LocationManager mLocationManager; + private boolean mRecordLocation; + + LocationListener [] mLocationListeners = new LocationListener[] { + new LocationListener(android.location.LocationManager.GPS_PROVIDER), + new LocationListener(android.location.LocationManager.NETWORK_PROVIDER) + }; + + public interface Listener { + public void showGpsOnScreenIndicator(boolean hasSignal); + public void hideGpsOnScreenIndicator(); + } + + public LocationManager(Context context, Listener listener) { + mContext = context; + mListener = listener; + } + + public Location getCurrentLocation() { + if (!mRecordLocation) return null; + + // go in best to worst order + for (int i = 0; i < mLocationListeners.length; i++) { + Location l = mLocationListeners[i].current(); + if (l != null) return l; + } + Log.d(TAG, "No location received yet."); + return null; + } + + public void recordLocation(boolean recordLocation) { + if (mRecordLocation != recordLocation) { + mRecordLocation = recordLocation; + if (recordLocation) { + startReceivingLocationUpdates(); + } else { + stopReceivingLocationUpdates(); + } + } + } + + private void startReceivingLocationUpdates() { + if (mLocationManager == null) { + mLocationManager = (android.location.LocationManager) + mContext.getSystemService(Context.LOCATION_SERVICE); + } + if (mLocationManager != null) { + try { + mLocationManager.requestLocationUpdates( + android.location.LocationManager.NETWORK_PROVIDER, + 1000, + 0F, + mLocationListeners[1]); + } catch (SecurityException ex) { + Log.i(TAG, "fail to request location update, ignore", ex); + } catch (IllegalArgumentException ex) { + Log.d(TAG, "provider does not exist " + ex.getMessage()); + } + try { + mLocationManager.requestLocationUpdates( + android.location.LocationManager.GPS_PROVIDER, + 1000, + 0F, + mLocationListeners[0]); + if (mListener != null) mListener.showGpsOnScreenIndicator(false); + } catch (SecurityException ex) { + Log.i(TAG, "fail to request location update, ignore", ex); + } catch (IllegalArgumentException ex) { + Log.d(TAG, "provider does not exist " + ex.getMessage()); + } + Log.d(TAG, "startReceivingLocationUpdates"); + } + } + + private void stopReceivingLocationUpdates() { + if (mLocationManager != null) { + for (int i = 0; i < mLocationListeners.length; i++) { + try { + mLocationManager.removeUpdates(mLocationListeners[i]); + } catch (Exception ex) { + Log.i(TAG, "fail to remove location listners, ignore", ex); + } + } + Log.d(TAG, "stopReceivingLocationUpdates"); + } + if (mListener != null) mListener.hideGpsOnScreenIndicator(); + } + + private class LocationListener + implements android.location.LocationListener { + Location mLastLocation; + boolean mValid = false; + String mProvider; + + public LocationListener(String provider) { + mProvider = provider; + mLastLocation = new Location(mProvider); + } + + @Override + public void onLocationChanged(Location newLocation) { + if (newLocation.getLatitude() == 0.0 + && newLocation.getLongitude() == 0.0) { + // Hack to filter out 0.0,0.0 locations + return; + } + // If GPS is available before start camera, we won't get status + // update so update GPS indicator when we receive data. + if (mListener != null && mRecordLocation && + android.location.LocationManager.GPS_PROVIDER.equals(mProvider)) { + mListener.showGpsOnScreenIndicator(true); + } + if (!mValid) { + Log.d(TAG, "Got first location."); + } + mLastLocation.set(newLocation); + mValid = true; + } + + @Override + public void onProviderEnabled(String provider) { + } + + @Override + public void onProviderDisabled(String provider) { + mValid = false; + } + + @Override + public void onStatusChanged( + String provider, int status, Bundle extras) { + switch(status) { + case LocationProvider.OUT_OF_SERVICE: + case LocationProvider.TEMPORARILY_UNAVAILABLE: { + mValid = false; + if (mListener != null && mRecordLocation && + android.location.LocationManager.GPS_PROVIDER.equals(provider)) { + mListener.showGpsOnScreenIndicator(false); + } + break; + } + } + } + + public Location current() { + return mValid ? mLastLocation : null; + } + } +} |