blob: 361104f2943b7b6b46cf5b35504a1b56a7fd09fc [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
17package com.android.internal.location;
18
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 Lockwoode932f7f2009-04-06 10:51:26 -070033/**
Mike Lockwood628fd6d2010-01-25 22:46:13 -050034 * A class for proxying ILocationProvider implementations.
Mike Lockwoode932f7f2009-04-06 10:51:26 -070035 *
36 * {@hide}
37 */
Mike Lockwood628fd6d2010-01-25 22:46:13 -050038public class LocationProviderProxy {
Mike Lockwoode932f7f2009-04-06 10:51:26 -070039
40 private static final String TAG = "LocationProviderProxy";
41
Mike Lockwood628fd6d2010-01-25 22:46:13 -050042 private final Context mContext;
Mike Lockwood15e3d0f2009-05-01 07:53:28 -040043 private final String mName;
Mike Lockwood628fd6d2010-01-25 22:46:13 -050044 private ILocationProvider mProvider;
45 private Intent mIntent;
46 private Handler mHandler;
47 private final Connection mServiceConnection = new Connection();
48
49 // cached values set by the location manager
Mike Lockwood15e3d0f2009-05-01 07:53:28 -040050 private boolean mLocationTracking = false;
Mike Lockwood2cd543a2010-02-01 12:16:35 -050051 private boolean mEnabled = false;
Mike Lockwood628fd6d2010-01-25 22:46:13 -050052 private long mMinTime = -1;
53 private int mNetworkState;
54 private NetworkInfo mNetworkInfo;
Mike Lockwoode932f7f2009-04-06 10:51:26 -070055
Mike Lockwood628fd6d2010-01-25 22:46:13 -050056 // for caching requiresNetwork, requiresSatellite, etc.
57 private DummyLocationProvider mCachedAttributes;
58
59 // constructor for proxying built-in location providers
60 public LocationProviderProxy(Context context, String name, ILocationProvider provider) {
61 mContext = context;
Mike Lockwood15e3d0f2009-05-01 07:53:28 -040062 mName = name;
Mike Lockwoode932f7f2009-04-06 10:51:26 -070063 mProvider = provider;
Mike Lockwood628fd6d2010-01-25 22:46:13 -050064 }
65
66 // constructor for proxying location providers implemented in a separate service
67 public LocationProviderProxy(Context context, String name, String serviceName,
68 Handler handler) {
69 mContext = context;
70 mName = name;
71 mIntent = new Intent(serviceName);
72 mHandler = handler;
73 mContext.bindService(mIntent, mServiceConnection, Context.BIND_AUTO_CREATE);
74 }
75
76 private class Connection implements ServiceConnection {
77 public void onServiceConnected(ComponentName className, IBinder service) {
78 Log.d(TAG, "LocationProviderProxy.onServiceConnected " + className);
79 synchronized (this) {
80 mProvider = ILocationProvider.Stub.asInterface(service);
81 if (mProvider != null) {
82 mHandler.post(mServiceConnectedTask);
83 }
84 }
85 }
86
87 public void onServiceDisconnected(ComponentName className) {
88 Log.d(TAG, "LocationProviderProxy.onServiceDisconnected " + className);
89 synchronized (this) {
90 mProvider = null;
91 }
Mike Lockwood3681f262009-05-12 10:52:03 -040092 }
Mike Lockwoode932f7f2009-04-06 10:51:26 -070093 }
94
Mike Lockwood628fd6d2010-01-25 22:46:13 -050095 private Runnable mServiceConnectedTask = new Runnable() {
96 public void run() {
97 ILocationProvider provider;
98 synchronized (mServiceConnection) {
99 provider = mProvider;
100 if (provider == null) {
101 return;
102 }
103 }
104
105 if (mCachedAttributes == null) {
106 try {
107 mCachedAttributes = new DummyLocationProvider(mName);
108 mCachedAttributes.setRequiresNetwork(provider.requiresNetwork());
109 mCachedAttributes.setRequiresSatellite(provider.requiresSatellite());
110 mCachedAttributes.setRequiresCell(provider.requiresCell());
111 mCachedAttributes.setHasMonetaryCost(provider.hasMonetaryCost());
112 mCachedAttributes.setSupportsAltitude(provider.supportsAltitude());
113 mCachedAttributes.setSupportsSpeed(provider.supportsSpeed());
114 mCachedAttributes.setSupportsBearing(provider.supportsBearing());
115 mCachedAttributes.setPowerRequirement(provider.getPowerRequirement());
116 mCachedAttributes.setAccuracy(provider.getAccuracy());
117 } catch (RemoteException e) {
118 mCachedAttributes = null;
119 }
120 }
121
122 // resend previous values from the location manager if the service has restarted
123 try {
124 if (mEnabled) {
125 provider.enable();
126 }
127 if (mLocationTracking) {
128 provider.enableLocationTracking(true);
129 }
130 if (mMinTime >= 0) {
131 provider.setMinTime(mMinTime);
132 }
133 if (mNetworkInfo != null) {
134 provider.updateNetworkState(mNetworkState, mNetworkInfo);
135 }
136 } catch (RemoteException e) {
137 }
Suchi Amalapurapufff2fda2009-06-30 21:36:16 -0700138 }
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500139 };
Suchi Amalapurapufff2fda2009-06-30 21:36:16 -0700140
Mike Lockwood15e3d0f2009-05-01 07:53:28 -0400141 public String getName() {
142 return mName;
143 }
144
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700145 public boolean requiresNetwork() {
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500146 if (mCachedAttributes != null) {
147 return mCachedAttributes.requiresNetwork();
148 } else {
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700149 return false;
150 }
151 }
152
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700153 public boolean requiresSatellite() {
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500154 if (mCachedAttributes != null) {
155 return mCachedAttributes.requiresSatellite();
156 } else {
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700157 return false;
158 }
159 }
160
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700161 public boolean requiresCell() {
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500162 if (mCachedAttributes != null) {
163 return mCachedAttributes.requiresCell();
164 } else {
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700165 return false;
166 }
167 }
168
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700169 public boolean hasMonetaryCost() {
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500170 if (mCachedAttributes != null) {
171 return mCachedAttributes.hasMonetaryCost();
172 } else {
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700173 return false;
174 }
175 }
176
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700177 public boolean supportsAltitude() {
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500178 if (mCachedAttributes != null) {
179 return mCachedAttributes.supportsAltitude();
180 } else {
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700181 return false;
182 }
183 }
184
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700185 public boolean supportsSpeed() {
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500186 if (mCachedAttributes != null) {
187 return mCachedAttributes.supportsSpeed();
188 } else {
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700189 return false;
190 }
191 }
192
Mike Lockwood15e3d0f2009-05-01 07:53:28 -0400193 public boolean supportsBearing() {
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500194 if (mCachedAttributes != null) {
195 return mCachedAttributes.supportsBearing();
196 } else {
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700197 return false;
198 }
199 }
200
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700201 public int getPowerRequirement() {
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500202 if (mCachedAttributes != null) {
203 return mCachedAttributes.getPowerRequirement();
204 } else {
205 return -1;
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700206 }
207 }
208
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700209 public int getAccuracy() {
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500210 if (mCachedAttributes != null) {
211 return mCachedAttributes.getAccuracy();
212 } else {
213 return -1;
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700214 }
215 }
216
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700217 public void enable() {
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500218 mEnabled = true;
219 ILocationProvider provider;
220 synchronized (mServiceConnection) {
221 provider = mProvider;
222 }
223 if (provider != null) {
224 try {
225 provider.enable();
226 } catch (RemoteException e) {
227 }
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700228 }
229 }
230
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700231 public void disable() {
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500232 mEnabled = false;
233 ILocationProvider provider;
234 synchronized (mServiceConnection) {
235 provider = mProvider;
236 }
237 if (provider != null) {
238 try {
239 provider.disable();
240 } catch (RemoteException e) {
241 }
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700242 }
243 }
244
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700245 public boolean isEnabled() {
Mike Lockwood2cd543a2010-02-01 12:16:35 -0500246 return mEnabled;
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700247 }
248
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700249 public int getStatus(Bundle extras) {
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500250 ILocationProvider provider;
251 synchronized (mServiceConnection) {
252 provider = mProvider;
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700253 }
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500254 if (provider != null) {
255 try {
256 return provider.getStatus(extras);
257 } catch (RemoteException e) {
258 }
259 }
260 return 0;
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700261 }
262
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700263 public long getStatusUpdateTime() {
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500264 ILocationProvider provider;
265 synchronized (mServiceConnection) {
266 provider = mProvider;
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700267 }
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500268 if (provider != null) {
269 try {
270 return provider.getStatusUpdateTime();
271 } catch (RemoteException e) {
272 }
273 }
274 return 0;
275 }
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700276
Mike Lockwood15e3d0f2009-05-01 07:53:28 -0400277 public boolean isLocationTracking() {
278 return mLocationTracking;
279 }
280
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700281 public void enableLocationTracking(boolean enable) {
Mike Lockwood15e3d0f2009-05-01 07:53:28 -0400282 mLocationTracking = enable;
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500283 if (!enable) {
284 mMinTime = -1;
285 }
286 ILocationProvider provider;
287 synchronized (mServiceConnection) {
288 provider = mProvider;
289 }
290 if (provider != null) {
291 try {
292 provider.enableLocationTracking(enable);
293 } catch (RemoteException e) {
294 }
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700295 }
296 }
297
Mike Lockwood15e3d0f2009-05-01 07:53:28 -0400298 public long getMinTime() {
299 return mMinTime;
300 }
301
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700302 public void setMinTime(long minTime) {
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500303 mMinTime = minTime;
304 ILocationProvider provider;
305 synchronized (mServiceConnection) {
306 provider = mProvider;
307 }
308 if (provider != null) {
309 try {
310 provider.setMinTime(minTime);
311 } catch (RemoteException e) {
312 }
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700313 }
314 }
315
Mike Lockwood03d24672009-10-08 15:45:03 -0400316 public void updateNetworkState(int state, NetworkInfo info) {
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500317 mNetworkState = state;
318 mNetworkInfo = info;
319 ILocationProvider provider;
320 synchronized (mServiceConnection) {
321 provider = mProvider;
322 }
323 if (provider != null) {
324 try {
325 provider.updateNetworkState(state, info);
326 } catch (RemoteException e) {
327 }
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700328 }
329 }
330
Mike Lockwoodfd6e5f02009-05-21 11:28:20 -0400331 public void updateLocation(Location location) {
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500332 ILocationProvider provider;
333 synchronized (mServiceConnection) {
334 provider = mProvider;
335 }
336 if (provider != null) {
337 try {
338 provider.updateLocation(location);
339 } catch (RemoteException e) {
340 }
Mike Lockwoodfd6e5f02009-05-21 11:28:20 -0400341 }
342 }
343
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700344 public boolean sendExtraCommand(String command, Bundle extras) {
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500345 ILocationProvider provider;
346 synchronized (mServiceConnection) {
347 provider = mProvider;
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700348 }
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500349 if (provider != null) {
350 try {
351 provider.sendExtraCommand(command, extras);
352 } catch (RemoteException e) {
353 }
354 }
355 return false;
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700356 }
357
Mike Lockwood2f82c4e2009-04-17 08:24:10 -0400358 public void addListener(int uid) {
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500359 ILocationProvider provider;
360 synchronized (mServiceConnection) {
361 provider = mProvider;
362 }
363 if (provider != null) {
364 try {
365 provider.addListener(uid);
366 } catch (RemoteException e) {
367 }
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700368 }
369 }
370
Mike Lockwood2f82c4e2009-04-17 08:24:10 -0400371 public void removeListener(int uid) {
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500372 ILocationProvider provider;
373 synchronized (mServiceConnection) {
374 provider = mProvider;
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700375 }
Mike Lockwood628fd6d2010-01-25 22:46:13 -0500376 if (provider != null) {
377 try {
378 provider.removeListener(uid);
379 } catch (RemoteException e) {
380 }
381 }
Mike Lockwood3681f262009-05-12 10:52:03 -0400382 }
Mike Lockwoode932f7f2009-04-06 10:51:26 -0700383}