diff options
author | Nick Pelly <npelly@google.com> | 2012-07-16 12:18:23 -0700 |
---|---|---|
committer | Nick Pelly <npelly@google.com> | 2012-08-10 14:57:09 -0700 |
commit | 6fa9ad4afcd762aea519ff61811386c23d18ddb2 (patch) | |
tree | 5b027550205ada4b972f5cc3d8073819c07d9c75 /location/java/com/android | |
parent | c47f80f1ae96e3c8b6a750d68cc12dfbbca97254 (diff) | |
download | frameworks_base-6fa9ad4afcd762aea519ff61811386c23d18ddb2.zip frameworks_base-6fa9ad4afcd762aea519ff61811386c23d18ddb2.tar.gz frameworks_base-6fa9ad4afcd762aea519ff61811386c23d18ddb2.tar.bz2 |
Location overhaul, major commit.
Themes: Fused Location, Geofencing, LocationRequest.
API changes
o Fused location is always returned when asking for location by Criteria.
o Fused location is never returned as a LocationProvider object, nor returned
as a provider String. This wouldn't make sense because the current API
design assumes that LocationProvider's have fixed properties (accuracy, power
etc).
o The fused location engine will tune itself based on the criteria passed
by applications.
o Deprecate LocationProvider. Apps should use fused location (via Criteria
class), instead of enumerating through LocationProvider objects. It is
also over-engineered: designed for a world with a plethora of location
providers that never materialized.
o The Criteria class is also over-engineered, with many methods that aren't
currently used, but for now we won't deprecate them since they may have
value in the future. It is now used to tune the fused location engine.
o Deprecate getBestProvider() and getProvider().
o Add getLastKnownLocation(Criteria), so we can return last known
fused locations.
o Apps with only ACCESS_COARSE_LOCATION _can_ now use the GPS, but the location
they receive will be fudged to a 1km radius. They can also use NETWORK
and fused locatoins, which are fudged in the same way if necessary.
o Totally deprecate Criteria, in favor of LocationRequest.
Criteria was designed to map QOS to a location provider. What we
really need is to map QOS to _locations_.
The death knell was the conflicting ACCURACY_ constants on
Criteria, with values 1, 2, 3, 1, 2. Yes not a typo.
o Totally deprecate LocationProvider.
o Deprecate test/mock provider support. They require a named provider,
which is a concept we are moving away from. We do not yet have a
replacement, but I think its ok to deprecate since you also
need to have 'allow mock locations' checked in developer settings.
They will continue to work.
o Deprecate event codes associated with provider status. The fused
provider is _always_ available.
o Introduce Geofence data object to provide an easier path fowards
for polygons etc.
Implementation changes
o Fused implementation: incoming (GPS and NLP) location fixes are given
a weight, that exponentially decays with respect to age and accuracy.
The half-life of age is ~60 seconds, and the half-life of accuracy is
~20 meters. The fixes are weighted and combined to output a fused
location.
o Move Fused Location impl into
frameworks/base/packages/FusedLocation
o Refactor Fused Location behind the IProvider AIDL interface. This allow us
to distribute newer versions of Fused Location in a new APK, at run-time.
o Introduce ServiceWatcher.java, to refactor code used for run-time upgrades of
Fused Location, and the NLP.
o Fused Location is by default run in the system server (but can be moved to
any process or pacakge, even at run-time).
o Plumb the Criteria requirements through to the Fused Location provider via
ILocation.sendExtraCommand(). I re-used this interface to avoid modifying the
ILocation interface, which would have broken run-time upgradability of the
NLP.
o Switch the geofence manager to using fused location.
o Clean up 'adb shell dumpsys location' output.
o Introduce config_locationProviderPackageNames and
config_overlay_locationProviderPackageNames to configure the default
and overlay package names for Geocoder, NLP and FLP.
o Lots of misc cleanup.
o Improve location fudging. Apply random vector then quantize.
o Hide internal POJO's from clients of com.android.location.provider.jar
(NLP and FLP). Introduce wrappers ProviderRequestUnbundled and
ProviderPropertiesUnbundled.
o Introduce ProviderProperties to collapse all the provider accuracy/
bearing/altitude/power plumbing (that is deprecated anyway).
o DELETE lots of code: DummyLocationProvider,
o Rename the (internal) LocationProvider to LocationProviderBase.
o Plumb pid, uid and packageName throughout
LocationManagerService#Receiver to support future features.
TODO: The FLP and Geofencer have a lot of room to be more intelligent
TODO: Documentation
TODO: test test test
Change-Id: Iacefd2f176ed40ce1e23b090a164792aa8819c55
Diffstat (limited to 'location/java/com/android')
6 files changed, 328 insertions, 180 deletions
diff --git a/location/java/com/android/internal/location/DummyLocationProvider.java b/location/java/com/android/internal/location/DummyLocationProvider.java deleted file mode 100644 index 3122960..0000000 --- a/location/java/com/android/internal/location/DummyLocationProvider.java +++ /dev/null @@ -1,180 +0,0 @@ -/* - * Copyright (C) 2007 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.internal.location; - -import android.location.ILocationManager; -import android.location.LocationProvider; - -/** - * A stub implementation of LocationProvider used by LocationManager. - * A DummyLocationProvider may be queried to determine the properties - * of the provider whcih it shadows, but does not actually provide location - * data. - * - * {@hide} - */ -public class DummyLocationProvider extends LocationProvider { - - private static final String TAG = "DummyLocationProvider"; - - String mName; - boolean mRequiresNetwork; - boolean mRequiresSatellite; - boolean mRequiresCell; - boolean mHasMonetaryCost; - boolean mSupportsAltitude; - boolean mSupportsSpeed; - boolean mSupportsBearing; - int mPowerRequirement; - int mAccuracy; - - public DummyLocationProvider(String name, ILocationManager service) { - super(name, service); - } - - public void setRequiresNetwork(boolean requiresNetwork) { - mRequiresNetwork = requiresNetwork; - } - - public void setRequiresSatellite(boolean requiresSatellite) { - mRequiresSatellite = requiresSatellite; - } - - public void setRequiresCell(boolean requiresCell) { - mRequiresCell = requiresCell; - } - - public void setHasMonetaryCost(boolean hasMonetaryCost) { - mHasMonetaryCost = hasMonetaryCost; - } - - public void setSupportsAltitude(boolean supportsAltitude) { - mSupportsAltitude = supportsAltitude; - } - - public void setSupportsSpeed(boolean supportsSpeed) { - mSupportsSpeed = supportsSpeed; - } - - public void setSupportsBearing(boolean supportsBearing) { - mSupportsBearing = supportsBearing; - } - - public void setPowerRequirement(int powerRequirement) { - mPowerRequirement = powerRequirement; - } - - public void setAccuracy(int accuracy) { - mAccuracy = accuracy; - } - - /** - * Returns true if the provider requires access to a - * data network (e.g., the Internet), false otherwise. - */ - @Override - public boolean requiresNetwork() { - return mRequiresNetwork; - } - - /** - * Returns true if the provider requires access to a - * satellite-based positioning system (e.g., GPS), false - * otherwise. - */ - @Override - public boolean requiresSatellite() { - return mRequiresSatellite; - } - - /** - * Returns true if the provider requires access to an appropriate - * cellular network (e.g., to make use of cell tower IDs), false - * otherwise. - */ - @Override - public boolean requiresCell() { - return mRequiresCell; - } - - /** - * 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. - */ - @Override - public boolean hasMonetaryCost() { - return mHasMonetaryCost; - } - - /** - * 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. - */ - @Override - public boolean supportsAltitude() { - return mSupportsAltitude; - } - - /** - * 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. - */ - @Override - public boolean supportsSpeed() { - return mSupportsSpeed; - } - - /** - * 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. - */ - @Override - public boolean supportsBearing() { - return mSupportsBearing; - } - - /** - * Returns the power requirement for this provider. - * - * @return the power requirement for this provider, as one of the - * constants Criteria.POWER_REQUIREMENT_*. - */ - @Override - public int getPowerRequirement() { - return mPowerRequirement; - } - - /** - * Returns a constant describing the horizontal accuracy returned - * by this provider. - * - * @return the horizontal accuracy for this provider, as one of the - * constants Criteria.ACCURACY_*. - */ - @Override - public int getAccuracy() { - return mAccuracy; - } -} - diff --git a/location/java/com/android/internal/location/ILocationProvider.aidl b/location/java/com/android/internal/location/ILocationProvider.aidl new file mode 100644 index 0000000..39c2d92 --- /dev/null +++ b/location/java/com/android/internal/location/ILocationProvider.aidl @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2009 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.internal.location; + +import android.location.Location; +import android.net.NetworkInfo; +import android.os.Bundle; +import android.os.WorkSource; + +import com.android.internal.location.ProviderProperties; +import com.android.internal.location.ProviderRequest; + +/** + * Binder interface for services that implement location providers. + * <p>Use {@link LocationProviderBase} as a helper to implement this + * interface. + * @hide + */ +interface ILocationProvider { + void enable(); + void disable(); + + void setRequest(in ProviderRequest request, in WorkSource ws); + + // --- deprecated (but still supported) --- + ProviderProperties getProperties(); + int getStatus(out Bundle extras); + long getStatusUpdateTime(); + boolean sendExtraCommand(String command, inout Bundle extras); +} diff --git a/location/java/com/android/internal/location/ProviderProperties.aidl b/location/java/com/android/internal/location/ProviderProperties.aidl new file mode 100644 index 0000000..b901444 --- /dev/null +++ b/location/java/com/android/internal/location/ProviderProperties.aidl @@ -0,0 +1,19 @@ +/* + * Copyright (C) 2012, 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.internal.location; + +parcelable ProviderProperties; diff --git a/location/java/com/android/internal/location/ProviderProperties.java b/location/java/com/android/internal/location/ProviderProperties.java new file mode 100644 index 0000000..08aed80 --- /dev/null +++ b/location/java/com/android/internal/location/ProviderProperties.java @@ -0,0 +1,152 @@ +/* + * Copyright (C) 2012 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.internal.location; + +import android.os.Parcel; +import android.os.Parcelable; + +/** + * A Parcelable containing (legacy) location provider properties. + * This object is just used inside the framework and system services. + * @hide + */ +public final class ProviderProperties implements Parcelable { + /** + * True if provider requires access to a + * data network (e.g., the Internet), false otherwise. + */ + public final boolean mRequiresNetwork; + + /** + * True if the provider requires access to a + * satellite-based positioning system (e.g., GPS), false + * otherwise. + */ + public final boolean mRequiresSatellite; + + /** + * True if the provider requires access to an appropriate + * cellular network (e.g., to make use of cell tower IDs), false + * otherwise. + */ + public final boolean mRequiresCell; + + /** + * 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. Cell (network) usage + * is not considered monetary cost. + */ + public final boolean mHasMonetaryCost; + + /** + * True if the provider is able to provide altitude + * information, false otherwise. A provider that reports altitude + * under most circumstances but may occasionally not report it + * should return true. + */ + public final boolean mSupportsAltitude; + + /** + * True if the provider is able to provide speed + * information, false otherwise. A provider that reports speed + * under most circumstances but may occasionally not report it + * should return true. + */ + public final boolean mSupportsSpeed; + + /** + * True if the provider is able to provide bearing + * information, false otherwise. A provider that reports bearing + * under most circumstances but may occasionally not report it + * should return true. + */ + public final boolean mSupportsBearing; + + /** + * Power requirement for this provider. + * + * @return the power requirement for this provider, as one of the + * constants Criteria.POWER_*. + */ + public final int mPowerRequirement; + + /** + * Constant describing the horizontal accuracy returned + * by this provider. + * + * @return the horizontal accuracy for this provider, as one of the + * constants Criteria.ACCURACY_COARSE or Criteria.ACCURACY_FINE + */ + public final int mAccuracy; + + public ProviderProperties(boolean mRequiresNetwork, + boolean mRequiresSatellite, boolean mRequiresCell, boolean mHasMonetaryCost, + boolean mSupportsAltitude, boolean mSupportsSpeed, boolean mSupportsBearing, + int mPowerRequirement, int mAccuracy) { + this.mRequiresNetwork = mRequiresNetwork; + this.mRequiresSatellite = mRequiresSatellite; + this.mRequiresCell = mRequiresCell; + this.mHasMonetaryCost = mHasMonetaryCost; + this.mSupportsAltitude = mSupportsAltitude; + this.mSupportsSpeed = mSupportsSpeed; + this.mSupportsBearing = mSupportsBearing; + this.mPowerRequirement = mPowerRequirement; + this.mAccuracy = mAccuracy; + } + + public static final Parcelable.Creator<ProviderProperties> CREATOR = + new Parcelable.Creator<ProviderProperties>() { + @Override + public ProviderProperties createFromParcel(Parcel in) { + boolean requiresNetwork = in.readInt() == 1; + boolean requiresSatellite = in.readInt() == 1; + boolean requiresCell = in.readInt() == 1; + boolean hasMonetaryCost = in.readInt() == 1; + boolean supportsAltitude = in.readInt() == 1; + boolean supportsSpeed = in.readInt() == 1; + boolean supportsBearing = in.readInt() == 1; + int powerRequirement = in.readInt(); + int accuracy = in.readInt(); + return new ProviderProperties(requiresNetwork, requiresSatellite, + requiresCell, hasMonetaryCost, supportsAltitude, supportsSpeed, supportsBearing, + powerRequirement, accuracy); + } + @Override + public ProviderProperties[] newArray(int size) { + return new ProviderProperties[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel parcel, int flags) { + parcel.writeInt(mRequiresNetwork ? 1 : 0); + parcel.writeInt(mRequiresSatellite ? 1 : 0); + parcel.writeInt(mRequiresCell ? 1 : 0); + parcel.writeInt(mHasMonetaryCost ? 1 : 0); + parcel.writeInt(mSupportsAltitude ? 1 : 0); + parcel.writeInt(mSupportsSpeed ? 1 : 0); + parcel.writeInt(mSupportsSpeed ? 1 : 0); + parcel.writeInt(mPowerRequirement); + parcel.writeInt(mAccuracy); + } +} diff --git a/location/java/com/android/internal/location/ProviderRequest.aidl b/location/java/com/android/internal/location/ProviderRequest.aidl new file mode 100644 index 0000000..4e1ea95 --- /dev/null +++ b/location/java/com/android/internal/location/ProviderRequest.aidl @@ -0,0 +1,19 @@ +/* + * Copyright (C) 2012 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.internal.location; + +parcelable ProviderRequest; diff --git a/location/java/com/android/internal/location/ProviderRequest.java b/location/java/com/android/internal/location/ProviderRequest.java new file mode 100644 index 0000000..25c51f5 --- /dev/null +++ b/location/java/com/android/internal/location/ProviderRequest.java @@ -0,0 +1,94 @@ +/* + * Copyright (C) 2012 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.internal.location; + +import java.util.ArrayList; +import java.util.List; + +import android.location.LocationRequest; +import android.os.Parcel; +import android.os.Parcelable; +import android.util.TimeUtils; + +/** @hide */ +public final class ProviderRequest implements Parcelable { + /** Location reporting is requested (true) */ + public boolean reportLocation = false; + + /** The smallest requested interval */ + public long interval = Long.MAX_VALUE; + + /** + * A more detailed set of requests. + * <p>Location Providers can optionally use this to + * fine tune location updates, for example when there + * is a high power slow interval request and a + * low power fast interval request. + */ + public List<LocationRequest> locationRequests = null; + + public ProviderRequest() { + } + + public static final Parcelable.Creator<ProviderRequest> CREATOR = + new Parcelable.Creator<ProviderRequest>() { + @Override + public ProviderRequest createFromParcel(Parcel in) { + ProviderRequest request = new ProviderRequest(); + request.reportLocation = in.readInt() == 1; + request.interval = in.readLong(); + int count = in.readInt(); + request.locationRequests = new ArrayList<LocationRequest>(count); + for (int i = 0; i < count; i++) { + request.locationRequests.add(LocationRequest.CREATOR.createFromParcel(in)); + } + return request; + } + @Override + public ProviderRequest[] newArray(int size) { + return new ProviderRequest[size]; + } + }; + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel parcel, int flags) { + parcel.writeInt(reportLocation ? 1 : 0); + parcel.writeLong(interval); + parcel.writeParcelableArray(locationRequests.toArray( + new LocationRequest[locationRequests.size()]), 0); + } + + @Override + public String toString() { + StringBuilder s = new StringBuilder(); + s.append("ProviderRequest["); + if (reportLocation) { + s.append("ON"); + s.append(" interval="); + TimeUtils.formatDuration(interval, s); + } else { + s.append("OFF"); + } + s.append(']'); + return s.toString(); + } +} |