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