From d6158258e64e1548d33bf4c2085c4458ba7fcd53 Mon Sep 17 00:00:00 2001 From: Soonil Nagarkar Date: Wed, 15 Jul 2020 17:37:36 -0700 Subject: Extract LocationProviderManager This extracts LocationProviderManager as a completely stand-alone class, substantially reducing the complexity in LMS, and in LocationProviderManager. Core AOSP location code is now unit testable for the first time, and we begin adding unit tests. Test: extensive manual tests + presubmits Change-Id: I0fb17ddbf91bdd26ed7855110026b3dd09612a5c --- .../android/location/LocationManagerInternal.java | 36 ++++++++++++++ .../java/android/location/LocationRequest.java | 56 +++++++++++++--------- 2 files changed, 69 insertions(+), 23 deletions(-) (limited to 'location/java') diff --git a/location/java/android/location/LocationManagerInternal.java b/location/java/android/location/LocationManagerInternal.java index 542737b479e2..ef68814bce84 100644 --- a/location/java/android/location/LocationManagerInternal.java +++ b/location/java/android/location/LocationManagerInternal.java @@ -21,6 +21,8 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.location.util.identity.CallerIdentity; +import java.util.List; + /** * Location manager local system service interface. * @@ -28,6 +30,16 @@ import android.location.util.identity.CallerIdentity; */ public abstract class LocationManagerInternal { + /** + * Listener for changes in provider enabled state. + */ + public interface ProviderEnabledListener { + /** + * Called when the provider enabled state changes for a particular user. + */ + void onProviderEnabledChanged(String provider, int userId, boolean enabled); + } + /** * Returns true if the given provider is enabled for the given user. * @@ -37,6 +49,24 @@ public abstract class LocationManagerInternal { */ public abstract boolean isProviderEnabledForUser(@NonNull String provider, int userId); + /** + * Adds a provider enabled listener. The given provider must exist. + * + * @param provider The provider to listen for changes + * @param listener The listener + */ + public abstract void addProviderEnabledListener(String provider, + ProviderEnabledListener listener); + + /** + * Removes a provider enabled listener. The given provider must exist. + * + * @param provider The provider to listen for changes + * @param listener The listener + */ + public abstract void removeProviderEnabledListener(String provider, + ProviderEnabledListener listener); + /** * Returns true if the given identity is a location provider. * @@ -52,4 +82,10 @@ public abstract class LocationManagerInternal { */ // TODO: there is no reason for this to exist as part of any API. move all the logic into gnss public abstract void sendNiResponse(int notifId, int userResponse); + + /** + * Should only be used by GNSS code. + */ + // TODO: there is no reason for this to exist as part of any API. create a real batching API + public abstract void reportGnssBatchLocations(List locations); } diff --git a/location/java/android/location/LocationRequest.java b/location/java/android/location/LocationRequest.java index bb36c2a1fc39..280bd058ef0f 100644 --- a/location/java/android/location/LocationRequest.java +++ b/location/java/android/location/LocationRequest.java @@ -32,6 +32,8 @@ import android.util.TimeUtils; import com.android.internal.util.Preconditions; +import java.util.Objects; + /** * A data object that contains quality of service parameters for requests @@ -150,8 +152,6 @@ public final class LocationRequest implements Parcelable { @UnsupportedAppUsage private String mProvider; - // if true, client requests coarse location, if false, client requests fine location - private boolean mCoarseLocation; @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023) private int mQuality; @UnsupportedAppUsage @@ -257,7 +257,6 @@ public final class LocationRequest implements Parcelable { public LocationRequest() { this( /* provider= */ LocationManager.FUSED_PROVIDER, - /* coarseLocation= */ false, /* quality= */ POWER_LOW, /* interval= */ DEFAULT_INTERVAL_MS, /* fastestInterval= */ (long) (DEFAULT_INTERVAL_MS / FASTEST_INTERVAL_FACTOR), @@ -276,7 +275,6 @@ public final class LocationRequest implements Parcelable { public LocationRequest(LocationRequest src) { this( src.mProvider, - src.mCoarseLocation, src.mQuality, src.mInterval, src.mFastestInterval, @@ -293,7 +291,6 @@ public final class LocationRequest implements Parcelable { private LocationRequest( @NonNull String provider, - boolean coarseLocation, int quality, long intervalMs, long fastestIntervalMs, @@ -310,7 +307,6 @@ public final class LocationRequest implements Parcelable { checkQuality(quality); mProvider = provider; - mCoarseLocation = coarseLocation; mQuality = quality; mInterval = intervalMs; mFastestInterval = fastestIntervalMs; @@ -326,20 +322,6 @@ public final class LocationRequest implements Parcelable { mWorkSource = workSource; } - /** - * @hide - */ - public boolean isCoarse() { - return mCoarseLocation; - } - - /** - * @hide - */ - public void setCoarse(boolean coarse) { - mCoarseLocation = coarse; - } - /** * Set the quality of the request. * @@ -720,7 +702,6 @@ public final class LocationRequest implements Parcelable { public LocationRequest createFromParcel(Parcel in) { return new LocationRequest( /* provider= */ in.readString(), - /* coarseLocation= */ in.readBoolean(), /* quality= */ in.readInt(), /* interval= */ in.readLong(), /* fastestInterval= */ in.readLong(), @@ -749,7 +730,6 @@ public final class LocationRequest implements Parcelable { @Override public void writeToParcel(Parcel parcel, int flags) { parcel.writeString(mProvider); - parcel.writeBoolean(mCoarseLocation); parcel.writeInt(mQuality); parcel.writeLong(mInterval); parcel.writeLong(mFastestInterval); @@ -784,6 +764,36 @@ public final class LocationRequest implements Parcelable { } } + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + LocationRequest that = (LocationRequest) o; + return mQuality == that.mQuality + && mInterval == that.mInterval + && mFastestInterval == that.mFastestInterval + && mExplicitFastestInterval == that.mExplicitFastestInterval + && mExpireAt == that.mExpireAt + && mExpireIn == that.mExpireIn + && mNumUpdates == that.mNumUpdates + && Float.compare(that.mSmallestDisplacement, mSmallestDisplacement) == 0 + && mHideFromAppOps == that.mHideFromAppOps + && mLocationSettingsIgnored == that.mLocationSettingsIgnored + && mLowPowerMode == that.mLowPowerMode + && mProvider.equals(that.mProvider) + && Objects.equals(mWorkSource, that.mWorkSource); + } + + @Override + public int hashCode() { + return Objects.hash(mProvider, mInterval, mWorkSource); + } + @NonNull @Override public String toString() { @@ -794,7 +804,7 @@ public final class LocationRequest implements Parcelable { if (mQuality != POWER_NONE) { s.append(" interval="); TimeUtils.formatDuration(mInterval, s); - if (mExplicitFastestInterval) { + if (mExplicitFastestInterval && mFastestInterval != mInterval) { s.append(" fastestInterval="); TimeUtils.formatDuration(mFastestInterval, s); } -- cgit v1.2.3-59-g8ed1b