summaryrefslogtreecommitdiffstats
path: root/location
diff options
context:
space:
mode:
authorMike Lockwood <lockwood@android.com>2010-03-26 10:41:48 -0400
committerMike Lockwood <lockwood@android.com>2010-04-04 18:44:05 -0400
commit00b74270c9f136a8727c5f6cda0997a3a905f385 (patch)
tree57e8b7aa5d09ef5909326e952e04367d24c291e7 /location
parent5b53244a4e6c81b5346cde22fabbbefe5b472cf7 (diff)
downloadframeworks_base-00b74270c9f136a8727c5f6cda0997a3a905f385.zip
frameworks_base-00b74270c9f136a8727c5f6cda0997a3a905f385.tar.gz
frameworks_base-00b74270c9f136a8727c5f6cda0997a3a905f385.tar.bz2
Move files internal to LocationManagerService from framework.jar to services.jar
Change-Id: Iebbfc49b8300ab59730733efdf489ec87ea45a25 Signed-off-by: Mike Lockwood <lockwood@android.com>
Diffstat (limited to 'location')
-rw-r--r--location/java/android/location/LocationManager.java31
-rw-r--r--location/java/android/location/LocationProviderInterface.java52
-rw-r--r--location/java/com/android/internal/location/GeocoderProxy.java105
-rwxr-xr-xlocation/java/com/android/internal/location/GpsLocationProvider.java1471
-rwxr-xr-xlocation/java/com/android/internal/location/GpsNetInitiatedHandler.java24
-rw-r--r--location/java/com/android/internal/location/GpsXtraDownloader.java173
-rw-r--r--location/java/com/android/internal/location/LocationProviderProxy.java384
-rw-r--r--location/java/com/android/internal/location/MockProvider.java207
-rw-r--r--location/java/com/android/internal/location/PassiveProvider.java143
9 files changed, 43 insertions, 2547 deletions
diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java
index 9e4a16b..28bc599 100644
--- a/location/java/android/location/LocationManager.java
+++ b/location/java/android/location/LocationManager.java
@@ -117,6 +117,37 @@ public class LocationManager {
*/
public static final String KEY_LOCATION_CHANGED = "location";
+ /**
+ * Broadcast intent action indicating that the GPS has either been
+ * enabled or disabled. An intent extra provides this state as a boolean,
+ * where {@code true} means enabled.
+ * @see #EXTRA_GPS_ENABLED
+ *
+ * {@hide}
+ */
+ public static final String GPS_ENABLED_CHANGE_ACTION =
+ "android.location.GPS_ENABLED_CHANGE";
+
+ /**
+ * Broadcast intent action indicating that the GPS has either started or
+ * stopped receiving GPS fixes. An intent extra provides this state as a
+ * boolean, where {@code true} means that the GPS is actively receiving fixes.
+ * @see #EXTRA_GPS_ENABLED
+ *
+ * {@hide}
+ */
+ public static final String GPS_FIX_CHANGE_ACTION =
+ "android.location.GPS_FIX_CHANGE";
+
+ /**
+ * The lookup key for a boolean that indicates whether GPS is enabled or
+ * disabled. {@code true} means GPS is enabled. Retrieve it with
+ * {@link android.content.Intent#getBooleanExtra(String,boolean)}.
+ *
+ * {@hide}
+ */
+ public static final String EXTRA_GPS_ENABLED = "enabled";
+
// Map from LocationListeners to their associated ListenerTransport objects
private HashMap<LocationListener,ListenerTransport> mListeners =
new HashMap<LocationListener,ListenerTransport>();
diff --git a/location/java/android/location/LocationProviderInterface.java b/location/java/android/location/LocationProviderInterface.java
deleted file mode 100644
index 5ffe15c..0000000
--- a/location/java/android/location/LocationProviderInterface.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (C) 2010 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 android.location;
-
-import android.location.Location;
-import android.net.NetworkInfo;
-import android.os.Bundle;
-
-/**
- * Location Manager's interface for location providers.
- *
- * {@hide}
- */
-public interface LocationProviderInterface {
- String getName();
- boolean requiresNetwork();
- boolean requiresSatellite();
- boolean requiresCell();
- boolean hasMonetaryCost();
- boolean supportsAltitude();
- boolean supportsSpeed();
- boolean supportsBearing();
- int getPowerRequirement();
- int getAccuracy();
- boolean isEnabled();
- void enable();
- void disable();
- int getStatus(Bundle extras);
- long getStatusUpdateTime();
- void enableLocationTracking(boolean enable);
- String getInternalState();
- void setMinTime(long minTime);
- void updateNetworkState(int state, NetworkInfo info);
- void updateLocation(Location location);
- boolean sendExtraCommand(String command, Bundle extras);
- void addListener(int uid);
- void removeListener(int uid);
-}
diff --git a/location/java/com/android/internal/location/GeocoderProxy.java b/location/java/com/android/internal/location/GeocoderProxy.java
deleted file mode 100644
index b06297b..0000000
--- a/location/java/com/android/internal/location/GeocoderProxy.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright (C) 2010 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.internal.location;
-
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.ServiceConnection;
-import android.location.Address;
-import android.location.GeocoderParams;
-import android.location.IGeocodeProvider;
-import android.os.IBinder;
-import android.os.RemoteException;
-import android.os.SystemClock;
-import android.util.Log;
-
-import java.util.List;
-
-/**
- * A class for proxying IGeocodeProvider implementations.
- *
- * {@hide}
- */
-public class GeocoderProxy {
-
- private static final String TAG = "GeocoderProxy";
-
- private final Context mContext;
- private final Intent mIntent;
- private final Connection mServiceConnection = new Connection();
- private IGeocodeProvider mProvider;
-
- public GeocoderProxy(Context context, String serviceName) {
- mContext = context;
- mIntent = new Intent(serviceName);
- mContext.bindService(mIntent, mServiceConnection, Context.BIND_AUTO_CREATE);
- }
-
- private class Connection implements ServiceConnection {
- public void onServiceConnected(ComponentName className, IBinder service) {
- Log.d(TAG, "onServiceConnected " + className);
- synchronized (this) {
- mProvider = IGeocodeProvider.Stub.asInterface(service);
- }
- }
-
- public void onServiceDisconnected(ComponentName className) {
- Log.d(TAG, "onServiceDisconnected " + className);
- synchronized (this) {
- mProvider = null;
- }
- }
- }
-
- public String getFromLocation(double latitude, double longitude, int maxResults,
- GeocoderParams params, List<Address> addrs) {
- IGeocodeProvider provider;
- synchronized (mServiceConnection) {
- provider = mProvider;
- }
- if (provider != null) {
- try {
- return provider.getFromLocation(latitude, longitude, maxResults,
- params, addrs);
- } catch (RemoteException e) {
- Log.e(TAG, "getFromLocation failed", e);
- }
- }
- return "Service not Available";
- }
-
- public String getFromLocationName(String locationName,
- double lowerLeftLatitude, double lowerLeftLongitude,
- double upperRightLatitude, double upperRightLongitude, int maxResults,
- GeocoderParams params, List<Address> addrs) {
- IGeocodeProvider provider;
- synchronized (mServiceConnection) {
- provider = mProvider;
- }
- if (provider != null) {
- try {
- return provider.getFromLocationName(locationName, lowerLeftLatitude,
- lowerLeftLongitude, upperRightLatitude, upperRightLongitude,
- maxResults, params, addrs);
- } catch (RemoteException e) {
- Log.e(TAG, "getFromLocationName failed", e);
- }
- }
- return "Service not Available";
- }
-}
diff --git a/location/java/com/android/internal/location/GpsLocationProvider.java b/location/java/com/android/internal/location/GpsLocationProvider.java
deleted file mode 100755
index e312482..0000000
--- a/location/java/com/android/internal/location/GpsLocationProvider.java
+++ /dev/null
@@ -1,1471 +0,0 @@
-/*
- * Copyright (C) 2008 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.internal.location;
-
-import android.app.AlarmManager;
-import android.app.PendingIntent;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.location.Criteria;
-import android.location.IGpsStatusListener;
-import android.location.IGpsStatusProvider;
-import android.location.ILocationManager;
-import android.location.INetInitiatedListener;
-import android.location.Location;
-import android.location.LocationManager;
-import android.location.LocationProvider;
-import android.location.LocationProviderInterface;
-import android.net.ConnectivityManager;
-import android.net.NetworkInfo;
-import android.net.SntpClient;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.Looper;
-import android.os.Message;
-import android.os.PowerManager;
-import android.os.Process;
-import android.os.RemoteException;
-import android.os.ServiceManager;
-import android.os.SystemClock;
-import android.provider.Settings;
-import android.util.Log;
-import android.util.SparseIntArray;
-
-import com.android.internal.app.IBatteryStats;
-import com.android.internal.telephony.Phone;
-import com.android.internal.location.GpsNetInitiatedHandler;
-import com.android.internal.location.GpsNetInitiatedHandler.GpsNiNotification;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.StringBufferInputStream;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.Properties;
-import java.util.Map.Entry;
-import java.util.concurrent.CountDownLatch;
-
-/**
- * A GPS implementation of LocationProvider used by LocationManager.
- *
- * {@hide}
- */
-public class GpsLocationProvider implements LocationProviderInterface {
-
- private static final String TAG = "GpsLocationProvider";
-
- private static final boolean DEBUG = false;
- private static final boolean VERBOSE = false;
-
- /**
- * Broadcast intent action indicating that the GPS has either been
- * enabled or disabled. An intent extra provides this state as a boolean,
- * where {@code true} means enabled.
- * @see #EXTRA_ENABLED
- *
- * {@hide}
- */
- public static final String GPS_ENABLED_CHANGE_ACTION =
- "android.location.GPS_ENABLED_CHANGE";
-
- /**
- * Broadcast intent action indicating that the GPS has either started or
- * stopped receiving GPS fixes. An intent extra provides this state as a
- * boolean, where {@code true} means that the GPS is actively receiving fixes.
- * @see #EXTRA_ENABLED
- *
- * {@hide}
- */
- public static final String GPS_FIX_CHANGE_ACTION =
- "android.location.GPS_FIX_CHANGE";
-
- /**
- * The lookup key for a boolean that indicates whether GPS is enabled or
- * disabled. {@code true} means GPS is enabled. Retrieve it with
- * {@link android.content.Intent#getBooleanExtra(String,boolean)}.
- *
- * {@hide}
- */
- public static final String EXTRA_ENABLED = "enabled";
-
- // these need to match GpsPositionMode enum in gps.h
- private static final int GPS_POSITION_MODE_STANDALONE = 0;
- private static final int GPS_POSITION_MODE_MS_BASED = 1;
- private static final int GPS_POSITION_MODE_MS_ASSISTED = 2;
-
- // these need to match GpsStatusValue defines in gps.h
- private static final int GPS_STATUS_NONE = 0;
- private static final int GPS_STATUS_SESSION_BEGIN = 1;
- private static final int GPS_STATUS_SESSION_END = 2;
- private static final int GPS_STATUS_ENGINE_ON = 3;
- private static final int GPS_STATUS_ENGINE_OFF = 4;
-
- // these need to match GpsApgsStatusValue defines in gps.h
- /** AGPS status event values. */
- private static final int GPS_REQUEST_AGPS_DATA_CONN = 1;
- private static final int GPS_RELEASE_AGPS_DATA_CONN = 2;
- private static final int GPS_AGPS_DATA_CONNECTED = 3;
- private static final int GPS_AGPS_DATA_CONN_DONE = 4;
- private static final int GPS_AGPS_DATA_CONN_FAILED = 5;
-
- // these need to match GpsLocationFlags enum in gps.h
- private static final int LOCATION_INVALID = 0;
- private static final int LOCATION_HAS_LAT_LONG = 1;
- private static final int LOCATION_HAS_ALTITUDE = 2;
- private static final int LOCATION_HAS_SPEED = 4;
- private static final int LOCATION_HAS_BEARING = 8;
- private static final int LOCATION_HAS_ACCURACY = 16;
-
-// IMPORTANT - the GPS_DELETE_* symbols here must match constants in gps.h
- private static final int GPS_DELETE_EPHEMERIS = 0x0001;
- private static final int GPS_DELETE_ALMANAC = 0x0002;
- private static final int GPS_DELETE_POSITION = 0x0004;
- private static final int GPS_DELETE_TIME = 0x0008;
- private static final int GPS_DELETE_IONO = 0x0010;
- private static final int GPS_DELETE_UTC = 0x0020;
- private static final int GPS_DELETE_HEALTH = 0x0040;
- private static final int GPS_DELETE_SVDIR = 0x0080;
- private static final int GPS_DELETE_SVSTEER = 0x0100;
- private static final int GPS_DELETE_SADATA = 0x0200;
- private static final int GPS_DELETE_RTI = 0x0400;
- private static final int GPS_DELETE_CELLDB_INFO = 0x8000;
- private static final int GPS_DELETE_ALL = 0xFFFF;
-
- // these need to match AGpsType enum in gps.h
- private static final int AGPS_TYPE_SUPL = 1;
- private static final int AGPS_TYPE_C2K = 2;
-
- // for mAGpsDataConnectionState
- private static final int AGPS_DATA_CONNECTION_CLOSED = 0;
- private static final int AGPS_DATA_CONNECTION_OPENING = 1;
- private static final int AGPS_DATA_CONNECTION_OPEN = 2;
-
- // Handler messages
- private static final int CHECK_LOCATION = 1;
- private static final int ENABLE = 2;
- private static final int ENABLE_TRACKING = 3;
- private static final int UPDATE_NETWORK_STATE = 4;
- private static final int INJECT_NTP_TIME = 5;
- private static final int DOWNLOAD_XTRA_DATA = 6;
- private static final int UPDATE_LOCATION = 7;
- private static final int ADD_LISTENER = 8;
- private static final int REMOVE_LISTENER = 9;
-
- private static final String PROPERTIES_FILE = "/etc/gps.conf";
-
- private int mLocationFlags = LOCATION_INVALID;
-
- // current status
- private int mStatus = LocationProvider.TEMPORARILY_UNAVAILABLE;
-
- // time for last status update
- private long mStatusUpdateTime = SystemClock.elapsedRealtime();
-
- // turn off GPS fix icon if we haven't received a fix in 10 seconds
- private static final long RECENT_FIX_TIMEOUT = 10;
-
- // number of fixes to receive before disabling GPS
- private static final int MIN_FIX_COUNT = 10;
-
- // stop trying if we do not receive a fix within 60 seconds
- private static final int NO_FIX_TIMEOUT = 60;
-
- // true if we are enabled
- private volatile boolean mEnabled;
-
- // true if we have network connectivity
- private boolean mNetworkAvailable;
-
- // flags to trigger NTP or XTRA data download when network becomes available
- // initialized to true so we do NTP and XTRA when the network comes up after booting
- private boolean mInjectNtpTimePending = true;
- private boolean mDownloadXtraDataPending = true;
-
- // true if GPS is navigating
- private boolean mNavigating;
-
- // true if GPS engine is on
- private boolean mEngineOn;
-
- // requested frequency of fixes, in seconds
- private int mFixInterval = 1;
-
- // number of fixes we have received since we started navigating
- private int mFixCount;
-
- // true if we started navigation
- private boolean mStarted;
-
- // for calculating time to first fix
- private long mFixRequestTime = 0;
- // time to first fix for most recent session
- private int mTTFF = 0;
- // time we received our last fix
- private long mLastFixTime;
-
- // properties loaded from PROPERTIES_FILE
- private Properties mProperties;
- private String mNtpServer;
- private String mSuplServerHost;
- private int mSuplServerPort;
- private String mC2KServerHost;
- private int mC2KServerPort;
-
- private final Context mContext;
- private final ILocationManager mLocationManager;
- private Location mLocation = new Location(LocationManager.GPS_PROVIDER);
- private Bundle mLocationExtras = new Bundle();
- private ArrayList<Listener> mListeners = new ArrayList<Listener>();
-
- // GpsLocationProvider's handler thread
- private final Thread mThread;
- // Handler for processing events in mThread.
- private Handler mHandler;
- // Used to signal when our main thread has initialized everything
- private final CountDownLatch mInitializedLatch = new CountDownLatch(1);
- // Thread for receiving events from the native code
- private Thread mEventThread;
-
- private String mAGpsApn;
- private int mAGpsDataConnectionState;
- private final ConnectivityManager mConnMgr;
- private final GpsNetInitiatedHandler mNIHandler;
-
- // Wakelocks
- private final static String WAKELOCK_KEY = "GpsLocationProvider";
- private final PowerManager.WakeLock mWakeLock;
-
- // Alarms
- private final static String ALARM_WAKEUP = "com.android.internal.location.ALARM_WAKEUP";
- private final static String ALARM_TIMEOUT = "com.android.internal.location.ALARM_TIMEOUT";
- private final AlarmManager mAlarmManager;
- private final PendingIntent mWakeupIntent;
- private final PendingIntent mTimeoutIntent;
-
- private final IBatteryStats mBatteryStats;
- private final SparseIntArray mClientUids = new SparseIntArray();
-
- // how often to request NTP time, in milliseconds
- // current setting 4 hours
- private static final long NTP_INTERVAL = 4*60*60*1000;
- // how long to wait if we have a network error in NTP or XTRA downloading
- // current setting - 5 minutes
- private static final long RETRY_INTERVAL = 5*60*1000;
-
- // to avoid injecting bad NTP time, we reject any time fixes that differ from system time
- // by more than 5 minutes.
- private static final long MAX_NTP_SYSTEM_TIME_OFFSET = 5*60*1000;
-
- private final IGpsStatusProvider mGpsStatusProvider = new IGpsStatusProvider.Stub() {
- public void addGpsStatusListener(IGpsStatusListener listener) throws RemoteException {
- if (listener == null) {
- throw new NullPointerException("listener is null in addGpsStatusListener");
- }
-
- synchronized(mListeners) {
- IBinder binder = listener.asBinder();
- int size = mListeners.size();
- for (int i = 0; i < size; i++) {
- Listener test = mListeners.get(i);
- if (binder.equals(test.mListener.asBinder())) {
- // listener already added
- return;
- }
- }
-
- Listener l = new Listener(listener);
- binder.linkToDeath(l, 0);
- mListeners.add(l);
- }
- }
-
- public void removeGpsStatusListener(IGpsStatusListener listener) {
- if (listener == null) {
- throw new NullPointerException("listener is null in addGpsStatusListener");
- }
-
- synchronized(mListeners) {
- IBinder binder = listener.asBinder();
- Listener l = null;
- int size = mListeners.size();
- for (int i = 0; i < size && l == null; i++) {
- Listener test = mListeners.get(i);
- if (binder.equals(test.mListener.asBinder())) {
- l = test;
- }
- }
-
- if (l != null) {
- mListeners.remove(l);
- binder.unlinkToDeath(l, 0);
- }
- }
- }
- };
-
- public IGpsStatusProvider getGpsStatusProvider() {
- return mGpsStatusProvider;
- }
-
- private final BroadcastReceiver mBroadcastReciever = new BroadcastReceiver() {
- @Override public void onReceive(Context context, Intent intent) {
- String action = intent.getAction();
-
- if (action.equals(ALARM_WAKEUP)) {
- if (DEBUG) Log.d(TAG, "ALARM_WAKEUP");
- startNavigating();
- } else if (action.equals(ALARM_TIMEOUT)) {
- if (DEBUG) Log.d(TAG, "ALARM_TIMEOUT");
- hibernate();
- }
- }
- };
-
- public static boolean isSupported() {
- return native_is_supported();
- }
-
- public GpsLocationProvider(Context context, ILocationManager locationManager) {
- mContext = context;
- mLocationManager = locationManager;
- mNIHandler = new GpsNetInitiatedHandler(context);
-
- mLocation.setExtras(mLocationExtras);
-
- // Create a wake lock
- PowerManager powerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
- mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, WAKELOCK_KEY);
-
- mAlarmManager = (AlarmManager)mContext.getSystemService(Context.ALARM_SERVICE);
- mWakeupIntent = PendingIntent.getBroadcast(mContext, 0, new Intent(ALARM_WAKEUP), 0);
- mTimeoutIntent = PendingIntent.getBroadcast(mContext, 0, new Intent(ALARM_TIMEOUT), 0);
-
- mConnMgr = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
-
- // Battery statistics service to be notified when GPS turns on or off
- mBatteryStats = IBatteryStats.Stub.asInterface(ServiceManager.getService("batteryinfo"));
-
- mProperties = new Properties();
- try {
- File file = new File(PROPERTIES_FILE);
- FileInputStream stream = new FileInputStream(file);
- mProperties.load(stream);
- stream.close();
- mNtpServer = mProperties.getProperty("NTP_SERVER", null);
-
- mSuplServerHost = mProperties.getProperty("SUPL_HOST");
- String portString = mProperties.getProperty("SUPL_PORT");
- if (mSuplServerHost != null && portString != null) {
- try {
- mSuplServerPort = Integer.parseInt(portString);
- } catch (NumberFormatException e) {
- Log.e(TAG, "unable to parse SUPL_PORT: " + portString);
- }
- }
-
- mC2KServerHost = mProperties.getProperty("C2K_HOST");
- portString = mProperties.getProperty("C2K_PORT");
- if (mC2KServerHost != null && portString != null) {
- try {
- mC2KServerPort = Integer.parseInt(portString);
- } catch (NumberFormatException e) {
- Log.e(TAG, "unable to parse C2K_PORT: " + portString);
- }
- }
- } catch (IOException e) {
- Log.w(TAG, "Could not open GPS configuration file " + PROPERTIES_FILE);
- }
-
- // wait until we are fully initialized before returning
- mThread = new GpsLocationProviderThread();
- mThread.start();
- while (true) {
- try {
- mInitializedLatch.await();
- break;
- } catch (InterruptedException e) {
- Thread.currentThread().interrupt();
- }
- }
- }
-
- private void initialize() {
- // register our receiver on our thread rather than the main thread
- IntentFilter intentFilter = new IntentFilter();
- intentFilter.addAction(ALARM_WAKEUP);
- intentFilter.addAction(ALARM_TIMEOUT);
- mContext.registerReceiver(mBroadcastReciever, intentFilter);
- }
-
- /**
- * Returns the name of this provider.
- */
- public String getName() {
- return LocationManager.GPS_PROVIDER;
- }
-
- /**
- * Returns true if the provider requires access to a
- * data network (e.g., the Internet), false otherwise.
- */
- public boolean requiresNetwork() {
- return true;
- }
-
- public void updateNetworkState(int state, NetworkInfo info) {
- mHandler.removeMessages(UPDATE_NETWORK_STATE);
- Message m = Message.obtain(mHandler, UPDATE_NETWORK_STATE);
- m.arg1 = state;
- m.obj = info;
- mHandler.sendMessage(m);
- }
-
- private void handleUpdateNetworkState(int state, NetworkInfo info) {
- mNetworkAvailable = (state == LocationProvider.AVAILABLE);
-
- if (DEBUG) {
- Log.d(TAG, "updateNetworkState " + (mNetworkAvailable ? "available" : "unavailable")
- + " info: " + info);
- }
-
- if (info != null && info.getType() == ConnectivityManager.TYPE_MOBILE_SUPL
- && mAGpsDataConnectionState == AGPS_DATA_CONNECTION_OPENING) {
- String apnName = info.getExtraInfo();
- if (mNetworkAvailable && apnName != null && apnName.length() > 0) {
- mAGpsApn = apnName;
- if (DEBUG) Log.d(TAG, "call native_agps_data_conn_open");
- native_agps_data_conn_open(apnName);
- mAGpsDataConnectionState = AGPS_DATA_CONNECTION_OPEN;
- } else {
- if (DEBUG) Log.d(TAG, "call native_agps_data_conn_failed");
- mAGpsApn = null;
- mAGpsDataConnectionState = AGPS_DATA_CONNECTION_CLOSED;
- native_agps_data_conn_failed();
- }
- }
-
- if (mNetworkAvailable) {
- if (mInjectNtpTimePending) {
- mHandler.removeMessages(INJECT_NTP_TIME);
- mHandler.sendMessage(Message.obtain(mHandler, INJECT_NTP_TIME));
- }
- if (mDownloadXtraDataPending) {
- mHandler.removeMessages(DOWNLOAD_XTRA_DATA);
- mHandler.sendMessage(Message.obtain(mHandler, DOWNLOAD_XTRA_DATA));
- }
- }
- }
-
- private void handleInjectNtpTime() {
- if (!mNetworkAvailable) {
- // try again when network is up
- mInjectNtpTimePending = true;
- return;
- }
- mInjectNtpTimePending = false;
-
- SntpClient client = new SntpClient();
- long delay;
-
- if (client.requestTime(mNtpServer, 10000)) {
- long time = client.getNtpTime();
- long timeReference = client.getNtpTimeReference();
- int certainty = (int)(client.getRoundTripTime()/2);
- long now = System.currentTimeMillis();
- long systemTimeOffset = time - now;
-
- Log.d(TAG, "NTP server returned: "
- + time + " (" + new Date(time)
- + ") reference: " + timeReference
- + " certainty: " + certainty
- + " system time offset: " + systemTimeOffset);
-
- // sanity check NTP time and do not use if it is too far from system time
- if (systemTimeOffset < 0) {
- systemTimeOffset = -systemTimeOffset;
- }
- if (systemTimeOffset < MAX_NTP_SYSTEM_TIME_OFFSET) {
- native_inject_time(time, timeReference, certainty);
- } else {
- Log.e(TAG, "NTP time differs from system time by " + systemTimeOffset
- + "ms. Ignoring.");
- }
- delay = NTP_INTERVAL;
- } else {
- if (DEBUG) Log.d(TAG, "requestTime failed");
- delay = RETRY_INTERVAL;
- }
-
- // send delayed message for next NTP injection
- mHandler.removeMessages(INJECT_NTP_TIME);
- mHandler.sendMessageDelayed(Message.obtain(mHandler, INJECT_NTP_TIME), delay);
- }
-
- private void handleDownloadXtraData() {
- if (!mDownloadXtraDataPending) {
- // try again when network is up
- mDownloadXtraDataPending = true;
- return;
- }
- mDownloadXtraDataPending = false;
-
-
- GpsXtraDownloader xtraDownloader = new GpsXtraDownloader(mContext, mProperties);
- byte[] data = xtraDownloader.downloadXtraData();
- if (data != null) {
- if (DEBUG) {
- Log.d(TAG, "calling native_inject_xtra_data");
- }
- native_inject_xtra_data(data, data.length);
- } else {
- // try again later
- mHandler.removeMessages(DOWNLOAD_XTRA_DATA);
- mHandler.sendMessageDelayed(Message.obtain(mHandler, DOWNLOAD_XTRA_DATA), RETRY_INTERVAL);
- }
- }
-
- /**
- * This is called to inform us when another location provider returns a location.
- * Someday we might use this for network location injection to aid the GPS
- */
- public void updateLocation(Location location) {
- mHandler.removeMessages(UPDATE_LOCATION);
- Message m = Message.obtain(mHandler, UPDATE_LOCATION);
- m.obj = location;
- mHandler.sendMessage(m);
- }
-
- private void handleUpdateLocation(Location location) {
- if (location.hasAccuracy()) {
- native_inject_location(location.getLatitude(), location.getLongitude(),
- location.getAccuracy());
- }
- }
-
- /**
- * Returns true if the provider requires access to a
- * satellite-based positioning system (e.g., GPS), false
- * otherwise.
- */
- public boolean requiresSatellite() {
- return true;
- }
-
- /**
- * Returns true if the provider requires access to an appropriate
- * cellular network (e.g., to make use of cell tower IDs), false
- * otherwise.
- */
- public boolean requiresCell() {
- return false;
- }
-
- /**
- * Returns true if the use of this provider may result in a
- * monetary charge to the user, false if use is free. It is up to
- * each provider to give accurate information.
- */
- public boolean hasMonetaryCost() {
- return false;
- }
-
- /**
- * Returns true if the provider is able to provide altitude
- * information, false otherwise. A provider that reports altitude
- * under most circumstances but may occassionally not report it
- * should return true.
- */
- public boolean supportsAltitude() {
- return true;
- }
-
- /**
- * Returns true if the provider is able to provide speed
- * information, false otherwise. A provider that reports speed
- * under most circumstances but may occassionally not report it
- * should return true.
- */
- public boolean supportsSpeed() {
- return true;
- }
-
- /**
- * Returns true if the provider is able to provide bearing
- * information, false otherwise. A provider that reports bearing
- * under most circumstances but may occassionally not report it
- * should return true.
- */
- public boolean supportsBearing() {
- return true;
- }
-
- /**
- * Returns the power requirement for this provider.
- *
- * @return the power requirement for this provider, as one of the
- * constants Criteria.POWER_REQUIREMENT_*.
- */
- public int getPowerRequirement() {
- return Criteria.POWER_HIGH;
- }
-
- /**
- * Returns the horizontal accuracy of this provider
- *
- * @return the accuracy of location from this provider, as one
- * of the constants Criteria.ACCURACY_*.
- */
- public int getAccuracy() {
- return Criteria.ACCURACY_FINE;
- }
-
- /**
- * Enables this provider. When enabled, calls to getStatus()
- * must be handled. Hardware may be started up
- * when the provider is enabled.
- */
- public void enable() {
- synchronized (mHandler) {
- mHandler.removeMessages(ENABLE);
- Message m = Message.obtain(mHandler, ENABLE);
- m.arg1 = 1;
- mHandler.sendMessage(m);
- }
- }
-
- private void handleEnable() {
- if (DEBUG) Log.d(TAG, "handleEnable");
- if (mEnabled) return;
- mEnabled = native_init();
-
- if (mEnabled) {
- if (mSuplServerHost != null) {
- native_set_agps_server(AGPS_TYPE_SUPL, mSuplServerHost, mSuplServerPort);
- }
- if (mC2KServerHost != null) {
- native_set_agps_server(AGPS_TYPE_C2K, mC2KServerHost, mC2KServerPort);
- }
-
- // run event listener thread while we are enabled
- mEventThread = new GpsEventThread();
- mEventThread.start();
- } else {
- Log.w(TAG, "Failed to enable location provider");
- }
- }
-
- /**
- * Disables this provider. When disabled, calls to getStatus()
- * need not be handled. Hardware may be shut
- * down while the provider is disabled.
- */
- public void disable() {
- synchronized (mHandler) {
- mHandler.removeMessages(ENABLE);
- Message m = Message.obtain(mHandler, ENABLE);
- m.arg1 = 0;
- mHandler.sendMessage(m);
- }
- }
-
- private void handleDisable() {
- if (DEBUG) Log.d(TAG, "handleDisable");
- if (!mEnabled) return;
-
- mEnabled = false;
- stopNavigating();
- native_disable();
-
- // make sure our event thread exits
- if (mEventThread != null) {
- try {
- mEventThread.join();
- } catch (InterruptedException e) {
- Log.w(TAG, "InterruptedException when joining mEventThread");
- }
- mEventThread = null;
- }
-
- // do this before releasing wakelock
- native_cleanup();
-
- // The GpsEventThread does not wait for the GPS to shutdown
- // so we need to report the GPS_STATUS_ENGINE_OFF event here
- if (mNavigating) {
- reportStatus(GPS_STATUS_SESSION_END);
- }
- if (mEngineOn) {
- reportStatus(GPS_STATUS_ENGINE_OFF);
- }
- }
-
- public boolean isEnabled() {
- return mEnabled;
- }
-
- public int getStatus(Bundle extras) {
- if (extras != null) {
- extras.putInt("satellites", mSvCount);
- }
- return mStatus;
- }
-
- private void updateStatus(int status, int svCount) {
- if (status != mStatus || svCount != mSvCount) {
- mStatus = status;
- mSvCount = svCount;
- mLocationExtras.putInt("satellites", svCount);
- mStatusUpdateTime = SystemClock.elapsedRealtime();
- }
- }
-
- public long getStatusUpdateTime() {
- return mStatusUpdateTime;
- }
-
- public void enableLocationTracking(boolean enable) {
- synchronized (mHandler) {
- mHandler.removeMessages(ENABLE_TRACKING);
- Message m = Message.obtain(mHandler, ENABLE_TRACKING);
- m.arg1 = (enable ? 1 : 0);
- mHandler.sendMessage(m);
- }
- }
-
- private void handleEnableLocationTracking(boolean enable) {
- if (enable) {
- mTTFF = 0;
- mLastFixTime = 0;
- startNavigating();
- } else {
- mAlarmManager.cancel(mWakeupIntent);
- mAlarmManager.cancel(mTimeoutIntent);
- stopNavigating();
- }
- }
-
- public void setMinTime(long minTime) {
- if (DEBUG) Log.d(TAG, "setMinTime " + minTime);
-
- if (minTime >= 0) {
- int interval = (int)(minTime/1000);
- if (interval < 1) {
- interval = 1;
- }
- mFixInterval = interval;
- }
- }
-
- public String getInternalState() {
- return native_get_internal_state();
- }
-
- private final class Listener implements IBinder.DeathRecipient {
- final IGpsStatusListener mListener;
-
- int mSensors = 0;
-
- Listener(IGpsStatusListener listener) {
- mListener = listener;
- }
-
- public void binderDied() {
- if (DEBUG) Log.d(TAG, "GPS status listener died");
-
- synchronized(mListeners) {
- mListeners.remove(this);
- }
- if (mListener != null) {
- mListener.asBinder().unlinkToDeath(this, 0);
- }
- }
- }
-
- public void addListener(int uid) {
- Message m = Message.obtain(mHandler, ADD_LISTENER);
- m.arg1 = uid;
- mHandler.sendMessage(m);
- }
-
- private void handleAddListener(int uid) {
- synchronized(mListeners) {
- if (mClientUids.indexOfKey(uid) >= 0) {
- // Shouldn't be here -- already have this uid.
- Log.w(TAG, "Duplicate add listener for uid " + uid);
- return;
- }
- mClientUids.put(uid, 0);
- if (mNavigating) {
- try {
- mBatteryStats.noteStartGps(uid);
- } catch (RemoteException e) {
- Log.w(TAG, "RemoteException in addListener");
- }
- }
- }
- }
-
- public void removeListener(int uid) {
- Message m = Message.obtain(mHandler, REMOVE_LISTENER);
- m.arg1 = uid;
- mHandler.sendMessage(m);
- }
-
- private void handleRemoveListener(int uid) {
- synchronized(mListeners) {
- if (mClientUids.indexOfKey(uid) < 0) {
- // Shouldn't be here -- don't have this uid.
- Log.w(TAG, "Unneeded remove listener for uid " + uid);
- return;
- }
- mClientUids.delete(uid);
- if (mNavigating) {
- try {
- mBatteryStats.noteStopGps(uid);
- } catch (RemoteException e) {
- Log.w(TAG, "RemoteException in removeListener");
- }
- }
- }
- }
-
- public boolean sendExtraCommand(String command, Bundle extras) {
-
- if ("delete_aiding_data".equals(command)) {
- return deleteAidingData(extras);
- }
- if ("force_time_injection".equals(command)) {
- mHandler.removeMessages(INJECT_NTP_TIME);
- mHandler.sendMessage(Message.obtain(mHandler, INJECT_NTP_TIME));
- return true;
- }
- if ("force_xtra_injection".equals(command)) {
- if (native_supports_xtra()) {
- xtraDownloadRequest();
- return true;
- }
- return false;
- }
-
- Log.w(TAG, "sendExtraCommand: unknown command " + command);
- return false;
- }
-
- private boolean deleteAidingData(Bundle extras) {
- int flags;
-
- if (extras == null) {
- flags = GPS_DELETE_ALL;
- } else {
- flags = 0;
- if (extras.getBoolean("ephemeris")) flags |= GPS_DELETE_EPHEMERIS;
- if (extras.getBoolean("almanac")) flags |= GPS_DELETE_ALMANAC;
- if (extras.getBoolean("position")) flags |= GPS_DELETE_POSITION;
- if (extras.getBoolean("time")) flags |= GPS_DELETE_TIME;
- if (extras.getBoolean("iono")) flags |= GPS_DELETE_IONO;
- if (extras.getBoolean("utc")) flags |= GPS_DELETE_UTC;
- if (extras.getBoolean("health")) flags |= GPS_DELETE_HEALTH;
- if (extras.getBoolean("svdir")) flags |= GPS_DELETE_SVDIR;
- if (extras.getBoolean("svsteer")) flags |= GPS_DELETE_SVSTEER;
- if (extras.getBoolean("sadata")) flags |= GPS_DELETE_SADATA;
- if (extras.getBoolean("rti")) flags |= GPS_DELETE_RTI;
- if (extras.getBoolean("celldb-info")) flags |= GPS_DELETE_CELLDB_INFO;
- if (extras.getBoolean("all")) flags |= GPS_DELETE_ALL;
- }
-
- if (flags != 0) {
- native_delete_aiding_data(flags);
- return true;
- }
-
- return false;
- }
-
- private void startNavigating() {
- if (!mStarted) {
- if (DEBUG) Log.d(TAG, "startNavigating");
- mStarted = true;
- int positionMode;
- if (Settings.Secure.getInt(mContext.getContentResolver(),
- Settings.Secure.ASSISTED_GPS_ENABLED, 1) != 0) {
- positionMode = GPS_POSITION_MODE_MS_BASED;
- } else {
- positionMode = GPS_POSITION_MODE_STANDALONE;
- }
-
- if (!native_start(positionMode, false, 1)) {
- mStarted = false;
- Log.e(TAG, "native_start failed in startNavigating()");
- return;
- }
-
- // reset SV count to zero
- updateStatus(LocationProvider.TEMPORARILY_UNAVAILABLE, 0);
- mFixCount = 0;
- mFixRequestTime = System.currentTimeMillis();
- // set timer to give up if we do not receive a fix within NO_FIX_TIMEOUT
- // and our fix interval is not short
- if (mFixInterval >= NO_FIX_TIMEOUT) {
- mAlarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
- SystemClock.elapsedRealtime() + NO_FIX_TIMEOUT * 1000, mTimeoutIntent);
- }
- }
- }
-
- private void stopNavigating() {
- if (DEBUG) Log.d(TAG, "stopNavigating");
- if (mStarted) {
- mStarted = false;
- native_stop();
- mTTFF = 0;
- mLastFixTime = 0;
- mLocationFlags = LOCATION_INVALID;
-
- // reset SV count to zero
- updateStatus(LocationProvider.TEMPORARILY_UNAVAILABLE, 0);
- }
- }
-
- private void hibernate() {
- // stop GPS until our next fix interval arrives
- stopNavigating();
- mFixCount = 0;
- mAlarmManager.cancel(mTimeoutIntent);
- mAlarmManager.cancel(mWakeupIntent);
- long now = SystemClock.elapsedRealtime();
- mAlarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
- SystemClock.elapsedRealtime() + mFixInterval * 1000, mWakeupIntent);
- }
-
- /**
- * called from native code to update our position.
- */
- private void reportLocation(int flags, double latitude, double longitude, double altitude,
- float speed, float bearing, float accuracy, long timestamp) {
- if (VERBOSE) Log.v(TAG, "reportLocation lat: " + latitude + " long: " + longitude +
- " timestamp: " + timestamp);
-
- mLastFixTime = System.currentTimeMillis();
- // report time to first fix
- if (mTTFF == 0 && (flags & LOCATION_HAS_LAT_LONG) == LOCATION_HAS_LAT_LONG) {
- mTTFF = (int)(mLastFixTime - mFixRequestTime);
- if (DEBUG) Log.d(TAG, "TTFF: " + mTTFF);
-
- // notify status listeners
- synchronized(mListeners) {
- int size = mListeners.size();
- for (int i = 0; i < size; i++) {
- Listener listener = mListeners.get(i);
- try {
- listener.mListener.onFirstFix(mTTFF);
- } catch (RemoteException e) {
- Log.w(TAG, "RemoteException in stopNavigating");
- mListeners.remove(listener);
- // adjust for size of list changing
- size--;
- }
- }
- }
- }
-
- synchronized (mLocation) {
- mLocationFlags = flags;
- if ((flags & LOCATION_HAS_LAT_LONG) == LOCATION_HAS_LAT_LONG) {
- mLocation.setLatitude(latitude);
- mLocation.setLongitude(longitude);
- mLocation.setTime(timestamp);
- }
- if ((flags & LOCATION_HAS_ALTITUDE) == LOCATION_HAS_ALTITUDE) {
- mLocation.setAltitude(altitude);
- } else {
- mLocation.removeAltitude();
- }
- if ((flags & LOCATION_HAS_SPEED) == LOCATION_HAS_SPEED) {
- mLocation.setSpeed(speed);
- } else {
- mLocation.removeSpeed();
- }
- if ((flags & LOCATION_HAS_BEARING) == LOCATION_HAS_BEARING) {
- mLocation.setBearing(bearing);
- } else {
- mLocation.removeBearing();
- }
- if ((flags & LOCATION_HAS_ACCURACY) == LOCATION_HAS_ACCURACY) {
- mLocation.setAccuracy(accuracy);
- } else {
- mLocation.removeAccuracy();
- }
-
- try {
- mLocationManager.reportLocation(mLocation, false);
- } catch (RemoteException e) {
- Log.e(TAG, "RemoteException calling reportLocation");
- }
- }
-
- if (mStarted && mStatus != LocationProvider.AVAILABLE) {
- // we still want to time out if we do not receive MIN_FIX_COUNT
- // within the time out and we are requesting infrequent fixes
- if (mFixInterval < NO_FIX_TIMEOUT) {
- mAlarmManager.cancel(mTimeoutIntent);
- }
-
- // send an intent to notify that the GPS is receiving fixes.
- Intent intent = new Intent(GPS_FIX_CHANGE_ACTION);
- intent.putExtra(EXTRA_ENABLED, true);
- mContext.sendBroadcast(intent);
- updateStatus(LocationProvider.AVAILABLE, mSvCount);
- }
-
- if (mFixCount++ >= MIN_FIX_COUNT && mFixInterval > 1) {
- if (DEBUG) Log.d(TAG, "exceeded MIN_FIX_COUNT");
- hibernate();
- }
- }
-
- /**
- * called from native code to update our status
- */
- private void reportStatus(int status) {
- if (VERBOSE) Log.v(TAG, "reportStatus status: " + status);
-
- synchronized(mListeners) {
- boolean wasNavigating = mNavigating;
-
- switch (status) {
- case GPS_STATUS_SESSION_BEGIN:
- mNavigating = true;
- mEngineOn = true;
- break;
- case GPS_STATUS_SESSION_END:
- mNavigating = false;
- break;
- case GPS_STATUS_ENGINE_ON:
- mEngineOn = true;
- break;
- case GPS_STATUS_ENGINE_OFF:
- mEngineOn = false;
- mNavigating = false;
- break;
- }
-
- // beware, the events can come out of order
- if ((mNavigating || mEngineOn) && !mWakeLock.isHeld()) {
- if (DEBUG) Log.d(TAG, "Acquiring wakelock");
- mWakeLock.acquire();
- }
-
- if (wasNavigating != mNavigating) {
- int size = mListeners.size();
- for (int i = 0; i < size; i++) {
- Listener listener = mListeners.get(i);
- try {
- if (mNavigating) {
- listener.mListener.onGpsStarted();
- } else {
- listener.mListener.onGpsStopped();
- }
- } catch (RemoteException e) {
- Log.w(TAG, "RemoteException in reportStatus");
- mListeners.remove(listener);
- // adjust for size of list changing
- size--;
- }
- }
-
- try {
- // update battery stats
- for (int i=mClientUids.size() - 1; i >= 0; i--) {
- int uid = mClientUids.keyAt(i);
- if (mNavigating) {
- mBatteryStats.noteStartGps(uid);
- } else {
- mBatteryStats.noteStopGps(uid);
- }
- }
- } catch (RemoteException e) {
- Log.w(TAG, "RemoteException in reportStatus");
- }
-
- // send an intent to notify that the GPS has been enabled or disabled.
- Intent intent = new Intent(GPS_ENABLED_CHANGE_ACTION);
- intent.putExtra(EXTRA_ENABLED, mNavigating);
- mContext.sendBroadcast(intent);
- }
-
- // beware, the events can come out of order
- if (!mNavigating && !mEngineOn && mWakeLock.isHeld()) {
- if (DEBUG) Log.d(TAG, "Releasing wakelock");
- mWakeLock.release();
- }
- }
- }
-
- /**
- * called from native code to update SV info
- */
- private void reportSvStatus() {
-
- int svCount = native_read_sv_status(mSvs, mSnrs, mSvElevations, mSvAzimuths, mSvMasks);
-
- synchronized(mListeners) {
- int size = mListeners.size();
- for (int i = 0; i < size; i++) {
- Listener listener = mListeners.get(i);
- try {
- listener.mListener.onSvStatusChanged(svCount, mSvs, mSnrs,
- mSvElevations, mSvAzimuths, mSvMasks[EPHEMERIS_MASK],
- mSvMasks[ALMANAC_MASK], mSvMasks[USED_FOR_FIX_MASK]);
- } catch (RemoteException e) {
- Log.w(TAG, "RemoteException in reportSvInfo");
- mListeners.remove(listener);
- // adjust for size of list changing
- size--;
- }
- }
- }
-
- if (VERBOSE) {
- Log.v(TAG, "SV count: " + svCount +
- " ephemerisMask: " + Integer.toHexString(mSvMasks[EPHEMERIS_MASK]) +
- " almanacMask: " + Integer.toHexString(mSvMasks[ALMANAC_MASK]));
- for (int i = 0; i < svCount; i++) {
- Log.v(TAG, "sv: " + mSvs[i] +
- " snr: " + (float)mSnrs[i]/10 +
- " elev: " + mSvElevations[i] +
- " azimuth: " + mSvAzimuths[i] +
- ((mSvMasks[EPHEMERIS_MASK] & (1 << (mSvs[i] - 1))) == 0 ? " " : " E") +
- ((mSvMasks[ALMANAC_MASK] & (1 << (mSvs[i] - 1))) == 0 ? " " : " A") +
- ((mSvMasks[USED_FOR_FIX_MASK] & (1 << (mSvs[i] - 1))) == 0 ? "" : "U"));
- }
- }
-
- updateStatus(mStatus, svCount);
-
- if (mNavigating && mStatus == LocationProvider.AVAILABLE && mLastFixTime > 0 &&
- System.currentTimeMillis() - mLastFixTime > RECENT_FIX_TIMEOUT * 1000) {
- // send an intent to notify that the GPS is no longer receiving fixes.
- Intent intent = new Intent(GPS_FIX_CHANGE_ACTION);
- intent.putExtra(EXTRA_ENABLED, false);
- mContext.sendBroadcast(intent);
- updateStatus(LocationProvider.TEMPORARILY_UNAVAILABLE, mSvCount);
- }
- }
-
- /**
- * called from native code to update AGPS status
- */
- private void reportAGpsStatus(int type, int status) {
- switch (status) {
- case GPS_REQUEST_AGPS_DATA_CONN:
- int result = mConnMgr.startUsingNetworkFeature(
- ConnectivityManager.TYPE_MOBILE, Phone.FEATURE_ENABLE_SUPL);
- if (result == Phone.APN_ALREADY_ACTIVE) {
- if (mAGpsApn != null) {
- native_agps_data_conn_open(mAGpsApn);
- mAGpsDataConnectionState = AGPS_DATA_CONNECTION_OPEN;
- } else {
- Log.e(TAG, "mAGpsApn not set when receiving Phone.APN_ALREADY_ACTIVE");
- native_agps_data_conn_failed();
- }
- } else if (result == Phone.APN_REQUEST_STARTED) {
- mAGpsDataConnectionState = AGPS_DATA_CONNECTION_OPENING;
- } else {
- native_agps_data_conn_failed();
- }
- break;
- case GPS_RELEASE_AGPS_DATA_CONN:
- if (mAGpsDataConnectionState != AGPS_DATA_CONNECTION_CLOSED) {
- mConnMgr.stopUsingNetworkFeature(
- ConnectivityManager.TYPE_MOBILE, Phone.FEATURE_ENABLE_SUPL);
- native_agps_data_conn_closed();
- mAGpsDataConnectionState = AGPS_DATA_CONNECTION_CLOSED;
- }
- break;
- case GPS_AGPS_DATA_CONNECTED:
- // Log.d(TAG, "GPS_AGPS_DATA_CONNECTED");
- break;
- case GPS_AGPS_DATA_CONN_DONE:
- // Log.d(TAG, "GPS_AGPS_DATA_CONN_DONE");
- break;
- case GPS_AGPS_DATA_CONN_FAILED:
- // Log.d(TAG, "GPS_AGPS_DATA_CONN_FAILED");
- break;
- }
- }
-
- /**
- * called from native code to report NMEA data received
- */
- private void reportNmea(int index, long timestamp) {
- synchronized(mListeners) {
- int size = mListeners.size();
- if (size > 0) {
- // don't bother creating the String if we have no listeners
- int length = native_read_nmea(index, mNmeaBuffer, mNmeaBuffer.length);
- String nmea = new String(mNmeaBuffer, 0, length);
-
- for (int i = 0; i < size; i++) {
- Listener listener = mListeners.get(i);
- try {
- listener.mListener.onNmeaReceived(timestamp, nmea);
- } catch (RemoteException e) {
- Log.w(TAG, "RemoteException in reportNmea");
- mListeners.remove(listener);
- // adjust for size of list changing
- size--;
- }
- }
- }
- }
- }
-
- /**
- * called from native code to request XTRA data
- */
- private void xtraDownloadRequest() {
- if (DEBUG) Log.d(TAG, "xtraDownloadRequest");
- mHandler.removeMessages(DOWNLOAD_XTRA_DATA);
- mHandler.sendMessage(Message.obtain(mHandler, DOWNLOAD_XTRA_DATA));
- }
-
- //=============================================================
- // NI Client support
- //=============================================================
- private final INetInitiatedListener mNetInitiatedListener = new INetInitiatedListener.Stub() {
- // Sends a response for an NI reqeust to HAL.
- public boolean sendNiResponse(int notificationId, int userResponse)
- {
- // TODO Add Permission check
-
- StringBuilder extrasBuf = new StringBuilder();
-
- if (DEBUG) Log.d(TAG, "sendNiResponse, notifId: " + notificationId +
- ", response: " + userResponse);
-
- native_send_ni_response(notificationId, userResponse);
-
- return true;
- }
- };
-
- public INetInitiatedListener getNetInitiatedListener() {
- return mNetInitiatedListener;
- }
-
- // Called by JNI function to report an NI request.
- @SuppressWarnings("deprecation")
- public void reportNiNotification(
- int notificationId,
- int niType,
- int notifyFlags,
- int timeout,
- int defaultResponse,
- String requestorId,
- String text,
- int requestorIdEncoding,
- int textEncoding,
- String extras // Encoded extra data
- )
- {
- Log.i(TAG, "reportNiNotification: entered");
- Log.i(TAG, "notificationId: " + notificationId +
- ", niType: " + niType +
- ", notifyFlags: " + notifyFlags +
- ", timeout: " + timeout +
- ", defaultResponse: " + defaultResponse);
-
- Log.i(TAG, "requestorId: " + requestorId +
- ", text: " + text +
- ", requestorIdEncoding: " + requestorIdEncoding +
- ", textEncoding: " + textEncoding);
-
- GpsNiNotification notification = new GpsNiNotification();
-
- notification.notificationId = notificationId;
- notification.niType = niType;
- notification.needNotify = (notifyFlags & GpsNetInitiatedHandler.GPS_NI_NEED_NOTIFY) != 0;
- notification.needVerify = (notifyFlags & GpsNetInitiatedHandler.GPS_NI_NEED_VERIFY) != 0;
- notification.privacyOverride = (notifyFlags & GpsNetInitiatedHandler.GPS_NI_PRIVACY_OVERRIDE) != 0;
- notification.timeout = timeout;
- notification.defaultResponse = defaultResponse;
- notification.requestorId = requestorId;
- notification.text = text;
- notification.requestorIdEncoding = requestorIdEncoding;
- notification.textEncoding = textEncoding;
-
- // Process extras, assuming the format is
- // one of more lines of "key = value"
- Bundle bundle = new Bundle();
-
- if (extras == null) extras = "";
- Properties extraProp = new Properties();
-
- try {
- extraProp.load(new StringBufferInputStream(extras));
- }
- catch (IOException e)
- {
- Log.e(TAG, "reportNiNotification cannot parse extras data: " + extras);
- }
-
- for (Entry<Object, Object> ent : extraProp.entrySet())
- {
- bundle.putString((String) ent.getKey(), (String) ent.getValue());
- }
-
- notification.extras = bundle;
-
- mNIHandler.handleNiNotification(notification);
- }
-
- // this thread is used to receive events from the native code.
- // native_wait_for_event() will callback to us via reportLocation(), reportStatus(), etc.
- // this is necessary because native code cannot call Java on a thread that the JVM does
- // not know about.
- private final class GpsEventThread extends Thread {
-
- public GpsEventThread() {
- super("GpsEventThread");
- }
-
- public void run() {
- if (DEBUG) Log.d(TAG, "GpsEventThread starting");
- // Exit as soon as disable() is called instead of waiting for the GPS to stop.
- while (mEnabled) {
- // this will wait for an event from the GPS,
- // which will be reported via reportLocation or reportStatus
- native_wait_for_event();
- }
- if (DEBUG) Log.d(TAG, "GpsEventThread exiting");
- }
- }
-
- private final class ProviderHandler extends Handler {
- @Override
- public void handleMessage(Message msg)
- {
- switch (msg.what) {
- case ENABLE:
- if (msg.arg1 == 1) {
- handleEnable();
- } else {
- handleDisable();
- }
- break;
- case ENABLE_TRACKING:
- handleEnableLocationTracking(msg.arg1 == 1);
- break;
- case UPDATE_NETWORK_STATE:
- handleUpdateNetworkState(msg.arg1, (NetworkInfo)msg.obj);
- break;
- case INJECT_NTP_TIME:
- handleInjectNtpTime();
- break;
- case DOWNLOAD_XTRA_DATA:
- if (native_supports_xtra()) {
- handleDownloadXtraData();
- }
- break;
- case UPDATE_LOCATION:
- handleUpdateLocation((Location)msg.obj);
- break;
- case ADD_LISTENER:
- handleAddListener(msg.arg1);
- break;
- case REMOVE_LISTENER:
- handleRemoveListener(msg.arg1);
- break;
- }
- }
- };
-
- private final class GpsLocationProviderThread extends Thread {
-
- public GpsLocationProviderThread() {
- super("GpsLocationProvider");
- }
-
- public void run() {
- Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
- initialize();
- Looper.prepare();
- mHandler = new ProviderHandler();
- // signal when we are initialized and ready to go
- mInitializedLatch.countDown();
- Looper.loop();
- }
- }
-
- // for GPS SV statistics
- private static final int MAX_SVS = 32;
- private static final int EPHEMERIS_MASK = 0;
- private static final int ALMANAC_MASK = 1;
- private static final int USED_FOR_FIX_MASK = 2;
-
- // preallocated arrays, to avoid memory allocation in reportStatus()
- private int mSvs[] = new int[MAX_SVS];
- private float mSnrs[] = new float[MAX_SVS];
- private float mSvElevations[] = new float[MAX_SVS];
- private float mSvAzimuths[] = new float[MAX_SVS];
- private int mSvMasks[] = new int[3];
- private int mSvCount;
- // preallocated to avoid memory allocation in reportNmea()
- private byte[] mNmeaBuffer = new byte[120];
-
- static { class_init_native(); }
- private static native void class_init_native();
- private static native boolean native_is_supported();
-
- private native boolean native_init();
- private native void native_disable();
- private native void native_cleanup();
- private native boolean native_start(int positionMode, boolean singleFix, int fixInterval);
- private native boolean native_stop();
- private native void native_set_fix_frequency(int fixFrequency);
- private native void native_delete_aiding_data(int flags);
- private native void native_wait_for_event();
- // returns number of SVs
- // mask[0] is ephemeris mask and mask[1] is almanac mask
- private native int native_read_sv_status(int[] svs, float[] snrs,
- float[] elevations, float[] azimuths, int[] masks);
- private native int native_read_nmea(int index, byte[] buffer, int bufferSize);
- private native void native_inject_location(double latitude, double longitude, float accuracy);
-
- // XTRA Support
- private native void native_inject_time(long time, long timeReference, int uncertainty);
- private native boolean native_supports_xtra();
- private native void native_inject_xtra_data(byte[] data, int length);
-
- // DEBUG Support
- private native String native_get_internal_state();
-
- // AGPS Support
- private native void native_agps_data_conn_open(String apn);
- private native void native_agps_data_conn_closed();
- private native void native_agps_data_conn_failed();
- private native void native_set_agps_server(int type, String hostname, int port);
-
- // Network-initiated (NI) Support
- private native void native_send_ni_response(int notificationId, int userResponse);
-}
diff --git a/location/java/com/android/internal/location/GpsNetInitiatedHandler.java b/location/java/com/android/internal/location/GpsNetInitiatedHandler.java
index 2cf9c2b..d3a71b3 100755
--- a/location/java/com/android/internal/location/GpsNetInitiatedHandler.java
+++ b/location/java/com/android/internal/location/GpsNetInitiatedHandler.java
@@ -94,18 +94,18 @@ public class GpsNetInitiatedHandler {
public static class GpsNiNotification
{
- int notificationId;
- int niType;
- boolean needNotify;
- boolean needVerify;
- boolean privacyOverride;
- int timeout;
- int defaultResponse;
- String requestorId;
- String text;
- int requestorIdEncoding;
- int textEncoding;
- Bundle extras;
+ public int notificationId;
+ public int niType;
+ public boolean needNotify;
+ public boolean needVerify;
+ public boolean privacyOverride;
+ public int timeout;
+ public int defaultResponse;
+ public String requestorId;
+ public String text;
+ public int requestorIdEncoding;
+ public int textEncoding;
+ public Bundle extras;
};
public static class GpsNiResponse {
diff --git a/location/java/com/android/internal/location/GpsXtraDownloader.java b/location/java/com/android/internal/location/GpsXtraDownloader.java
deleted file mode 100644
index 978bda2..0000000
--- a/location/java/com/android/internal/location/GpsXtraDownloader.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Copyright (C) 2008 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.internal.location;
-
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpHost;
-import org.apache.http.HttpResponse;
-import org.apache.http.StatusLine;
-import org.apache.http.client.HttpClient;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.methods.HttpUriRequest;
-import org.apache.http.conn.params.ConnRouteParams;
-
-import java.io.DataInputStream;
-import java.io.IOException;
-import java.util.Properties;
-import java.util.Random;
-
-import android.content.Context;
-import android.net.Proxy;
-import android.net.http.AndroidHttpClient;
-import android.util.Config;
-import android.util.Log;
-
-
-
-/**
- * A class for downloading GPS XTRA data.
- *
- * {@hide}
- */
-public class GpsXtraDownloader {
-
- private static final String TAG = "GpsXtraDownloader";
-
- private Context mContext;
- private String[] mXtraServers;
- // to load balance our server requests
- private int mNextServerIndex;
-
- GpsXtraDownloader(Context context, Properties properties) {
- mContext = context;
-
- // read XTRA servers from the Properties object
- int count = 0;
- String server1 = properties.getProperty("XTRA_SERVER_1");
- String server2 = properties.getProperty("XTRA_SERVER_2");
- String server3 = properties.getProperty("XTRA_SERVER_3");
- if (server1 != null) count++;
- if (server2 != null) count++;
- if (server3 != null) count++;
-
- if (count == 0) {
- Log.e(TAG, "No XTRA servers were specified in the GPS configuration");
- return;
- } else {
- mXtraServers = new String[count];
- count = 0;
- if (server1 != null) mXtraServers[count++] = server1;
- if (server2 != null) mXtraServers[count++] = server2;
- if (server3 != null) mXtraServers[count++] = server3;
-
- // randomize first server
- Random random = new Random();
- mNextServerIndex = random.nextInt(count);
- }
- }
-
- byte[] downloadXtraData() {
- String proxyHost = Proxy.getHost(mContext);
- int proxyPort = Proxy.getPort(mContext);
- boolean useProxy = (proxyHost != null && proxyPort != -1);
- byte[] result = null;
- int startIndex = mNextServerIndex;
-
- if (mXtraServers == null) {
- return null;
- }
-
- // load balance our requests among the available servers
- while (result == null) {
- result = doDownload(mXtraServers[mNextServerIndex], useProxy, proxyHost, proxyPort);
-
- // increment mNextServerIndex and wrap around if necessary
- mNextServerIndex++;
- if (mNextServerIndex == mXtraServers.length) {
- mNextServerIndex = 0;
- }
- // break if we have tried all the servers
- if (mNextServerIndex == startIndex) break;
- }
-
- return result;
- }
-
- protected static byte[] doDownload(String url, boolean isProxySet,
- String proxyHost, int proxyPort) {
- if (Config.LOGD) Log.d(TAG, "Downloading XTRA data from " + url);
-
- AndroidHttpClient client = null;
- try {
- client = AndroidHttpClient.newInstance("Android");
- HttpUriRequest req = new HttpGet(url);
-
- if (isProxySet) {
- HttpHost proxy = new HttpHost(proxyHost, proxyPort);
- ConnRouteParams.setDefaultProxy(req.getParams(), proxy);
- }
-
- req.addHeader(
- "Accept",
- "*/*, application/vnd.wap.mms-message, application/vnd.wap.sic");
-
- req.addHeader(
- "x-wap-profile",
- "http://www.openmobilealliance.org/tech/profiles/UAPROF/ccppschema-20021212#");
-
- HttpResponse response = client.execute(req);
- StatusLine status = response.getStatusLine();
- if (status.getStatusCode() != 200) { // HTTP 200 is success.
- if (Config.LOGD) Log.d(TAG, "HTTP error: " + status.getReasonPhrase());
- return null;
- }
-
- HttpEntity entity = response.getEntity();
- byte[] body = null;
- if (entity != null) {
- try {
- if (entity.getContentLength() > 0) {
- body = new byte[(int) entity.getContentLength()];
- DataInputStream dis = new DataInputStream(entity.getContent());
- try {
- dis.readFully(body);
- } finally {
- try {
- dis.close();
- } catch (IOException e) {
- Log.e(TAG, "Unexpected IOException.", e);
- }
- }
- }
- } finally {
- if (entity != null) {
- entity.consumeContent();
- }
- }
- }
- return body;
- } catch (Exception e) {
- if (Config.LOGD) Log.d(TAG, "error " + e);
- } finally {
- if (client != null) {
- client.close();
- }
- }
- return null;
- }
-
-}
diff --git a/location/java/com/android/internal/location/LocationProviderProxy.java b/location/java/com/android/internal/location/LocationProviderProxy.java
deleted file mode 100644
index 31ec09a..0000000
--- a/location/java/com/android/internal/location/LocationProviderProxy.java
+++ /dev/null
@@ -1,384 +0,0 @@
-/*
- * Copyright (C) 2009 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.internal.location;
-
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.ServiceConnection;
-import android.location.ILocationProvider;
-import android.location.Location;
-import android.location.LocationProviderInterface;
-import android.net.NetworkInfo;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.RemoteException;
-import android.os.SystemClock;
-import android.util.Log;
-
-/**
- * A class for proxying location providers implemented as services.
- *
- * {@hide}
- */
-public class LocationProviderProxy implements LocationProviderInterface {
-
- private static final String TAG = "LocationProviderProxy";
-
- private final Context mContext;
- private final String mName;
- private ILocationProvider mProvider;
- private Handler mHandler;
- private final Connection mServiceConnection = new Connection();
-
- // cached values set by the location manager
- private boolean mLocationTracking = false;
- private boolean mEnabled = false;
- private long mMinTime = -1;
- private int mNetworkState;
- private NetworkInfo mNetworkInfo;
-
- // for caching requiresNetwork, requiresSatellite, etc.
- private DummyLocationProvider mCachedAttributes;
-
- // constructor for proxying location providers implemented in a separate service
- public LocationProviderProxy(Context context, String name, String serviceName,
- Handler handler) {
- mContext = context;
- mName = name;
- mHandler = handler;
- mContext.bindService(new Intent(serviceName), mServiceConnection, Context.BIND_AUTO_CREATE);
- }
-
- private class Connection implements ServiceConnection {
- public void onServiceConnected(ComponentName className, IBinder service) {
- Log.d(TAG, "LocationProviderProxy.onServiceConnected " + className);
- synchronized (this) {
- mProvider = ILocationProvider.Stub.asInterface(service);
- if (mProvider != null) {
- mHandler.post(mServiceConnectedTask);
- }
- }
- }
-
- public void onServiceDisconnected(ComponentName className) {
- Log.d(TAG, "LocationProviderProxy.onServiceDisconnected " + className);
- synchronized (this) {
- mProvider = null;
- }
- }
- }
-
- private Runnable mServiceConnectedTask = new Runnable() {
- public void run() {
- ILocationProvider provider;
- synchronized (mServiceConnection) {
- provider = mProvider;
- if (provider == null) {
- return;
- }
- }
-
- if (mCachedAttributes == null) {
- try {
- mCachedAttributes = new DummyLocationProvider(mName);
- mCachedAttributes.setRequiresNetwork(provider.requiresNetwork());
- mCachedAttributes.setRequiresSatellite(provider.requiresSatellite());
- mCachedAttributes.setRequiresCell(provider.requiresCell());
- mCachedAttributes.setHasMonetaryCost(provider.hasMonetaryCost());
- mCachedAttributes.setSupportsAltitude(provider.supportsAltitude());
- mCachedAttributes.setSupportsSpeed(provider.supportsSpeed());
- mCachedAttributes.setSupportsBearing(provider.supportsBearing());
- mCachedAttributes.setPowerRequirement(provider.getPowerRequirement());
- mCachedAttributes.setAccuracy(provider.getAccuracy());
- } catch (RemoteException e) {
- mCachedAttributes = null;
- }
- }
-
- // resend previous values from the location manager if the service has restarted
- try {
- if (mEnabled) {
- provider.enable();
- }
- if (mLocationTracking) {
- provider.enableLocationTracking(true);
- }
- if (mMinTime >= 0) {
- provider.setMinTime(mMinTime);
- }
- if (mNetworkInfo != null) {
- provider.updateNetworkState(mNetworkState, mNetworkInfo);
- }
- } catch (RemoteException e) {
- }
- }
- };
-
- public String getName() {
- return mName;
- }
-
- public boolean requiresNetwork() {
- if (mCachedAttributes != null) {
- return mCachedAttributes.requiresNetwork();
- } else {
- return false;
- }
- }
-
- public boolean requiresSatellite() {
- if (mCachedAttributes != null) {
- return mCachedAttributes.requiresSatellite();
- } else {
- return false;
- }
- }
-
- public boolean requiresCell() {
- if (mCachedAttributes != null) {
- return mCachedAttributes.requiresCell();
- } else {
- return false;
- }
- }
-
- public boolean hasMonetaryCost() {
- if (mCachedAttributes != null) {
- return mCachedAttributes.hasMonetaryCost();
- } else {
- return false;
- }
- }
-
- public boolean supportsAltitude() {
- if (mCachedAttributes != null) {
- return mCachedAttributes.supportsAltitude();
- } else {
- return false;
- }
- }
-
- public boolean supportsSpeed() {
- if (mCachedAttributes != null) {
- return mCachedAttributes.supportsSpeed();
- } else {
- return false;
- }
- }
-
- public boolean supportsBearing() {
- if (mCachedAttributes != null) {
- return mCachedAttributes.supportsBearing();
- } else {
- return false;
- }
- }
-
- public int getPowerRequirement() {
- if (mCachedAttributes != null) {
- return mCachedAttributes.getPowerRequirement();
- } else {
- return -1;
- }
- }
-
- public int getAccuracy() {
- if (mCachedAttributes != null) {
- return mCachedAttributes.getAccuracy();
- } else {
- return -1;
- }
- }
-
- public void enable() {
- mEnabled = true;
- ILocationProvider provider;
- synchronized (mServiceConnection) {
- provider = mProvider;
- }
- if (provider != null) {
- try {
- provider.enable();
- } catch (RemoteException e) {
- }
- }
- }
-
- public void disable() {
- mEnabled = false;
- ILocationProvider provider;
- synchronized (mServiceConnection) {
- provider = mProvider;
- }
- if (provider != null) {
- try {
- provider.disable();
- } catch (RemoteException e) {
- }
- }
- }
-
- public boolean isEnabled() {
- return mEnabled;
- }
-
- public int getStatus(Bundle extras) {
- ILocationProvider provider;
- synchronized (mServiceConnection) {
- provider = mProvider;
- }
- if (provider != null) {
- try {
- return provider.getStatus(extras);
- } catch (RemoteException e) {
- }
- }
- return 0;
- }
-
- public long getStatusUpdateTime() {
- ILocationProvider provider;
- synchronized (mServiceConnection) {
- provider = mProvider;
- }
- if (provider != null) {
- try {
- return provider.getStatusUpdateTime();
- } catch (RemoteException e) {
- }
- }
- return 0;
- }
-
- public String getInternalState() {
- try {
- return mProvider.getInternalState();
- } catch (RemoteException e) {
- Log.e(TAG, "getInternalState failed", e);
- return null;
- }
- }
-
- public boolean isLocationTracking() {
- return mLocationTracking;
- }
-
- public void enableLocationTracking(boolean enable) {
- mLocationTracking = enable;
- if (!enable) {
- mMinTime = -1;
- }
- ILocationProvider provider;
- synchronized (mServiceConnection) {
- provider = mProvider;
- }
- if (provider != null) {
- try {
- provider.enableLocationTracking(enable);
- } catch (RemoteException e) {
- }
- }
- }
-
- public long getMinTime() {
- return mMinTime;
- }
-
- public void setMinTime(long minTime) {
- mMinTime = minTime;
- ILocationProvider provider;
- synchronized (mServiceConnection) {
- provider = mProvider;
- }
- if (provider != null) {
- try {
- provider.setMinTime(minTime);
- } catch (RemoteException e) {
- }
- }
- }
-
- public void updateNetworkState(int state, NetworkInfo info) {
- mNetworkState = state;
- mNetworkInfo = info;
- ILocationProvider provider;
- synchronized (mServiceConnection) {
- provider = mProvider;
- }
- if (provider != null) {
- try {
- provider.updateNetworkState(state, info);
- } catch (RemoteException e) {
- }
- }
- }
-
- public void updateLocation(Location location) {
- ILocationProvider provider;
- synchronized (mServiceConnection) {
- provider = mProvider;
- }
- if (provider != null) {
- try {
- provider.updateLocation(location);
- } catch (RemoteException e) {
- }
- }
- }
-
- public boolean sendExtraCommand(String command, Bundle extras) {
- ILocationProvider provider;
- synchronized (mServiceConnection) {
- provider = mProvider;
- }
- if (provider != null) {
- try {
- provider.sendExtraCommand(command, extras);
- } catch (RemoteException e) {
- }
- }
- return false;
- }
-
- public void addListener(int uid) {
- ILocationProvider provider;
- synchronized (mServiceConnection) {
- provider = mProvider;
- }
- if (provider != null) {
- try {
- provider.addListener(uid);
- } catch (RemoteException e) {
- }
- }
- }
-
- public void removeListener(int uid) {
- ILocationProvider provider;
- synchronized (mServiceConnection) {
- provider = mProvider;
- }
- if (provider != null) {
- try {
- provider.removeListener(uid);
- } catch (RemoteException e) {
- }
- }
- }
-}
diff --git a/location/java/com/android/internal/location/MockProvider.java b/location/java/com/android/internal/location/MockProvider.java
deleted file mode 100644
index d912740..0000000
--- a/location/java/com/android/internal/location/MockProvider.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- * Copyright (C) 2009 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.internal.location;
-
-import android.location.ILocationManager;
-import android.location.Location;
-import android.location.LocationProvider;
-import android.location.LocationProviderInterface;
-import android.net.NetworkInfo;
-import android.os.Bundle;
-import android.os.RemoteException;
-import android.util.Log;
-import android.util.PrintWriterPrinter;
-
-import java.io.PrintWriter;
-
-/**
- * A mock location provider used by LocationManagerService to implement test providers.
- *
- * {@hide}
- */
-public class MockProvider implements LocationProviderInterface {
- private final String mName;
- private final ILocationManager mLocationManager;
- private final boolean mRequiresNetwork;
- private final boolean mRequiresSatellite;
- private final boolean mRequiresCell;
- private final boolean mHasMonetaryCost;
- private final boolean mSupportsAltitude;
- private final boolean mSupportsSpeed;
- private final boolean mSupportsBearing;
- private final int mPowerRequirement;
- private final int mAccuracy;
- private final Location mLocation;
- private int mStatus;
- private long mStatusUpdateTime;
- private final Bundle mExtras = new Bundle();
- private boolean mHasLocation;
- private boolean mHasStatus;
- private boolean mEnabled;
-
- private static final String TAG = "MockProvider";
-
- public MockProvider(String name, ILocationManager locationManager,
- boolean requiresNetwork, boolean requiresSatellite,
- boolean requiresCell, boolean hasMonetaryCost, boolean supportsAltitude,
- boolean supportsSpeed, boolean supportsBearing, int powerRequirement, int accuracy) {
- mName = name;
- mLocationManager = locationManager;
- mRequiresNetwork = requiresNetwork;
- mRequiresSatellite = requiresSatellite;
- mRequiresCell = requiresCell;
- mHasMonetaryCost = hasMonetaryCost;
- mSupportsAltitude = supportsAltitude;
- mSupportsBearing = supportsBearing;
- mSupportsSpeed = supportsSpeed;
- mPowerRequirement = powerRequirement;
- mAccuracy = accuracy;
- mLocation = new Location(name);
- }
-
- public String getName() {
- return mName;
- }
-
- public void disable() {
- mEnabled = false;
- }
-
- public void enable() {
- mEnabled = true;
- }
-
- public boolean isEnabled() {
- return mEnabled;
- }
-
- public int getStatus(Bundle extras) {
- if (mHasStatus) {
- extras.clear();
- extras.putAll(mExtras);
- return mStatus;
- } else {
- return LocationProvider.AVAILABLE;
- }
- }
-
- public long getStatusUpdateTime() {
- return mStatusUpdateTime;
- }
-
- public int getAccuracy() {
- return mAccuracy;
- }
-
- public int getPowerRequirement() {
- return mPowerRequirement;
- }
-
- public boolean hasMonetaryCost() {
- return mHasMonetaryCost;
- }
-
- public boolean requiresCell() {
- return mRequiresCell;
- }
-
- public boolean requiresNetwork() {
- return mRequiresNetwork;
- }
-
- public boolean requiresSatellite() {
- return mRequiresSatellite;
- }
-
- public boolean supportsAltitude() {
- return mSupportsAltitude;
- }
-
- public boolean supportsBearing() {
- return mSupportsBearing;
- }
-
- public boolean supportsSpeed() {
- return mSupportsSpeed;
- }
-
- public void setLocation(Location l) {
- mLocation.set(l);
- mHasLocation = true;
- try {
- mLocationManager.reportLocation(mLocation, false);
- } catch (RemoteException e) {
- Log.e(TAG, "RemoteException calling reportLocation");
- }
- }
-
- public void clearLocation() {
- mHasLocation = false;
- }
-
- public void setStatus(int status, Bundle extras, long updateTime) {
- mStatus = status;
- mStatusUpdateTime = updateTime;
- mExtras.clear();
- if (extras != null) {
- mExtras.putAll(extras);
- }
- mHasStatus = true;
- }
-
- public void clearStatus() {
- mHasStatus = false;
- mStatusUpdateTime = 0;
- }
-
- public String getInternalState() {
- return null;
- }
-
- public void enableLocationTracking(boolean enable) {
- }
-
- public void setMinTime(long minTime) {
- }
-
- public void updateNetworkState(int state, NetworkInfo info) {
- }
-
- public void updateLocation(Location location) {
- }
-
- public boolean sendExtraCommand(String command, Bundle extras) {
- return false;
- }
-
- public void addListener(int uid) {
- }
-
- public void removeListener(int uid) {
- }
-
- public void dump(PrintWriter pw, String prefix) {
- pw.println(prefix + mName);
- pw.println(prefix + "mHasLocation=" + mHasLocation);
- pw.println(prefix + "mLocation:");
- mLocation.dump(new PrintWriterPrinter(pw), prefix + " ");
- pw.println(prefix + "mHasStatus=" + mHasStatus);
- pw.println(prefix + "mStatus=" + mStatus);
- pw.println(prefix + "mStatusUpdateTime=" + mStatusUpdateTime);
- pw.println(prefix + "mExtras=" + mExtras);
- }
-}
diff --git a/location/java/com/android/internal/location/PassiveProvider.java b/location/java/com/android/internal/location/PassiveProvider.java
deleted file mode 100644
index ab90937..0000000
--- a/location/java/com/android/internal/location/PassiveProvider.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Copyright (C) 2010 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.internal.location;
-
-import android.location.ILocationManager;
-import android.location.Location;
-import android.location.LocationManager;
-import android.location.LocationProvider;
-import android.location.LocationProviderInterface;
-import android.net.NetworkInfo;
-import android.os.Bundle;
-import android.os.RemoteException;
-import android.util.Log;
-
-/**
- * A passive location provider reports locations received from other providers
- * for clients that want to listen passively without actually triggering
- * location updates.
- *
- * {@hide}
- */
-public class PassiveProvider implements LocationProviderInterface {
-
- private static final String TAG = "PassiveProvider";
-
- private final ILocationManager mLocationManager;
- private boolean mTracking;
-
- public PassiveProvider(ILocationManager locationManager) {
- mLocationManager = locationManager;
- }
-
- public String getName() {
- return LocationManager.PASSIVE_PROVIDER;
- }
-
- public boolean requiresNetwork() {
- return false;
- }
-
- public boolean requiresSatellite() {
- return false;
- }
-
- public boolean requiresCell() {
- return false;
- }
-
- public boolean hasMonetaryCost() {
- return false;
- }
-
- public boolean supportsAltitude() {
- return false;
- }
-
- public boolean supportsSpeed() {
- return false;
- }
-
- public boolean supportsBearing() {
- return false;
- }
-
- public int getPowerRequirement() {
- return -1;
- }
-
- public int getAccuracy() {
- return -1;
- }
-
- public boolean isEnabled() {
- return true;
- }
-
- public void enable() {
- }
-
- public void disable() {
- }
-
- public int getStatus(Bundle extras) {
- if (mTracking) {
- return LocationProvider.AVAILABLE;
- } else {
- return LocationProvider.TEMPORARILY_UNAVAILABLE;
- }
- }
-
- public long getStatusUpdateTime() {
- return -1;
- }
-
- public String getInternalState() {
- return null;
- }
-
- public void enableLocationTracking(boolean enable) {
- mTracking = enable;
- }
-
- public void setMinTime(long minTime) {
- }
-
- public void updateNetworkState(int state, NetworkInfo info) {
- }
-
- public void updateLocation(Location location) {
- if (mTracking) {
- try {
- // pass the location back to the location manager
- mLocationManager.reportLocation(location, true);
- } catch (RemoteException e) {
- Log.e(TAG, "RemoteException calling reportLocation");
- }
- }
- }
-
- public boolean sendExtraCommand(String command, Bundle extras) {
- return false;
- }
-
- public void addListener(int uid) {
- }
-
- public void removeListener(int uid) {
- }
-}