summaryrefslogtreecommitdiffstats
path: root/location/lib/java/com/android/location/provider/LocationProvider.java
blob: 3714f406b1ecdd24669fe6f358572c09ed46fe51 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
/*
 * Copyright (C) 2010 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.location.provider;

import android.content.Context;
import android.net.NetworkInfo;
import android.location.Criteria;
import android.location.ILocationManager;
import android.location.ILocationProvider;
import android.location.Location;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.WorkSource;
import android.util.Log;

/**
 * An abstract superclass for location providers that are implemented
 * outside of the core android platform.
 * Location providers can be implemented as services and return the result of
 * {@link LocationProvider#getBinder()} in its getBinder() method.
 *
 * @hide
 */
public abstract class LocationProvider {

    private static final String TAG = "LocationProvider";

    private ILocationManager mLocationManager;

    private ILocationProvider.Stub mProvider = new ILocationProvider.Stub() {

        public boolean requiresNetwork() {
            return LocationProvider.this.onRequiresNetwork();
        }

        public boolean requiresSatellite() {
            return LocationProvider.this.onRequiresSatellite();
        }

        public boolean requiresCell() {
            return LocationProvider.this.onRequiresCell();
        }

        public boolean hasMonetaryCost() {
            return LocationProvider.this.onHasMonetaryCost();
        }

        public boolean supportsAltitude() {
            return LocationProvider.this.onSupportsAltitude();
        }

        public boolean supportsSpeed() {
            return LocationProvider.this.onSupportsSpeed();
        }

        public boolean supportsBearing() {
            return LocationProvider.this.onSupportsBearing();
        }

        public int getPowerRequirement() {
            return LocationProvider.this.onGetPowerRequirement();
        }

        public boolean meetsCriteria(Criteria criteria) {
            return LocationProvider.this.onMeetsCriteria(criteria);
        }

        public int getAccuracy() {
            return LocationProvider.this.onGetAccuracy();
        }

        public void enable() {
            LocationProvider.this.onEnable();
        }

        public void disable() {
            LocationProvider.this.onDisable();
        }

        public int getStatus(Bundle extras) {
            return LocationProvider.this.onGetStatus(extras);
        }

        public long getStatusUpdateTime() {
            return LocationProvider.this.onGetStatusUpdateTime();
        }

        public String getInternalState() {
            return LocationProvider.this.onGetInternalState();
        }

        public void enableLocationTracking(boolean enable) {
            LocationProvider.this.onEnableLocationTracking(enable);
        }

        public void setMinTime(long minTime, WorkSource ws) {
            LocationProvider.this.onSetMinTime(minTime, ws);
        }

        public void updateNetworkState(int state, NetworkInfo info) {
            LocationProvider.this.onUpdateNetworkState(state, info);
        }

        public void updateLocation(Location location) {
            LocationProvider.this.onUpdateLocation(location);
        }

        public boolean sendExtraCommand(String command, Bundle extras) {
            return LocationProvider.this.onSendExtraCommand(command, extras);
        }

        public void addListener(int uid) {
            LocationProvider.this.onAddListener(uid, new WorkSource(uid));
        }

        public void removeListener(int uid) {
            LocationProvider.this.onRemoveListener(uid, new WorkSource(uid));
        }
    };

    public LocationProvider() {
        IBinder b = ServiceManager.getService(Context.LOCATION_SERVICE);
        mLocationManager = ILocationManager.Stub.asInterface(b);
    }

    /**
     * {@hide}
     */
    /* package */ ILocationProvider getInterface() {
        return mProvider;
    }

    /**
     * Returns the Binder interface for the location provider.
     * This is intended to be used for the onBind() method of
     * a service that implements a location provider service.
     *
     * @return the IBinder instance for the provider
     */
    public IBinder getBinder() {
        return mProvider;
    }

    /**
     * Used by the location provider to report new locations.
     *
     * @param location new Location to report
     *
     * Requires the android.permission.INSTALL_LOCATION_PROVIDER permission.
     */
    public void reportLocation(Location location) {
        try {
            mLocationManager.reportLocation(location, false);
        } catch (RemoteException e) {
            Log.e(TAG, "RemoteException in reportLocation: ", e);
        }
    }

    /**
     * Returns true if the provider requires access to a
     * data network (e.g., the Internet), false otherwise.
     */
    public abstract boolean onRequiresNetwork();

    /**
     * Returns true if the provider requires access to a
     * satellite-based positioning system (e.g., GPS), false
     * otherwise.
     */
    public abstract boolean onRequiresSatellite();

    /**
     * Returns true if the provider requires access to an appropriate
     * cellular network (e.g., to make use of cell tower IDs), false
     * otherwise.
     */
    public abstract boolean onRequiresCell();

    /**
     * Returns true if the use of this provider may result in a
     * monetary charge to the user, false if use is free.  It is up to
     * each provider to give accurate information.
     */
    public abstract boolean onHasMonetaryCost();

