blob: 3e118f98c1be2d8013b5a003c2a8c9ed384a2804 [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 Lockwoode932f7f2009-04-06 10:51:26 -070023import android.location.ILocationProvider;
24import android.location.Location;
Mike Lockwood03d24672009-10-08 15:45:03 -040025import android.net.NetworkInfo;
Mike Lockwoode932f7f2009-04-06 10:51:26 -070026import android.os.Bundle;
Mike Lockwood628fd6d2010-01-25 22:46:13 -050027import android.os.Handler;
Mike Lockwood3681f262009-05-12 10:52:03 -040028import android.os.IBinder;
Mike Lockwoode932f7f2009-04-06 10:51:26 -070029import android.os.RemoteException;
Mike Lockwood628fd6d2010-01-25 22:46:13 -050030import android.os.SystemClock;
Mike Lockwoode932f7f2009-04-06 10:51:26 -070031import android.util.Log;
32
Mike Lockwood00b74272010-03-26 10:41:48 -040033import com.android.internal.location.DummyLocationProvider;
34
Mike Lockwoode932f7f2009-04-06 10:51:26 -070035/**
Mike Lockwoodd03ff942010-02-09 08:46:14 -050036 * A class for proxying location providers implemented as services.
Mike Lockwoode932f7f2009-04-06 10:51:26 -070037 *
38 * {@hide}
39 */
Mike Lockwoodd03ff942010-02-09 08:46:14 -050040public class LocationProviderProxy implements LocationProviderInterface {
Mike Lockwoode932f7f2009-04-06 10:51:26 -070041
42 private static final String TAG = "LocationProviderProxy";
43
Mike Lockwood628fd6d2010-01-25 22:46:13 -050044 private final Context mContext;
Mike Lockwood15e3d0f2009-05-01 07:53:28 -040045 private final String mName;
Mike Lockwood628fd6d2010-01-25 22:46:13 -050046 private ILocationProvider mProvider;
Mike Lockwood628fd6d2010-01-25 22:46:13 -050047 private Handler mHandler;
48 private final Connection mServiceConnection = new Connection();
49
50 // cached values set by the location manager
Mike Lockwood15e3d0f2009-05-01 07:53:28 -040051 private boolean mLocationTracking = false;
Mike Lockwood2cd543a2010-02-01 12:16:35 -050052 private boolean mEnabled = false;
Mike Lockwood628fd6d2010-01-25 22:46:13 -050053 private long mMinTime = -1;
54 private int mNetworkState;
55 private NetworkInfo mNetworkInfo;
Mike Lockwoode932f7f2009-04-06 10:51:26 -070056
Mike Lockwood628fd6d2010-01-25 22:46:13 -050057 // for caching requiresNetwork, requiresSatellite, etc.
58 private DummyLocationProvider mCachedAttributes;
59
Mike Lockwood628fd6d2010-01-25 22:46:13 -050060 // constructor for proxying location providers implemented in a separate service
61 public LocationProviderProxy(Context context, String name, String serviceName,
62 Handler handler) {
63 mContext = context;
64 mName = name;
Mike Lockwood628fd6d2010-01-25 22:46:13 -050065 mHandler = handler;
Mike Lockwoodd03ff942010-02-09 08:46:14 -050066 mContext.bindService(new Intent(serviceName), mServiceConnection, Context.BIND_AUTO_CREATE);
Mike Lockwood628fd6d2010-01-25 22:46:13 -050067 }
68
69 private class Connection implements ServiceConnection {
70 public void onServiceConnected(ComponentName className, IBinder service) {
71 Log.d(TAG, "LocationProviderProxy.onServiceConnected " + className);
72 synchronized (this) {
73 mProvider = ILocationProvider.Stub.asInterface(service);
74 if (mProvider != null) {
75 mHandler.post(mServiceConnectedTask);
76 }
77 }
78 }
79
80 public void onServiceDisconnected(ComponentName className) {
81 Log.d(TAG, "LocationProviderProxy.onServiceDisconnected " + className);
82 synchronized (this) {
83 mProvider = null;
84 }
Mike Lockwood3681f262009-05-12 10:52:03 -040085 }
Mike Lockwoode932f7f2009-04-06 10:51:26 -070086 }
87
Mike Lockwood628fd6d2010-01-25 22:46:13 -050088 private Runnable mServiceConnectedTask = new Runnable() {
89 public void run() {
90 ILocationProvider provider;
91 synchronized (mServiceConnection) {
92 provider = mProvider;
93 if (provider == null) {
94 return;
95 }
96 }
97
98 if (mCachedAttributes == null) {
99 try {
100 mCachedAttributes = new DummyLocationProvider(mName);
101 mCachedAttributes.setRequiresNetwork(provider.requiresNetwork());
102 mCachedAttributes.setRequiresSatellite(provider.requiresSatellite());
103 mCachedAttributes.setRequiresCell(provider.requiresCell());
104 mCachedAttributes.setHasMonetaryCost(provider.hasMonetaryCost());
105 mCachedAttributes.setSupportsAltitude(provider.supportsAltitude());
106 mCachedAttributes.setSupportsSpeed(provider.supportsSpeed());
107 mCachedAttributes.setSupportsBearing(provider.supportsBearing());
108 mCachedAttributes.setPowerRequirement(provider.getPowerRequirement());
109 mCachedAttributes.setAccuracy(provider.getAccuracy());
110 } catch (RemoteException e) {
111 mCachedAttributes = null;
112 }
113 }
114
115 // resend previous values from the location manager if the service has restarted
116 try {
117 if (mEnabled) {
118 provider.enable();
119 }
120 if (mLocationTracking) {
121 provider.enableLocationTracking(true);
122 }
123 if (mMinTime >= 0) {
124 provider.setMinTime(mMinTime);
125 }
126 if (mNetworkInfo != null) {
127 provider.updateNetworkState(mNetworkState, mNetworkInfo);
128 }
129 } catch (RemoteException e) {
130 }
Suchi Amalapurapufff2fda2009-06-30 21:36:16 -0700131 }
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500132 };
Suchi Amalapurapufff2fda2009-06-30 21:36:16 -0700133
Mike Lockwood15e3d0f2009-05-01 07:53:28 -0400134 public String getName() {
135 return mName;
136 }
137
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700138 public boolean requiresNetwork() {
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500139 if (mCachedAttributes != null) {
140 return mCachedAttributes.requiresNetwork();
141 } else {
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700142 return false;
143 }
144 }
145
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700146 public boolean requiresSatellite() {
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500147 if (mCachedAttributes != null) {
148 return mCachedAttributes.requiresSatellite();
149 } else {
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700150 return false;
151 }
152 }
153
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700154 public boolean requiresCell() {
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500155 if (mCachedAttributes != null) {
156 return mCachedAttributes.requiresCell();
157 } else {
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700158 return false;
159 }
160 }
161
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700162 public boolean hasMonetaryCost() {
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500163 if (mCachedAttributes != null) {
164 return mCachedAttributes.hasMonetaryCost();
165 } else {
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700166 return false;
167 }
168 }
169
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700170 public boolean supportsAltitude() {
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500171 if (mCachedAttributes != null) {
172 return mCachedAttributes.supportsAltitude();
173 } else {
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700174 return false;
175 }
176 }
177
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700178 public boolean supportsSpeed() {
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500179 if (mCachedAttributes != null) {
180 return mCachedAttributes.supportsSpeed();
181 } else {
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700182 return false;
183 }
184 }
185
Mike Lockwood15e3d0f2009-05-01 07:53:28 -0400186 public boolean supportsBearing() {
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500187 if (mCachedAttributes != null) {
188 return mCachedAttributes.supportsBearing();
189 } else {
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700190 return false;
191 }
192 }
193
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700194 public int getPowerRequirement() {
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500195 if (mCachedAttributes != null) {
196 return mCachedAttributes.getPowerRequirement();
197 } else {
198 return -1;
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700199 }
200 }
201
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700202 public int getAccuracy() {
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500203 if (mCachedAttributes != null) {
204 return mCachedAttributes.getAccuracy();
205 } else {
206 return -1;
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700207 }
208 }
209
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700210 public void enable() {
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500211 mEnabled = true;
212 ILocationProvider provider;
213 synchronized (mServiceConnection) {
214 provider = mProvider;
215 }
216 if (provider != null) {
217 try {
218 provider.enable();
219 } catch (RemoteException e) {
220 }
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700221 }
222 }
223
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700224 public void disable() {
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500225 mEnabled = false;
226 ILocationProvider provider;
227 synchronized (mServiceConnection) {
228 provider = mProvider;
229 }
230 if (provider != null) {
231 try {
232 provider.disable();
233 } catch (RemoteException e) {
234 }
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700235 }
236 }
237
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700238 public boolean isEnabled() {
Mike Lockwood2cd543a2010-02-01 12:16:35 -0500239 return mEnabled;
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700240 }
241
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700242 public int getStatus(Bundle extras) {
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500243 ILocationProvider provider;
244 synchronized (mServiceConnection) {
245 provider = mProvider;
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700246 }
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500247 if (provider != null) {
248 try {
249 return provider.getStatus(extras);
250 } catch (RemoteException e) {
251 }
252 }
253 return 0;
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700254 }
255
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700256 public long getStatusUpdateTime() {
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500257 ILocationProvider provider;
258 synchronized (mServiceConnection) {
259 provider = mProvider;
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700260 }
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500261 if (provider != null) {
262 try {
263 return provider.getStatusUpdateTime();
264 } catch (RemoteException e) {
265 }
266 }
267 return 0;
268 }
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700269
Fred Fettinger3c8fbdf2010-01-04 15:38:13 -0600270 public String getInternalState() {
271 try {
272 return mProvider.getInternalState();
273 } catch (RemoteException e) {
274 Log.e(TAG, "getInternalState failed", e);
275 return null;
276 }
277 }
278
Mike Lockwood15e3d0f2009-05-01 07:53:28 -0400279 public boolean isLocationTracking() {
280 return mLocationTracking;
281 }
282
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700283 public void enableLocationTracking(boolean enable) {
Mike Lockwood15e3d0f2009-05-01 07:53:28 -0400284 mLocationTracking = enable;
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500285 if (!enable) {
286 mMinTime = -1;
287 }
288 ILocationProvider provider;
289 synchronized (mServiceConnection) {
290 provider = mProvider;
291 }
292 if (provider != null) {
293 try {
294 provider.enableLocationTracking(enable);
295 } catch (RemoteException e) {
296 }
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700297 }
298 }
299
Mike Lockwood15e3d0f2009-05-01 07:53:28 -0400300 public long getMinTime() {
301 return mMinTime;
302 }
303
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700304 public void setMinTime(long minTime) {
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500305 mMinTime = minTime;
306 ILocationProvider provider;
307 synchronized (mServiceConnection) {
308 provider = mProvider;
309 }
310 if (provider != null) {
311 try {
312 provider.setMinTime(minTime);
313 } catch (RemoteException e) {
314 }
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700315 }
316 }
317
Mike Lockwood03d24672009-10-08 15:45:03 -0400318 public void updateNetworkState(int state, NetworkInfo info) {
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500319 mNetworkState = state;
320 mNetworkInfo = info;
321 ILocationProvider provider;
322 synchronized (mServiceConnection) {
323 provider = mProvider;
324 }
325 if (provider != null) {
326 try {
327 provider.updateNetworkState(state, info);
328 } catch (RemoteException e) {
329 }
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700330 }
331 }
332
Mike Lockwoodfd6e5f02009-05-21 11:28:20 -0400333 public void updateLocation(Location location) {
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500334 ILocationProvider provider;
335 synchronized (mServiceConnection) {
336 provider = mProvider;
337 }
338 if (provider != null) {
339 try {
340 provider.updateLocation(location);
341 } catch (RemoteException e) {
342 }
Mike Lockwoodfd6e5f02009-05-21 11:28:20 -0400343 }
344 }
345
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700346 public boolean sendExtraCommand(String command, Bundle extras) {
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500347 ILocationProvider provider;
348 synchronized (mServiceConnection) {
349 provider = mProvider;
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700350 }
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500351 if (provider != null) {
352 try {
353 provider.sendExtraCommand(command, extras);
354 } catch (RemoteException e) {
355 }
356 }
357 return false;
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700358 }
359
Mike Lockwood2f82c4e2009-04-17 08:24:10 -0400360 public void addListener(int uid) {
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500361 ILocationProvider provider;
362 synchronized (mServiceConnection) {
363 provider = mProvider;
364 }
365 if (provider != null) {
366 try {
367 provider.addListener(uid);
368 } catch (RemoteException e) {
369 }
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700370 }
371 }
372
Mike Lockwood2f82c4e2009-04-17 08:24:10 -0400373 public void removeListener(int uid) {
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500374 ILocationProvider provider;
375 synchronized (mServiceConnection) {
376 provider = mProvider;
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700377 }
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500378 if (provider != null) {
379 try {
380 provider.removeListener(uid);
381 } catch (RemoteException e) {
382 }
383 }
Mike Lockwood3681f262009-05-12 10:52:03 -0400384 }
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700385}