LocationProviderProxy.java revision 628fd6d9c11ed9806abebf34bc986247c106328f
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
17e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwoodpackage com.android.internal.location;
18e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood
19628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwoodimport android.content.ComponentName;
20628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwoodimport android.content.Context;
21628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwoodimport android.content.Intent;
22628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwoodimport android.content.ServiceConnection;
23e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwoodimport android.location.ILocationProvider;
24e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwoodimport android.location.Location;
2503d246779ea65fc2bd10d0b4f32620f45211133aMike Lockwoodimport android.net.NetworkInfo;
26e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwoodimport android.os.Bundle;
27628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwoodimport android.os.Handler;
283681f2614fa8c10560c790f6b4287f65d6fd2663Mike Lockwoodimport android.os.IBinder;
29e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwoodimport android.os.RemoteException;
30628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwoodimport android.os.SystemClock;
31e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwoodimport android.util.Log;
32e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood
33e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood/**
34628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood * A class for proxying ILocationProvider implementations.
35e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood *
36e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood * {@hide}
37e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood */
38628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwoodpublic class LocationProviderProxy {
39e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood
40e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood    private static final String TAG = "LocationProviderProxy";
41e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood
42628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood    private final Context mContext;
4315e3d0f082d551f8819fbe4b0d502cc108627876Mike Lockwood    private final String mName;
44628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood    private ILocationProvider mProvider;
45628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood    private Intent mIntent;
46628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood    private Handler mHandler;
47628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood    private final Connection mServiceConnection = new Connection();
48628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood
49628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood    // cached values set by the location manager
5015e3d0f082d551f8819fbe4b0d502cc108627876Mike Lockwood    private boolean mLocationTracking = false;
512cd543aad5cc38fb3e7158f1cc5080c7e9ff5d24Mike Lockwood    private boolean mEnabled = false;
52628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood    private long mMinTime = -1;
53628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood    private int mNetworkState;
54628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood    private NetworkInfo mNetworkInfo;
55e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood
56628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood    // for caching requiresNetwork, requiresSatellite, etc.
57628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood    private DummyLocationProvider mCachedAttributes;
58628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood
59628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood    // constructor for proxying built-in location providers
60628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood    public LocationProviderProxy(Context context, String name, ILocationProvider provider) {
61628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        mContext = context;
6215e3d0f082d551f8819fbe4b0d502cc108627876Mike Lockwood        mName = name;
63e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood        mProvider = provider;
64e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood    }
65e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood
66628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood    // constructor for proxying location providers implemented in a separate service
67628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood    public LocationProviderProxy(Context context, String name, String serviceName,
68628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            Handler handler) {
69628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        mContext = context;
70628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        mName = name;
71628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        mIntent = new Intent(serviceName);
72628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        mHandler = handler;
73628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        mContext.bindService(mIntent, mServiceConnection, Context.BIND_AUTO_CREATE);
74628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood    }
75628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood
76628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood    private class Connection implements ServiceConnection {
77628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        public void onServiceConnected(ComponentName className, IBinder service) {
78628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            Log.d(TAG, "LocationProviderProxy.onServiceConnected " + className);
79628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            synchronized (this) {
80628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood                mProvider = ILocationProvider.Stub.asInterface(service);
81628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood                if (mProvider != null) {
82628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood                    mHandler.post(mServiceConnectedTask);
83628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood                }
84628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            }
85628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        }
86628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood
87628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        public void onServiceDisconnected(ComponentName className) {
88628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            Log.d(TAG, "LocationProviderProxy.onServiceDisconnected " + className);
89628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            synchronized (this) {
90628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood                mProvider = null;
91628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            }
92fff2fda0199dedbf1079454dca98a81190dce765Suchi Amalapurapu        }
93fff2fda0199dedbf1079454dca98a81190dce765Suchi Amalapurapu    }
94fff2fda0199dedbf1079454dca98a81190dce765Suchi Amalapurapu
95628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood    private Runnable mServiceConnectedTask = new Runnable() {
96628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        public void run() {
97628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            ILocationProvider provider;
98628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            synchronized (mServiceConnection) {
99628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood                provider = mProvider;
100628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood                if (provider == null) {
101628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood                    return;
102628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood                }
103628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            }
104628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood
105628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            if (mCachedAttributes == null) {
106628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood                try {
107628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood                    mCachedAttributes = new DummyLocationProvider(mName);
108628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood                    mCachedAttributes.setRequiresNetwork(provider.requiresNetwork());
109628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood                    mCachedAttributes.setRequiresSatellite(provider.requiresSatellite());
110628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood                    mCachedAttributes.setRequiresCell(provider.requiresCell());
111628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood                    mCachedAttributes.setHasMonetaryCost(provider.hasMonetaryCost());
112628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood                    mCachedAttributes.setSupportsAltitude(provider.supportsAltitude());
113628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood                    mCachedAttributes.setSupportsSpeed(provider.supportsSpeed());
114628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood                    mCachedAttributes.setSupportsBearing(provider.supportsBearing());
115628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood                    mCachedAttributes.setPowerRequirement(provider.getPowerRequirement());
116628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood                    mCachedAttributes.setAccuracy(provider.getAccuracy());
117628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood                } catch (RemoteException e) {
118628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood                    mCachedAttributes = null;
119628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood                }
120628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            }
121628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood
122628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            // resend previous values from the location manager if the service has restarted
123628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            try {
124628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood                if (mEnabled) {
125628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood                    provider.enable();
126628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood                }
127628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood                if (mLocationTracking) {
128628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood                    provider.enableLocationTracking(true);
129628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood                }
130628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood                if (mMinTime >= 0) {
131628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood                    provider.setMinTime(mMinTime);
132628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood                }
133628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood                if (mNetworkInfo != null) {
134628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood                    provider.updateNetworkState(mNetworkState, mNetworkInfo);
135628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood                }
136628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            } catch (RemoteException e) {
137628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            }
138628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        }
139628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood    };
140628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood
14115e3d0f082d551f8819fbe4b0d502cc108627876Mike Lockwood    public String getName() {
14215e3d0f082d551f8819fbe4b0d502cc108627876Mike Lockwood        return mName;
14315e3d0f082d551f8819fbe4b0d502cc108627876Mike Lockwood    }
14415e3d0f082d551f8819fbe4b0d502cc108627876Mike Lockwood
145e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood    public boolean requiresNetwork() {
146628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        if (mCachedAttributes != null) {
147628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            return mCachedAttributes.requiresNetwork();
148628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        } else {
149e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood            return false;
150e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood        }
151e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood    }
152e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood
153e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood    public boolean requiresSatellite() {
154628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        if (mCachedAttributes != null) {
155628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            return mCachedAttributes.requiresSatellite();
156628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        } else {
157e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood            return false;
158e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood        }
159e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood    }
160e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood
161e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood    public boolean requiresCell() {
162628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        if (mCachedAttributes != null) {
163628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            return mCachedAttributes.requiresCell();
164628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        } else {
165e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood            return false;
166e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood        }
167e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood    }
168e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood
169e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood    public boolean hasMonetaryCost() {
170628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        if (mCachedAttributes != null) {
171628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            return mCachedAttributes.hasMonetaryCost();
172628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        } else {
173e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood            return false;
174e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood        }
175e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood    }
176e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood
177e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood    public boolean supportsAltitude() {
178628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        if (mCachedAttributes != null) {
179628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            return mCachedAttributes.supportsAltitude();
180628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        } else {
181e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood            return false;
182e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood        }
183e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood    }
184e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood
185e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood    public boolean supportsSpeed() {
186628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        if (mCachedAttributes != null) {
187628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            return mCachedAttributes.supportsSpeed();
188628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        } else {
189e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood            return false;
190e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood        }
191e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood    }
192e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood
19315e3d0f082d551f8819fbe4b0d502cc108627876Mike Lockwood     public boolean supportsBearing() {
194628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        if (mCachedAttributes != null) {
195628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            return mCachedAttributes.supportsBearing();
196628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        } else {
197e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood            return false;
198e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood        }
199e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood    }
200e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood
201e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood    public int getPowerRequirement() {
202628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        if (mCachedAttributes != null) {
203628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            return mCachedAttributes.getPowerRequirement();
204628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        } else {
205628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            return -1;
206e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood        }
207e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood    }
208e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood
209e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood    public int getAccuracy() {
210628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        if (mCachedAttributes != null) {
211628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            return mCachedAttributes.getAccuracy();
212628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        } else {
213628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            return -1;
214e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood        }
215e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood    }
216e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood
217e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood    public void enable() {
218628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        mEnabled = true;
219628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        ILocationProvider provider;
220628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        synchronized (mServiceConnection) {
221628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            provider = mProvider;
222628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        }
223628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        if (provider != null) {
224628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            try {
225628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood                provider.enable();
226628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            } catch (RemoteException e) {
227628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            }
228e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood        }
229e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood    }
230e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood
231e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood    public void disable() {
232628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        mEnabled = false;
233628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        ILocationProvider provider;
234628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        synchronized (mServiceConnection) {
235628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            provider = mProvider;
236628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        }
237628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        if (provider != null) {
238628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            try {
239628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood                provider.disable();
240628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            } catch (RemoteException e) {
241628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            }
242e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood        }
243e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood    }
244e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood
245e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood    public boolean isEnabled() {
2462cd543aad5cc38fb3e7158f1cc5080c7e9ff5d24Mike Lockwood        return mEnabled;
247e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood    }
248e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood
249e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood    public int getStatus(Bundle extras) {
250628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        ILocationProvider provider;
251628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        synchronized (mServiceConnection) {
252628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            provider = mProvider;
253e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood        }
254628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        if (provider != null) {
255628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            try {
256628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood                return provider.getStatus(extras);
257628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            } catch (RemoteException e) {
258628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            }
259628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        }
260628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        return 0;
261e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood    }
262e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood
263e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood    public long getStatusUpdateTime() {
264628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood         ILocationProvider provider;
265628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        synchronized (mServiceConnection) {
266628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            provider = mProvider;
267e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood        }
268628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        if (provider != null) {
269628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            try {
270628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood                return provider.getStatusUpdateTime();
271628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            } catch (RemoteException e) {
272628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            }
273628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        }
274628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        return 0;
275628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood     }
276e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood
27715e3d0f082d551f8819fbe4b0d502cc108627876Mike Lockwood    public boolean isLocationTracking() {
27815e3d0f082d551f8819fbe4b0d502cc108627876Mike Lockwood        return mLocationTracking;
27915e3d0f082d551f8819fbe4b0d502cc108627876Mike Lockwood    }
28015e3d0f082d551f8819fbe4b0d502cc108627876Mike Lockwood
281e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood    public void enableLocationTracking(boolean enable) {
28215e3d0f082d551f8819fbe4b0d502cc108627876Mike Lockwood        mLocationTracking = enable;
283628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        if (!enable) {
284628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            mMinTime = -1;
285628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        }
286628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        ILocationProvider provider;
287628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        synchronized (mServiceConnection) {
288628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            provider = mProvider;
289628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        }
290628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        if (provider != null) {
291628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            try {
292628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood                provider.enableLocationTracking(enable);
293628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            } catch (RemoteException e) {
294628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            }
295e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood        }
296e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood    }
297e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood
29815e3d0f082d551f8819fbe4b0d502cc108627876Mike Lockwood    public long getMinTime() {
29915e3d0f082d551f8819fbe4b0d502cc108627876Mike Lockwood        return mMinTime;
30015e3d0f082d551f8819fbe4b0d502cc108627876Mike Lockwood    }
30115e3d0f082d551f8819fbe4b0d502cc108627876Mike Lockwood
302e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood    public void setMinTime(long minTime) {
303628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood       mMinTime = minTime;
304628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        ILocationProvider provider;
305628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        synchronized (mServiceConnection) {
306628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            provider = mProvider;
307628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        }
308628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        if (provider != null) {
309628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            try {
310628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood                provider.setMinTime(minTime);
311628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            } catch (RemoteException e) {
312628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            }
313e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood        }
314e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood    }
315e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood
31603d246779ea65fc2bd10d0b4f32620f45211133aMike Lockwood    public void updateNetworkState(int state, NetworkInfo info) {
317628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        mNetworkState = state;
318628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        mNetworkInfo = info;
319628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        ILocationProvider provider;
320628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        synchronized (mServiceConnection) {
321628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            provider = mProvider;
322628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        }
323628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        if (provider != null) {
324628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            try {
325628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood                provider.updateNetworkState(state, info);
326628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            } catch (RemoteException e) {
327628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            }
328e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood        }
329e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood    }
330e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood
331fd6e5f0dda50e113db4ccc55338b6c4f09da37a4Mike Lockwood    public void updateLocation(Location location) {
332628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        ILocationProvider provider;
333628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        synchronized (mServiceConnection) {
334628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            provider = mProvider;
335628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        }
336628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        if (provider != null) {
337628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            try {
338628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood                provider.updateLocation(location);
339628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            } catch (RemoteException e) {
340628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            }
341fd6e5f0dda50e113db4ccc55338b6c4f09da37a4Mike Lockwood        }
342fd6e5f0dda50e113db4ccc55338b6c4f09da37a4Mike Lockwood    }
343fd6e5f0dda50e113db4ccc55338b6c4f09da37a4Mike Lockwood
344e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood    public boolean sendExtraCommand(String command, Bundle extras) {
345628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        ILocationProvider provider;
346628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        synchronized (mServiceConnection) {
347628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            provider = mProvider;
348e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood        }
349628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        if (provider != null) {
350628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            try {
351628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood                provider.sendExtraCommand(command, extras);
352628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            } catch (RemoteException e) {
353628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            }
354628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        }
355628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        return false;
356e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood    }
357e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood
3582f82c4eb0b4d315481ad79725ad6f52c5ec69685Mike Lockwood    public void addListener(int uid) {
359628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        ILocationProvider provider;
360628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        synchronized (mServiceConnection) {
361628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            provider = mProvider;
362628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        }
363628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        if (provider != null) {
364628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            try {
365628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood                provider.addListener(uid);
366628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            } catch (RemoteException e) {
367628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            }
368e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood        }
369e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood    }
370e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood
3712f82c4eb0b4d315481ad79725ad6f52c5ec69685Mike Lockwood    public void removeListener(int uid) {
372628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        ILocationProvider provider;
373628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        synchronized (mServiceConnection) {
374628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            provider = mProvider;
375628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        }
376628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood        if (provider != null) {
377628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            try {
378628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood                provider.removeListener(uid);
379628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            } catch (RemoteException e) {
380628fd6d9c11ed9806abebf34bc986247c106328fMike Lockwood            }
381e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood        }
3823681f2614fa8c10560c790f6b4287f65d6fd2663Mike Lockwood    }
383e932f7f2a47b770c636443d411436bd29cc4bb43Mike Lockwood}
384