    /**
     * Returns true if the provider is able to provide altitude
     * information, false otherwise.  A provider that reports altitude
     * under most circumstances but may occassionally not report it
     * should return true.
     */
    public abstract boolean onSupportsAltitude();

    /**
     * Returns true if the provider is able to provide speed
     * information, false otherwise.  A provider that reports speed
     * under most circumstances but may occassionally not report it
     * should return true.
     */
    public abstract boolean onSupportsSpeed();

    /**
     * Returns true if the provider is able to provide bearing
     * information, false otherwise.  A provider that reports bearing
     * under most circumstances but may occassionally not report it
     * should return true.
     */
    public abstract boolean onSupportsBearing();

    /**
     * Returns the power requirement for this provider.
     *
     * @return the power requirement for this provider, as one of the
     * constants Criteria.POWER_REQUIREMENT_*.
     */
    public abstract int onGetPowerRequirement();

    /**
     * Returns true if this provider meets the given criteria,
     * false otherwise.
     */
    public abstract boolean onMeetsCriteria(Criteria criteria);

    /**
     * Returns a constant describing horizontal accuracy of this provider.
     * If the provider returns finer grain or exact location,
     * {@link Criteria#ACCURACY_FINE} is returned, otherwise if the
     * location is only approximate then {@link Criteria#ACCURACY_COARSE}
     * is returned.
     */
    public abstract int onGetAccuracy();

    /**
     * Enables the location provider
     */
    public abstract void onEnable();

    /**
     * Disables the location provider
     */
    public abstract void onDisable();

    /**
     * Returns a information on the status of this provider.
     * {@link android.location.LocationProvider#OUT_OF_SERVICE} is returned if the provider is
     * out of service, and this is not expected to change in the near
     * future; {@link android.location.LocationProvider#TEMPORARILY_UNAVAILABLE} is returned if
     * the provider is temporarily unavailable but is expected to be
     * available shortly; and {@link android.location.LocationProvider#AVAILABLE} is returned
     * if the provider is currently available.
     *
     * <p> If extras is non-null, additional status information may be
     * added to it in the form of provider-specific key/value pairs.
     */
    public abstract int onGetStatus(Bundle extras);

    /**
     * Returns the time at which the status was last updated. It is the
     * responsibility of the provider to appropriately set this value using
     * {@link android.os.SystemClock#elapsedRealtime SystemClock.elapsedRealtime()}.
     * there is a status update that it wishes to broadcast to all its
     * listeners. The provider should be careful not to broadcast
     * the same status again.
     *
     * @return time of last status update in millis since last reboot
     */
    public abstract long onGetStatusUpdateTime();

    /**
     * Returns debugging information about the location provider.
     *
     * @return string describing the internal state of the location provider, or null.
     */
    public abstract String onGetInternalState();

    /**
     * Notifies the location provider that clients are listening for locations.
     * Called with enable set to true when the first client is added and
     * called with enable set to false when the last client is removed.
     * This allows the provider to prepare for receiving locations,
     * and to shut down when no clients are remaining.
     *
     * @param enable true if location tracking should be enabled.
     */
    public abstract void onEnableLocationTracking(boolean enable);

    /**
     * Notifies the location provider of the smallest minimum time between updates amongst
     * all clients that are listening for locations.  This allows the provider to reduce
     * the frequency of updates to match the requested frequency.
     *
     * @param minTime the smallest minTime value over all listeners for this provider.
     * @param ws the source this work is coming from.
     */
    public abstract void onSetMinTime(long minTime, WorkSource ws);

    /**
     * Updates the network state for the given provider. This function must
     * be overwritten if {@link android.location.LocationProvider#requiresNetwork} returns true.
     * The state is {@link android.location.LocationProvider#TEMPORARILY_UNAVAILABLE} (disconnected)
     * OR {@link android.location.LocationProvider#AVAILABLE} (connected or connecting).
     *
     * @param state data state
     */
    public abstract void onUpdateNetworkState(int state, NetworkInfo info);

    /**
     * Informs the provider when a new location has been computed by a different
     * location provider.  This is intended to be used as aiding data for the
     * receiving provider.
     *
     * @param location new location from other location provider
     */
    public abstract void onUpdateLocation(Location location);

    /**
     * Implements addditional location provider specific additional commands.
     *
     * @param command name of the command to send to the provider.
     * @param extras optional arguments for the command (or null).
     * The provider may optionally fill the extras Bundle with results from the command.
     *
     * @return true if the command succeeds.
     */
    public abstract boolean onSendExtraCommand(String command, Bundle extras);

    /**
     * Notifies the location provider when a new client is listening for locations.
     *
     * @param uid user ID of the new client.
     * @param ws a WorkSource representation of the client.
     */
    public abstract void onAddListener(int uid, WorkSource ws);

    /**
     * Notifies the location provider when a client is no longer listening for locations.
     *
     * @param uid user ID of the client no longer listening.
     * @param ws a WorkSource representation of the client.
     */
    public abstract void onRemoveListener(int uid, WorkSource ws);
}