Merge "Annotate Locations coming from mock providers"
This commit is contained in:
committed by
Android (Google) Code Review
commit
de07d41f63
@@ -10701,6 +10701,7 @@ package android.location {
|
|||||||
method public boolean hasAltitude();
|
method public boolean hasAltitude();
|
||||||
method public boolean hasBearing();
|
method public boolean hasBearing();
|
||||||
method public boolean hasSpeed();
|
method public boolean hasSpeed();
|
||||||
|
method public boolean isFromMockProvider();
|
||||||
method public void removeAccuracy();
|
method public void removeAccuracy();
|
||||||
method public void removeAltitude();
|
method public void removeAltitude();
|
||||||
method public void removeBearing();
|
method public void removeBearing();
|
||||||
|
|||||||
@@ -91,6 +91,7 @@ public class Location implements Parcelable {
|
|||||||
private boolean mHasAccuracy = false;
|
private boolean mHasAccuracy = false;
|
||||||
private float mAccuracy = 0.0f;
|
private float mAccuracy = 0.0f;
|
||||||
private Bundle mExtras = null;
|
private Bundle mExtras = null;
|
||||||
|
private boolean mIsFromMockProvider = false;
|
||||||
|
|
||||||
// Cache the inputs and outputs of computeDistanceAndBearing
|
// Cache the inputs and outputs of computeDistanceAndBearing
|
||||||
// so calls to distanceTo() and bearingTo() can share work
|
// so calls to distanceTo() and bearingTo() can share work
|
||||||
@@ -140,6 +141,7 @@ public class Location implements Parcelable {
|
|||||||
mHasAccuracy = l.mHasAccuracy;
|
mHasAccuracy = l.mHasAccuracy;
|
||||||
mAccuracy = l.mAccuracy;
|
mAccuracy = l.mAccuracy;
|
||||||
mExtras = (l.mExtras == null) ? null : new Bundle(l.mExtras);
|
mExtras = (l.mExtras == null) ? null : new Bundle(l.mExtras);
|
||||||
|
mIsFromMockProvider = l.mIsFromMockProvider;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -160,6 +162,7 @@ public class Location implements Parcelable {
|
|||||||
mHasAccuracy = false;
|
mHasAccuracy = false;
|
||||||
mAccuracy = 0;
|
mAccuracy = 0;
|
||||||
mExtras = null;
|
mExtras = null;
|
||||||
|
mIsFromMockProvider = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -840,6 +843,7 @@ public class Location implements Parcelable {
|
|||||||
if (mHasAltitude) s.append(" alt=").append(mAltitude);
|
if (mHasAltitude) s.append(" alt=").append(mAltitude);
|
||||||
if (mHasSpeed) s.append(" vel=").append(mSpeed);
|
if (mHasSpeed) s.append(" vel=").append(mSpeed);
|
||||||
if (mHasBearing) s.append(" bear=").append(mBearing);
|
if (mHasBearing) s.append(" bear=").append(mBearing);
|
||||||
|
if (mIsFromMockProvider) s.append(" mock");
|
||||||
|
|
||||||
if (mExtras != null) {
|
if (mExtras != null) {
|
||||||
s.append(" {").append(mExtras).append('}');
|
s.append(" {").append(mExtras).append('}');
|
||||||
@@ -871,6 +875,7 @@ public class Location implements Parcelable {
|
|||||||
l.mHasAccuracy = in.readInt() != 0;
|
l.mHasAccuracy = in.readInt() != 0;
|
||||||
l.mAccuracy = in.readFloat();
|
l.mAccuracy = in.readFloat();
|
||||||
l.mExtras = in.readBundle();
|
l.mExtras = in.readBundle();
|
||||||
|
l.mIsFromMockProvider = in.readInt() != 0;
|
||||||
return l;
|
return l;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -901,6 +906,7 @@ public class Location implements Parcelable {
|
|||||||
parcel.writeInt(mHasAccuracy ? 1 : 0);
|
parcel.writeInt(mHasAccuracy ? 1 : 0);
|
||||||
parcel.writeFloat(mAccuracy);
|
parcel.writeFloat(mAccuracy);
|
||||||
parcel.writeBundle(mExtras);
|
parcel.writeBundle(mExtras);
|
||||||
|
parcel.writeInt(mIsFromMockProvider? 1 : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -934,4 +940,23 @@ public class Location implements Parcelable {
|
|||||||
}
|
}
|
||||||
mExtras.putParcelable(key, value);
|
mExtras.putParcelable(key, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if the Location came from a mock provider.
|
||||||
|
*
|
||||||
|
* @return true if this Location came from a mock provider, false otherwise
|
||||||
|
*/
|
||||||
|
public boolean isFromMockProvider() {
|
||||||
|
return mIsFromMockProvider;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flag this Location as having come from a mock provider or not.
|
||||||
|
*
|
||||||
|
* @param isFromMockProvider true if this Location came from a mock provider, false otherwise
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public void setIsFromMockProvider(boolean isFromMockProvider) {
|
||||||
|
mIsFromMockProvider = isFromMockProvider;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1549,9 +1549,9 @@ public class LocationManager {
|
|||||||
public GpsStatus getGpsStatus(GpsStatus status) {
|
public GpsStatus getGpsStatus(GpsStatus status) {
|
||||||
if (status == null) {
|
if (status == null) {
|
||||||
status = new GpsStatus();
|
status = new GpsStatus();
|
||||||
}
|
}
|
||||||
status.setStatus(mGpsStatus);
|
status.setStatus(mGpsStatus);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1792,17 +1792,33 @@ public class LocationManagerService extends ILocationManager.Stub {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isMockProvider(String provider) {
|
||||||
|
synchronized (mLock) {
|
||||||
|
return mMockProviders.containsKey(provider);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void handleLocationChanged(Location location, boolean passive) {
|
private void handleLocationChanged(Location location, boolean passive) {
|
||||||
String provider = location.getProvider();
|
// create a working copy of the incoming Location so that the service can modify it without
|
||||||
|
// disturbing the caller's copy
|
||||||
|
Location myLocation = new Location(location);
|
||||||
|
String provider = myLocation.getProvider();
|
||||||
|
|
||||||
|
// set "isFromMockProvider" bit if location came from a mock provider. we do not clear this
|
||||||
|
// bit if location did not come from a mock provider because passive/fused providers can
|
||||||
|
// forward locations from mock providers, and should not grant them legitimacy in doing so.
|
||||||
|
if (!myLocation.isFromMockProvider() && isMockProvider(provider)) {
|
||||||
|
myLocation.setIsFromMockProvider(true);
|
||||||
|
}
|
||||||
|
|
||||||
if (!passive) {
|
if (!passive) {
|
||||||
// notify passive provider of the new location
|
// notify passive provider of the new location
|
||||||
mPassiveProvider.updateLocation(location);
|
mPassiveProvider.updateLocation(myLocation);
|
||||||
}
|
}
|
||||||
|
|
||||||
synchronized (mLock) {
|
synchronized (mLock) {
|
||||||
if (isAllowedBySettingsLocked(provider, mCurrentUserId)) {
|
if (isAllowedBySettingsLocked(provider, mCurrentUserId)) {
|
||||||
handleLocationChangedLocked(location, passive);
|
handleLocationChangedLocked(myLocation, passive);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user