LocationProviderProxy.java revision e97ae40dffe7d7f8917c51c4f3f6c1b18c238565
1e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood/* 2e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood * Copyright (C) 2009 The Android Open Source Project 3e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood * 4e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood * Licensed under the Apache License, Version 2.0 (the "License"); 5e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood * you may not use this file except in compliance with the License. 6e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood * You may obtain a copy of the License at 7e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood * 8e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood * http://www.apache.org/licenses/LICENSE-2.0 9e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood * 10e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood * Unless required by applicable law or agreed to in writing, software 11e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood * distributed under the License is distributed on an "AS IS" BASIS, 12e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood * See the License for the specific language governing permissions and 14e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood * limitations under the License. 15e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood */ 16e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood 1700b74270c9f136a8727c5f6cda0997a3a905f385Mike Lockwoodpackage com.android.server.location; 18e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood 19628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwoodimport android.content.ComponentName; 20628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwoodimport android.content.Context; 21628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwoodimport android.content.Intent; 22628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwoodimport android.content.ServiceConnection; 2303ca216ac19ea4e7afcb183c20c7c780f0d97756Mike Lockwoodimport android.location.Criteria; 24e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwoodimport android.location.ILocationProvider; 25e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwoodimport android.location.Location; 2603d246779ea65fc2bd10d0b4f32620f45211133aMike Lockwoodimport android.net.NetworkInfo; 27e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwoodimport android.os.Bundle; 28628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwoodimport android.os.Handler; 293681f2614fa8c10560c790f6b4287f65d6fd2663Mike Lockwoodimport android.os.IBinder; 30e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwoodimport android.os.RemoteException; 31628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwoodimport android.os.SystemClock; 327e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackbornimport android.os.WorkSource; 33e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwoodimport android.util.Log; 34e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood 3500b74270c9f136a8727c5f6cda0997a3a905f385Mike Lockwoodimport com.android.internal.location.DummyLocationProvider; 3600b74270c9f136a8727c5f6cda0997a3a905f385Mike Lockwood 37e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood/** 38d03ff94fe58045b5bd1dd783fb98026778a4265dMike Lockwood * A class for proxying location providers implemented as services. 39e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood * 40e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood * {@hide} 41e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood */ 42d03ff94fe58045b5bd1dd783fb98026778a4265dMike Lockwoodpublic class LocationProviderProxy implements LocationProviderInterface { 43e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood 44e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood private static final String TAG = "LocationProviderProxy"; 45e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood 46628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood private final Context mContext; 4715e3d0f082d551f8819fbe4b0d502cc108627876Mike Lockwood private final String mName; 48e97ae40dffe7d7f8917c51c4f3f6c1b18c238565Mike Lockwood private final String mServiceName; 49628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood private ILocationProvider mProvider; 50628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood private Handler mHandler; 51628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood private final Connection mServiceConnection = new Connection(); 52628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood 53628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood // cached values set by the location manager 5415e3d0f082d551f8819fbe4b0d502cc108627876Mike Lockwood private boolean mLocationTracking = false; 552cd543aad5cc38fb3e7158f1cc5080c7e9ff5d24Mike Lockwood private boolean mEnabled = false; 56628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood private long mMinTime = -1; 577e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn private WorkSource mMinTimeSource = new WorkSource(); 58628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood private int mNetworkState; 59628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood private NetworkInfo mNetworkInfo; 60e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood 61628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood // for caching requiresNetwork, requiresSatellite, etc. 62628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood private DummyLocationProvider mCachedAttributes; 63628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood 64628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood // constructor for proxying location providers implemented in a separate service 65628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood public LocationProviderProxy(Context context, String name, String serviceName, 66628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood Handler handler) { 67628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood mContext = context; 68628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood mName = name; 69e97ae40dffe7d7f8917c51c4f3f6c1b18c238565Mike Lockwood mServiceName = serviceName; 70628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood mHandler = handler; 71d03ff94fe58045b5bd1dd783fb98026778a4265dMike Lockwood mContext.bindService(new Intent(serviceName), mServiceConnection, Context.BIND_AUTO_CREATE); 72628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } 73628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood 74e97ae40dffe7d7f8917c51c4f3f6c1b18c238565Mike Lockwood public void reconnect() { 75e97ae40dffe7d7f8917c51c4f3f6c1b18c238565Mike Lockwood synchronized (mServiceConnection) { 76e97ae40dffe7d7f8917c51c4f3f6c1b18c238565Mike Lockwood // unbind first 77e97ae40dffe7d7f8917c51c4f3f6c1b18c238565Mike Lockwood mContext.unbindService(mServiceConnection); 78e97ae40dffe7d7f8917c51c4f3f6c1b18c238565Mike Lockwood mContext.bindService(new Intent(mServiceName), mServiceConnection, 79e97ae40dffe7d7f8917c51c4f3f6c1b18c238565Mike Lockwood Context.BIND_AUTO_CREATE); 80e97ae40dffe7d7f8917c51c4f3f6c1b18c238565Mike Lockwood } 81e97ae40dffe7d7f8917c51c4f3f6c1b18c238565Mike Lockwood } 82e97ae40dffe7d7f8917c51c4f3f6c1b18c238565Mike Lockwood 83628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood private class Connection implements ServiceConnection { 84628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood public void onServiceConnected(ComponentName className, IBinder service) { 85628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood Log.d(TAG, "LocationProviderProxy.onServiceConnected " + className); 86e97ae40dffe7d7f8917c51c4f3f6c1b18c238565Mike Lockwood synchronized (mServiceConnection) { 87628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood mProvider = ILocationProvider.Stub.asInterface(service); 88628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood if (mProvider != null) { 89628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood mHandler.post(mServiceConnectedTask); 90628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } 91628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } 92628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } 93628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood 94628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood public void onServiceDisconnected(ComponentName className) { 95628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood Log.d(TAG, "LocationProviderProxy.onServiceDisconnected " + className); 96e97ae40dffe7d7f8917c51c4f3f6c1b18c238565Mike Lockwood synchronized (mServiceConnection) { 97628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood mProvider = null; 98628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } 99fff2fda0199dedbf1079454dca98a81190dce765Suchi Amalapurapu } 100fff2fda0199dedbf1079454dca98a81190dce765Suchi Amalapurapu } 101fff2fda0199dedbf1079454dca98a81190dce765Suchi Amalapurapu 102628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood private Runnable mServiceConnectedTask = new Runnable() { 103628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood public void run() { 104628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood ILocationProvider provider; 105628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood synchronized (mServiceConnection) { 106628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood provider = mProvider; 107628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood if (provider == null) { 108628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood return; 109628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } 110628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } 111628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood 112628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood if (mCachedAttributes == null) { 113628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood try { 11403ca216ac19ea4e7afcb183c20c7c780f0d97756Mike Lockwood mCachedAttributes = new DummyLocationProvider(mName, null); 115628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood mCachedAttributes.setRequiresNetwork(provider.requiresNetwork()); 116628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood mCachedAttributes.setRequiresSatellite(provider.requiresSatellite()); 117628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood mCachedAttributes.setRequiresCell(provider.requiresCell()); 118628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood mCachedAttributes.setHasMonetaryCost(provider.hasMonetaryCost()); 119628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood mCachedAttributes.setSupportsAltitude(provider.supportsAltitude()); 120628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood mCachedAttributes.setSupportsSpeed(provider.supportsSpeed()); 121628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood mCachedAttributes.setSupportsBearing(provider.supportsBearing()); 122628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood mCachedAttributes.setPowerRequirement(provider.getPowerRequirement()); 123628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood mCachedAttributes.setAccuracy(provider.getAccuracy()); 124628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } catch (RemoteException e) { 125628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood mCachedAttributes = null; 126628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } 127628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } 128628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood 129628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood // resend previous values from the location manager if the service has restarted 130628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood try { 131628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood if (mEnabled) { 132628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood provider.enable(); 133628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } 134628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood if (mLocationTracking) { 135628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood provider.enableLocationTracking(true); 136628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } 137628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood if (mMinTime >= 0) { 1387e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn provider.setMinTime(mMinTime, mMinTimeSource); 139628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } 140628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood if (mNetworkInfo != null) { 141628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood provider.updateNetworkState(mNetworkState, mNetworkInfo); 142628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } 143628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } catch (RemoteException e) { 144628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } 145628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } 146628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood }; 147628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood 14815e3d0f082d551f8819fbe4b0d502cc108627876Mike Lockwood public String getName() { 14915e3d0f082d551f8819fbe4b0d502cc108627876Mike Lockwood return mName; 15015e3d0f082d551f8819fbe4b0d502cc108627876Mike Lockwood } 15115e3d0f082d551f8819fbe4b0d502cc108627876Mike Lockwood 152e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood public boolean requiresNetwork() { 153628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood if (mCachedAttributes != null) { 154628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood return mCachedAttributes.requiresNetwork(); 155628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } else { 156e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood return false; 157e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood } 158e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood } 159e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood 160e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood public boolean requiresSatellite() { 161628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood if (mCachedAttributes != null) { 162628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood return mCachedAttributes.requiresSatellite(); 163628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } else { 164e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood return false; 165e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood } 166e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood } 167e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood 168e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood public boolean requiresCell() { 169628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood if (mCachedAttributes != null) { 170628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood return mCachedAttributes.requiresCell(); 171628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } else { 172e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood return false; 173e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood } 174e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood } 175e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood 176e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood public boolean hasMonetaryCost() { 177628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood if (mCachedAttributes != null) { 178628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood return mCachedAttributes.hasMonetaryCost(); 179628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } else { 180e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood return false; 181e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood } 182e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood } 183e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood 184e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood public boolean supportsAltitude() { 185628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood if (mCachedAttributes != null) { 186628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood return mCachedAttributes.supportsAltitude(); 187628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } else { 188e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood return false; 189e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood } 190e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood } 191e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood 192e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood public boolean supportsSpeed() { 193628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood if (mCachedAttributes != null) { 194628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood return mCachedAttributes.supportsSpeed(); 195628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } else { 196e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood return false; 197e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood } 198e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood } 199e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood 20015e3d0f082d551f8819fbe4b0d502cc108627876Mike Lockwood public boolean supportsBearing() { 201628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood if (mCachedAttributes != null) { 202628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood return mCachedAttributes.supportsBearing(); 203628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } else { 204e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood return false; 205e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood } 206e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood } 207e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood 208e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood public int getPowerRequirement() { 209628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood if (mCachedAttributes != null) { 210628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood return mCachedAttributes.getPowerRequirement(); 211628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } else { 212628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood return -1; 213e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood } 214e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood } 215e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood 21603ca216ac19ea4e7afcb183c20c7c780f0d97756Mike Lockwood public boolean meetsCriteria(Criteria criteria) { 21703ca216ac19ea4e7afcb183c20c7c780f0d97756Mike Lockwood ILocationProvider provider; 21803ca216ac19ea4e7afcb183c20c7c780f0d97756Mike Lockwood synchronized (mServiceConnection) { 21903ca216ac19ea4e7afcb183c20c7c780f0d97756Mike Lockwood provider = mProvider; 22003ca216ac19ea4e7afcb183c20c7c780f0d97756Mike Lockwood } 22103ca216ac19ea4e7afcb183c20c7c780f0d97756Mike Lockwood if (provider != null) { 22203ca216ac19ea4e7afcb183c20c7c780f0d97756Mike Lockwood try { 22303ca216ac19ea4e7afcb183c20c7c780f0d97756Mike Lockwood return provider.meetsCriteria(criteria); 22403ca216ac19ea4e7afcb183c20c7c780f0d97756Mike Lockwood } catch (RemoteException e) { 22503ca216ac19ea4e7afcb183c20c7c780f0d97756Mike Lockwood } 22603ca216ac19ea4e7afcb183c20c7c780f0d97756Mike Lockwood } 22703ca216ac19ea4e7afcb183c20c7c780f0d97756Mike Lockwood // default implementation if we lost connection to the provider 22803ca216ac19ea4e7afcb183c20c7c780f0d97756Mike Lockwood if ((criteria.getAccuracy() != Criteria.NO_REQUIREMENT) && 22903ca216ac19ea4e7afcb183c20c7c780f0d97756Mike Lockwood (criteria.getAccuracy() < getAccuracy())) { 23003ca216ac19ea4e7afcb183c20c7c780f0d97756Mike Lockwood return false; 23103ca216ac19ea4e7afcb183c20c7c780f0d97756Mike Lockwood } 23203ca216ac19ea4e7afcb183c20c7c780f0d97756Mike Lockwood int criteriaPower = criteria.getPowerRequirement(); 23303ca216ac19ea4e7afcb183c20c7c780f0d97756Mike Lockwood if ((criteriaPower != Criteria.NO_REQUIREMENT) && 23403ca216ac19ea4e7afcb183c20c7c780f0d97756Mike Lockwood (criteriaPower < getPowerRequirement())) { 23503ca216ac19ea4e7afcb183c20c7c780f0d97756Mike Lockwood return false; 23603ca216ac19ea4e7afcb183c20c7c780f0d97756Mike Lockwood } 23703ca216ac19ea4e7afcb183c20c7c780f0d97756Mike Lockwood if (criteria.isAltitudeRequired() && !supportsAltitude()) { 23803ca216ac19ea4e7afcb183c20c7c780f0d97756Mike Lockwood return false; 23903ca216ac19ea4e7afcb183c20c7c780f0d97756Mike Lockwood } 24003ca216ac19ea4e7afcb183c20c7c780f0d97756Mike Lockwood if (criteria.isSpeedRequired() && !supportsSpeed()) { 24103ca216ac19ea4e7afcb183c20c7c780f0d97756Mike Lockwood return false; 24203ca216ac19ea4e7afcb183c20c7c780f0d97756Mike Lockwood } 24303ca216ac19ea4e7afcb183c20c7c780f0d97756Mike Lockwood if (criteria.isBearingRequired() && !supportsBearing()) { 24403ca216ac19ea4e7afcb183c20c7c780f0d97756Mike Lockwood return false; 24503ca216ac19ea4e7afcb183c20c7c780f0d97756Mike Lockwood } 24603ca216ac19ea4e7afcb183c20c7c780f0d97756Mike Lockwood return true; 24703ca216ac19ea4e7afcb183c20c7c780f0d97756Mike Lockwood } 24803ca216ac19ea4e7afcb183c20c7c780f0d97756Mike Lockwood 249e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood public int getAccuracy() { 250628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood if (mCachedAttributes != null) { 251628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood return mCachedAttributes.getAccuracy(); 252628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } else { 253628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood return -1; 254e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood } 255e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood } 256e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood 257e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood public void enable() { 258628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood mEnabled = true; 259628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood ILocationProvider provider; 260628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood synchronized (mServiceConnection) { 261628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood provider = mProvider; 262628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } 263628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood if (provider != null) { 264628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood try { 265628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood provider.enable(); 266628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } catch (RemoteException e) { 267628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } 268e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood } 269e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood } 270e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood 271e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood public void disable() { 272628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood mEnabled = false; 273628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood ILocationProvider provider; 274628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood synchronized (mServiceConnection) { 275628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood provider = mProvider; 276628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } 277628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood if (provider != null) { 278628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood try { 279628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood provider.disable(); 280628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } catch (RemoteException e) { 281628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } 282e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood } 283e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood } 284e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood 285e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood public boolean isEnabled() { 2862cd543aad5cc38fb3e7158f1cc5080c7e9ff5d24Mike Lockwood return mEnabled; 287e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood } 288e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood 289e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood public int getStatus(Bundle extras) { 290628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood ILocationProvider provider; 291628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood synchronized (mServiceConnection) { 292628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood provider = mProvider; 293e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood } 294628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood if (provider != null) { 295628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood try { 296628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood return provider.getStatus(extras); 297628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } catch (RemoteException e) { 298628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } 299628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } 300628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood return 0; 301e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood } 302e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood 303e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood public long getStatusUpdateTime() { 304628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood ILocationProvider provider; 305628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood synchronized (mServiceConnection) { 306628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood provider = mProvider; 307e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood } 308628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood if (provider != null) { 309628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood try { 310628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood return provider.getStatusUpdateTime(); 311628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } catch (RemoteException e) { 312628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } 313628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } 314628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood return 0; 315628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } 316e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood 3173c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger public String getInternalState() { 3183c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger try { 3193c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger return mProvider.getInternalState(); 3203c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger } catch (RemoteException e) { 3213c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger Log.e(TAG, "getInternalState failed", e); 3223c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger return null; 3233c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger } 3243c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger } 3253c8fbdf5dd19fad0b3006557716ee1026d7d5899Fred Fettinger 32615e3d0f082d551f8819fbe4b0d502cc108627876Mike Lockwood public boolean isLocationTracking() { 32715e3d0f082d551f8819fbe4b0d502cc108627876Mike Lockwood return mLocationTracking; 32815e3d0f082d551f8819fbe4b0d502cc108627876Mike Lockwood } 32915e3d0f082d551f8819fbe4b0d502cc108627876Mike Lockwood 330e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood public void enableLocationTracking(boolean enable) { 33115e3d0f082d551f8819fbe4b0d502cc108627876Mike Lockwood mLocationTracking = enable; 332628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood if (!enable) { 333628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood mMinTime = -1; 3347e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mMinTimeSource.clear(); 335628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } 336628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood ILocationProvider provider; 337628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood synchronized (mServiceConnection) { 338628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood provider = mProvider; 339628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } 340628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood if (provider != null) { 341628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood try { 342628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood provider.enableLocationTracking(enable); 343628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } catch (RemoteException e) { 344628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } 345e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood } 346e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood } 347e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood 34803ca216ac19ea4e7afcb183c20c7c780f0d97756Mike Lockwood public boolean requestSingleShotFix() { 34903ca216ac19ea4e7afcb183c20c7c780f0d97756Mike Lockwood return false; 35003ca216ac19ea4e7afcb183c20c7c780f0d97756Mike Lockwood } 35103ca216ac19ea4e7afcb183c20c7c780f0d97756Mike Lockwood 35215e3d0f082d551f8819fbe4b0d502cc108627876Mike Lockwood public long getMinTime() { 35315e3d0f082d551f8819fbe4b0d502cc108627876Mike Lockwood return mMinTime; 35415e3d0f082d551f8819fbe4b0d502cc108627876Mike Lockwood } 35515e3d0f082d551f8819fbe4b0d502cc108627876Mike Lockwood 3567e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn public void setMinTime(long minTime, WorkSource ws) { 3577e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mMinTime = minTime; 3587e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn mMinTimeSource.set(ws); 359628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood ILocationProvider provider; 360628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood synchronized (mServiceConnection) { 361628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood provider = mProvider; 362628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } 363628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood if (provider != null) { 364628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood try { 3657e9f4eb2608148436cef36c9969bf8a599b39e72Dianne Hackborn provider.setMinTime(minTime, ws); 366628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } catch (RemoteException e) { 367628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } 368e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood } 369e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood } 370e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood 37103d246779ea65fc2bd10d0b4f32620f45211133aMike Lockwood public void updateNetworkState(int state, NetworkInfo info) { 372628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood mNetworkState = state; 373628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood mNetworkInfo = info; 374628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood ILocationProvider provider; 375628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood synchronized (mServiceConnection) { 376628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood provider = mProvider; 377628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } 378628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood if (provider != null) { 379628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood try { 380628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood provider.updateNetworkState(state, info); 381628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } catch (RemoteException e) { 382628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } 383e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood } 384e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood } 385e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood 386fd6e5f0dda50e113db4ccc55338b6c4f09da37a4Mike Lockwood public void updateLocation(Location location) { 387628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood ILocationProvider provider; 388628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood synchronized (mServiceConnection) { 389628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood provider = mProvider; 390628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } 391628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood if (provider != null) { 392628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood try { 393628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood provider.updateLocation(location); 394628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } catch (RemoteException e) { 395628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } 396fd6e5f0dda50e113db4ccc55338b6c4f09da37a4Mike Lockwood } 397fd6e5f0dda50e113db4ccc55338b6c4f09da37a4Mike Lockwood } 398fd6e5f0dda50e113db4ccc55338b6c4f09da37a4Mike Lockwood 399e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood public boolean sendExtraCommand(String command, Bundle extras) { 400628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood ILocationProvider provider; 401628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood synchronized (mServiceConnection) { 402628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood provider = mProvider; 403e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood } 404628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood if (provider != null) { 405628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood try { 406628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood provider.sendExtraCommand(command, extras); 407628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } catch (RemoteException e) { 408628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } 409628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } 410628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood return false; 411e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood } 412e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood 4132f82c4eb0b4d315481ad79725ad6f52c5ec69685Mike Lockwood public void addListener(int uid) { 414628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood ILocationProvider provider; 415628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood synchronized (mServiceConnection) { 416628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood provider = mProvider; 417628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } 418628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood if (provider != null) { 419628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood try { 420628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood provider.addListener(uid); 421628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } catch (RemoteException e) { 422628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } 423e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood } 424e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood } 425e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood 4262f82c4eb0b4d315481ad79725ad6f52c5ec69685Mike Lockwood public void removeListener(int uid) { 427628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood ILocationProvider provider; 428628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood synchronized (mServiceConnection) { 429628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood provider = mProvider; 430628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } 431628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood if (provider != null) { 432628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood try { 433628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood provider.removeListener(uid); 434628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } catch (RemoteException e) { 435628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood } 436e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood } 4373681f2614fa8c10560c790f6b4287f65d6fd2663Mike Lockwood } 438e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood} 439