blob: a227ab66bfbcbbcec5f5e4ca1ac1d2c830102178 [file] [log] [blame]
Mike Lockwoode932f7f2009-04-06 10:51:26 -07001/*
2 * Copyright (C) 2009 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Mike Lockwood00b74272010-03-26 10:41:48 -040017package com.android.server.location;
Mike Lockwoode932f7f2009-04-06 10:51:26 -070018
Mike Lockwood628fd6d2010-01-25 22:46:13 -050019import android.content.ComponentName;
20import android.content.Context;
21import android.content.Intent;
22import android.content.ServiceConnection;
Mike Lockwood03ca2162010-04-01 08:10:09 -070023import android.location.Criteria;
Mike Lockwoode932f7f2009-04-06 10:51:26 -070024import android.location.ILocationProvider;
25import android.location.Location;
Mike Lockwood03d24672009-10-08 15:45:03 -040026import android.net.NetworkInfo;
Mike Lockwoode932f7f2009-04-06 10:51:26 -070027import android.os.Bundle;
Mike Lockwood628fd6d2010-01-25 22:46:13 -050028import android.os.Handler;
Mike Lockwood3681f262009-05-12 10:52:03 -040029import android.os.IBinder;
Mike Lockwoode932f7f2009-04-06 10:51:26 -070030import android.os.RemoteException;
Dianne Hackborn7e9f4eb2010-09-10 18:43:00 -070031import android.os.WorkSource;
Mike Lockwoode932f7f2009-04-06 10:51:26 -070032import android.util.Log;
33
Mike Lockwood00b74272010-03-26 10:41:48 -040034import com.android.internal.location.DummyLocationProvider;
35
Mike Lockwoode932f7f2009-04-06 10:51:26 -070036/**
Mike Lockwoodd03ff942010-02-09 08:46:14 -050037 * A class for proxying location providers implemented as services.
Mike Lockwoode932f7f2009-04-06 10:51:26 -070038 *
39 * {@hide}
40 */
Mike Lockwoodd03ff942010-02-09 08:46:14 -050041public class LocationProviderProxy implements LocationProviderInterface {
Mike Lockwoode932f7f2009-04-06 10:51:26 -070042
43 private static final String TAG = "LocationProviderProxy";
44
Nick Pelly00355d52012-05-27 16:12:45 -070045 public static final String SERVICE_ACTION =
46 "com.android.location.service.NetworkLocationProvider";
47
Mike Lockwood628fd6d2010-01-25 22:46:13 -050048 private final Context mContext;
Mike Lockwood15e3d0f2009-05-01 07:53:28 -040049 private final String mName;
Mark Vandevoorde8863c432010-10-04 14:23:24 -070050 private final Intent mIntent;
51 private final Handler mHandler;
52 private final Object mMutex = new Object(); // synchronizes access to non-final members
Nick Pelly00355d52012-05-27 16:12:45 -070053 private Connection mServiceConnection; // never null after ctor
Mike Lockwood628fd6d2010-01-25 22:46:13 -050054
55 // cached values set by the location manager
Mike Lockwood15e3d0f2009-05-01 07:53:28 -040056 private boolean mLocationTracking = false;
Mike Lockwood2cd543a2010-02-01 12:16:35 -050057 private boolean mEnabled = false;
Mike Lockwood628fd6d2010-01-25 22:46:13 -050058 private long mMinTime = -1;
Dianne Hackborn7e9f4eb2010-09-10 18:43:00 -070059 private WorkSource mMinTimeSource = new WorkSource();
Mike Lockwood628fd6d2010-01-25 22:46:13 -050060 private int mNetworkState;
61 private NetworkInfo mNetworkInfo;
Mike Lockwoode932f7f2009-04-06 10:51:26 -070062
Mike Lockwood628fd6d2010-01-25 22:46:13 -050063 // constructor for proxying location providers implemented in a separate service
Nick Pelly00355d52012-05-27 16:12:45 -070064 public LocationProviderProxy(Context context, String name, String packageName,
Mike Lockwood628fd6d2010-01-25 22:46:13 -050065 Handler handler) {
66 mContext = context;
67 mName = name;
Nick Pelly00355d52012-05-27 16:12:45 -070068 mIntent = new Intent(SERVICE_ACTION);
Mike Lockwood628fd6d2010-01-25 22:46:13 -050069 mHandler = handler;
Nick Pelly00355d52012-05-27 16:12:45 -070070 reconnect(packageName);
Mike Lockwood628fd6d2010-01-25 22:46:13 -050071 }
72
Nick Pelly00355d52012-05-27 16:12:45 -070073 /** Bind to service. Will reconnect if already connected */
74 public void reconnect(String packageName) {
Mark Vandevoorde8863c432010-10-04 14:23:24 -070075 synchronized (mMutex) {
Nick Pelly00355d52012-05-27 16:12:45 -070076 if (mServiceConnection != null) {
77 mContext.unbindService(mServiceConnection);
78 }
Mark Vandevoorde8863c432010-10-04 14:23:24 -070079 mServiceConnection = new Connection();
Nick Pelly00355d52012-05-27 16:12:45 -070080 mIntent.setPackage(packageName);
Dianne Hackborn130b0d22011-07-26 22:07:48 -070081 mContext.bindService(mIntent, mServiceConnection,
Nick Pelly00355d52012-05-27 16:12:45 -070082 Context.BIND_AUTO_CREATE | Context.BIND_NOT_FOREGROUND |
83 Context.BIND_ALLOW_OOM_MANAGEMENT);
Mike Lockwoode97ae402010-09-29 15:23:46 -040084 }
85 }
86
Mark Vandevoorde8863c432010-10-04 14:23:24 -070087 private class Connection implements ServiceConnection, Runnable {
88
89 private ILocationProvider mProvider;
90
91 // for caching requiresNetwork, requiresSatellite, etc.
92 private DummyLocationProvider mCachedAttributes; // synchronized by mMutex
93
Mike Lockwood628fd6d2010-01-25 22:46:13 -050094 public void onServiceConnected(ComponentName className, IBinder service) {
Mark Vandevoorde8863c432010-10-04 14:23:24 -070095 synchronized (this) {
Mike Lockwood628fd6d2010-01-25 22:46:13 -050096 mProvider = ILocationProvider.Stub.asInterface(service);
97 if (mProvider != null) {
Mark Vandevoorde8863c432010-10-04 14:23:24 -070098 mHandler.post(this);
Mike Lockwood628fd6d2010-01-25 22:46:13 -050099 }
100 }
101 }
102
103 public void onServiceDisconnected(ComponentName className) {
Mark Vandevoorde8863c432010-10-04 14:23:24 -0700104 synchronized (this) {
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500105 mProvider = null;
106 }
Mike Lockwood3681f262009-05-12 10:52:03 -0400107 }
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700108
Mark Vandevoorde8863c432010-10-04 14:23:24 -0700109 public synchronized ILocationProvider getProvider() {
110 return mProvider;
111 }
112
113 public synchronized DummyLocationProvider getCachedAttributes() {
114 return mCachedAttributes;
115 }
116
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500117 public void run() {
Mark Vandevoorde8863c432010-10-04 14:23:24 -0700118 synchronized (mMutex) {
119 if (mServiceConnection != this) {
120 // This ServiceConnection no longer the one we want to bind to.
121 return;
122 }
123 ILocationProvider provider = getProvider();
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500124 if (provider == null) {
125 return;
126 }
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500127
Mark Vandevoorde8863c432010-10-04 14:23:24 -0700128 // resend previous values from the location manager if the service has restarted
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500129 try {
Mark Vandevoorde8863c432010-10-04 14:23:24 -0700130 if (mEnabled) {
131 provider.enable();
132 }
133 if (mLocationTracking) {
134 provider.enableLocationTracking(true);
135 }
136 if (mMinTime >= 0) {
137 provider.setMinTime(mMinTime, mMinTimeSource);
138 }
139 if (mNetworkInfo != null) {
140 provider.updateNetworkState(mNetworkState, mNetworkInfo);
141 }
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500142 } catch (RemoteException e) {
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500143 }
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500144
Mark Vandevoorde8863c432010-10-04 14:23:24 -0700145 // init cache of parameters
146 if (mCachedAttributes == null) {
147 try {
148 mCachedAttributes = new DummyLocationProvider(mName, null);
149 mCachedAttributes.setRequiresNetwork(provider.requiresNetwork());
150 mCachedAttributes.setRequiresSatellite(provider.requiresSatellite());
151 mCachedAttributes.setRequiresCell(provider.requiresCell());
152 mCachedAttributes.setHasMonetaryCost(provider.hasMonetaryCost());
153 mCachedAttributes.setSupportsAltitude(provider.supportsAltitude());
154 mCachedAttributes.setSupportsSpeed(provider.supportsSpeed());
155 mCachedAttributes.setSupportsBearing(provider.supportsBearing());
156 mCachedAttributes.setPowerRequirement(provider.getPowerRequirement());
157 mCachedAttributes.setAccuracy(provider.getAccuracy());
158 } catch (RemoteException e) {
159 mCachedAttributes = null;
160 }
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500161 }
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500162 }
Suchi Amalapurapufff2fda2009-06-30 21:36:16 -0700163 }
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500164 };
Suchi Amalapurapufff2fda2009-06-30 21:36:16 -0700165
Mike Lockwood15e3d0f2009-05-01 07:53:28 -0400166 public String getName() {
167 return mName;
168 }
169
Mark Vandevoorde8863c432010-10-04 14:23:24 -0700170 private DummyLocationProvider getCachedAttributes() {
171 synchronized (mMutex) {
172 return mServiceConnection.getCachedAttributes();
173 }
174 }
175
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700176 public boolean requiresNetwork() {
Mark Vandevoorde8863c432010-10-04 14:23:24 -0700177 DummyLocationProvider cachedAttributes = getCachedAttributes();
178 if (cachedAttributes != null) {
179 return cachedAttributes.requiresNetwork();
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500180 } else {
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700181 return false;
182 }
183 }
184
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700185 public boolean requiresSatellite() {
Mark Vandevoorde8863c432010-10-04 14:23:24 -0700186 DummyLocationProvider cachedAttributes = getCachedAttributes();
187 if (cachedAttributes != null) {
188 return cachedAttributes.requiresSatellite();
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500189 } else {
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700190 return false;
191 }
192 }
193
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700194 public boolean requiresCell() {
Mark Vandevoorde8863c432010-10-04 14:23:24 -0700195 DummyLocationProvider cachedAttributes = getCachedAttributes();
196 if (cachedAttributes != null) {
197 return cachedAttributes.requiresCell();
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500198 } else {
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700199 return false;
200 }
201 }
202
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700203 public boolean hasMonetaryCost() {
Mark Vandevoorde8863c432010-10-04 14:23:24 -0700204 DummyLocationProvider cachedAttributes = getCachedAttributes();
205 if (cachedAttributes != null) {
206 return cachedAttributes.hasMonetaryCost();
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500207 } else {
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700208 return false;
209 }
210 }
211
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700212 public boolean supportsAltitude() {
Mark Vandevoorde8863c432010-10-04 14:23:24 -0700213 DummyLocationProvider cachedAttributes = getCachedAttributes();
214 if (cachedAttributes != null) {
215 return cachedAttributes.supportsAltitude();
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500216 } else {
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700217 return false;
218 }
219 }
220
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700221 public boolean supportsSpeed() {
Mark Vandevoorde8863c432010-10-04 14:23:24 -0700222 DummyLocationProvider cachedAttributes = getCachedAttributes();
223 if (cachedAttributes != null) {
224 return cachedAttributes.supportsSpeed();
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500225 } else {
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700226 return false;
227 }
228 }
229
Mike Lockwood15e3d0f2009-05-01 07:53:28 -0400230 public boolean supportsBearing() {
Mark Vandevoorde8863c432010-10-04 14:23:24 -0700231 DummyLocationProvider cachedAttributes = getCachedAttributes();
232 if (cachedAttributes != null) {
233 return cachedAttributes.supportsBearing();
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500234 } else {
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700235 return false;
236 }
237 }
238
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700239 public int getPowerRequirement() {
Mark Vandevoorde8863c432010-10-04 14:23:24 -0700240 DummyLocationProvider cachedAttributes = getCachedAttributes();
241 if (cachedAttributes != null) {
242 return cachedAttributes.getPowerRequirement();
243 } else {
244 return -1;
245 }
246 }
247
248 public int getAccuracy() {
249 DummyLocationProvider cachedAttributes = getCachedAttributes();
250 if (cachedAttributes != null) {
251 return cachedAttributes.getAccuracy();
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500252 } else {
253 return -1;
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700254 }
255 }
256
Mike Lockwood03ca2162010-04-01 08:10:09 -0700257 public boolean meetsCriteria(Criteria criteria) {
Mark Vandevoorde8863c432010-10-04 14:23:24 -0700258 synchronized (mMutex) {
259 ILocationProvider provider = mServiceConnection.getProvider();
260 if (provider != null) {
261 try {
262 return provider.meetsCriteria(criteria);
263 } catch (RemoteException e) {
264 }
Mike Lockwood03ca2162010-04-01 08:10:09 -0700265 }
266 }
267 // default implementation if we lost connection to the provider
268 if ((criteria.getAccuracy() != Criteria.NO_REQUIREMENT) &&
269 (criteria.getAccuracy() < getAccuracy())) {
270 return false;
271 }
272 int criteriaPower = criteria.getPowerRequirement();
273 if ((criteriaPower != Criteria.NO_REQUIREMENT) &&
274 (criteriaPower < getPowerRequirement())) {
275 return false;
276 }
277 if (criteria.isAltitudeRequired() && !supportsAltitude()) {
278 return false;
279 }
280 if (criteria.isSpeedRequired() && !supportsSpeed()) {
281 return false;
282 }
283 if (criteria.isBearingRequired() && !supportsBearing()) {
284 return false;
285 }
286 return true;
287 }
288
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700289 public void enable() {
Mark Vandevoorde8863c432010-10-04 14:23:24 -0700290 synchronized (mMutex) {
291 mEnabled = true;
292 ILocationProvider provider = mServiceConnection.getProvider();
293 if (provider != null) {
294 try {
295 provider.enable();
296 } catch (RemoteException e) {
297 }
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500298 }
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700299 }
300 }
301
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700302 public void disable() {
Mark Vandevoorde8863c432010-10-04 14:23:24 -0700303 synchronized (mMutex) {
304 mEnabled = false;
305 ILocationProvider provider = mServiceConnection.getProvider();
306 if (provider != null) {
307 try {
308 provider.disable();
309 } catch (RemoteException e) {
310 }
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500311 }
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700312 }
313 }
314
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700315 public boolean isEnabled() {
Mark Vandevoorde8863c432010-10-04 14:23:24 -0700316 synchronized (mMutex) {
317 return mEnabled;
318 }
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700319 }
320
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700321 public int getStatus(Bundle extras) {
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500322 ILocationProvider provider;
Mark Vandevoorde8863c432010-10-04 14:23:24 -0700323 synchronized (mMutex) {
324 provider = mServiceConnection.getProvider();
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700325 }
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500326 if (provider != null) {
327 try {
328 return provider.getStatus(extras);
329 } catch (RemoteException e) {
330 }
331 }
332 return 0;
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700333 }
334
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700335 public long getStatusUpdateTime() {
Mark Vandevoorde8863c432010-10-04 14:23:24 -0700336 ILocationProvider provider;
337 synchronized (mMutex) {
338 provider = mServiceConnection.getProvider();
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700339 }
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500340 if (provider != null) {
341 try {
342 return provider.getStatusUpdateTime();
343 } catch (RemoteException e) {
344 }
345 }
346 return 0;
347 }
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700348
Fred Fettinger3c8fbdf2010-01-04 15:38:13 -0600349 public String getInternalState() {
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500350 ILocationProvider provider;
Mark Vandevoorde8863c432010-10-04 14:23:24 -0700351 synchronized (mMutex) {
352 provider = mServiceConnection.getProvider();
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500353 }
354 if (provider != null) {
355 try {
Mark Vandevoorde8863c432010-10-04 14:23:24 -0700356 return provider.getInternalState();
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500357 } catch (RemoteException e) {
Mark Vandevoorde8863c432010-10-04 14:23:24 -0700358 Log.e(TAG, "getInternalState failed", e);
359 }
360 }
361 return null;
362 }
363
364 public boolean isLocationTracking() {
365 synchronized (mMutex) {
366 return mLocationTracking;
367 }
368 }
369
370 public void enableLocationTracking(boolean enable) {
371 synchronized (mMutex) {
372 mLocationTracking = enable;
373 if (!enable) {
374 mMinTime = -1;
375 mMinTimeSource.clear();
376 }
377 ILocationProvider provider = mServiceConnection.getProvider();
378 if (provider != null) {
379 try {
380 provider.enableLocationTracking(enable);
381 } catch (RemoteException e) {
382 }
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500383 }
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700384 }
385 }
386
Mike Lockwood03ca2162010-04-01 08:10:09 -0700387 public boolean requestSingleShotFix() {
388 return false;
389 }
390
Mike Lockwood15e3d0f2009-05-01 07:53:28 -0400391 public long getMinTime() {
Mark Vandevoorde8863c432010-10-04 14:23:24 -0700392 synchronized (mMutex) {
393 return mMinTime;
394 }
Mike Lockwood15e3d0f2009-05-01 07:53:28 -0400395 }
396
Dianne Hackborn7e9f4eb2010-09-10 18:43:00 -0700397 public void setMinTime(long minTime, WorkSource ws) {
Mark Vandevoorde8863c432010-10-04 14:23:24 -0700398 synchronized (mMutex) {
399 mMinTime = minTime;
400 mMinTimeSource.set(ws);
401 ILocationProvider provider = mServiceConnection.getProvider();
402 if (provider != null) {
403 try {
404 provider.setMinTime(minTime, ws);
405 } catch (RemoteException e) {
406 }
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500407 }
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700408 }
409 }
410
Mike Lockwood03d24672009-10-08 15:45:03 -0400411 public void updateNetworkState(int state, NetworkInfo info) {
Mark Vandevoorde8863c432010-10-04 14:23:24 -0700412 synchronized (mMutex) {
413 mNetworkState = state;
414 mNetworkInfo = info;
415 ILocationProvider provider = mServiceConnection.getProvider();
416 if (provider != null) {
417 try {
418 provider.updateNetworkState(state, info);
419 } catch (RemoteException e) {
420 }
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500421 }
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700422 }
423 }
424
Mike Lockwoodfd6e5f02009-05-21 11:28:20 -0400425 public void updateLocation(Location location) {
Mark Vandevoorde8863c432010-10-04 14:23:24 -0700426 synchronized (mMutex) {
427 ILocationProvider provider = mServiceConnection.getProvider();
428 if (provider != null) {
429 try {
430 provider.updateLocation(location);
431 } catch (RemoteException e) {
432 }
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500433 }
Mike Lockwoodfd6e5f02009-05-21 11:28:20 -0400434 }
435 }
436
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700437 public boolean sendExtraCommand(String command, Bundle extras) {
Mark Vandevoorde8863c432010-10-04 14:23:24 -0700438 synchronized (mMutex) {
439 ILocationProvider provider = mServiceConnection.getProvider();
440 if (provider != null) {
441 try {
442 return provider.sendExtraCommand(command, extras);
443 } catch (RemoteException e) {
444 }
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500445 }
446 }
447 return false;
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700448 }
449
Mike Lockwood2f82c4e2009-04-17 08:24:10 -0400450 public void addListener(int uid) {
Mark Vandevoorde8863c432010-10-04 14:23:24 -0700451 synchronized (mMutex) {
452 ILocationProvider provider = mServiceConnection.getProvider();
453 if (provider != null) {
454 try {
455 provider.addListener(uid);
456 } catch (RemoteException e) {
457 }
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500458 }
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700459 }
460 }
461
Mike Lockwood2f82c4e2009-04-17 08:24:10 -0400462 public void removeListener(int uid) {
Mark Vandevoorde8863c432010-10-04 14:23:24 -0700463 synchronized (mMutex) {
464 ILocationProvider provider = mServiceConnection.getProvider();
465 if (provider != null) {
466 try {
467 provider.removeListener(uid);
468 } catch (RemoteException e) {
469 }
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500470 }
471 }
Mike Lockwood3681f262009-05-12 10:52:03 -0400472 }
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700473}