From abb7ac8e60932c63662b36577f6722ab1316755f Mon Sep 17 00:00:00 2001 From: Soonil Nagarkar Date: Mon, 24 Jan 2022 12:38:54 -0800 Subject: [PATCH] Change default LocationRequest quality In order to maintain backwards compatibility with SystemApi versions of LocationRequest, we chose to keep the default quality level as low. However, this is causing problems when LocationRequests are created through the use of legacy public APIs, leading to location requests that do not receive locations as expected. Default the quality level to balanced to address this issue. Also removes old UnsupportedAppUsage annotations (past the 2 release support limit now), and updates some variable names accordingly. Bug: 215186921 Test: presubmits Change-Id: I6e1fdb0b94438fd3dede75103cd70443e863a3f2 --- .../android/location/LocationRequest.java | 80 +++++++++---------- 1 file changed, 37 insertions(+), 43 deletions(-) diff --git a/location/java/android/location/LocationRequest.java b/location/java/android/location/LocationRequest.java index d6e203c39870d..587222a4df43f 100644 --- a/location/java/android/location/LocationRequest.java +++ b/location/java/android/location/LocationRequest.java @@ -29,7 +29,6 @@ import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.compat.annotation.ChangeId; import android.compat.annotation.EnabledAfter; -import android.compat.annotation.UnsupportedAppUsage; import android.os.Build; import android.os.Parcel; import android.os.Parcelable; @@ -180,13 +179,9 @@ public final class LocationRequest implements Parcelable { private static final long IMPLICIT_MIN_UPDATE_INTERVAL = -1; private static final double IMPLICIT_MIN_UPDATE_INTERVAL_FACTOR = 1D / 6D; - @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, publicAlternatives = "Use {@link " - + "LocationManager} methods to provide the provider explicitly.") - @Nullable private String mProvider; + private @Nullable String mProvider; private @Quality int mQuality; - @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, publicAlternatives = "Use {@link " - + "LocationRequest} instead.") - private long mInterval; + private long mIntervalMillis; private long mMinUpdateIntervalMillis; private long mExpireAtRealtimeMillis; private long mDurationMillis; @@ -195,7 +190,7 @@ public final class LocationRequest implements Parcelable { private final long mMaxUpdateDelayMillis; private boolean mHideFromAppOps; private final boolean mAdasGnssBypass; - private boolean mLocationSettingsIgnored; + private boolean mBypass; private boolean mLowPower; private @Nullable WorkSource mWorkSource; @@ -208,9 +203,7 @@ public final class LocationRequest implements Parcelable { @NonNull public static LocationRequest create() { // 60 minutes is the default legacy interval - return new LocationRequest.Builder(60 * 60 * 1000) - .setQuality(QUALITY_LOW_POWER) - .build(); + return new LocationRequest.Builder(60 * 60 * 1000).build(); } /** @@ -239,7 +232,7 @@ public final class LocationRequest implements Parcelable { } else if (LocationManager.GPS_PROVIDER.equals(provider)) { quality = QUALITY_HIGH_ACCURACY; } else { - quality = POWER_LOW; + quality = QUALITY_BALANCED_POWER_ACCURACY; } return new LocationRequest.Builder(intervalMillis) @@ -291,11 +284,11 @@ public final class LocationRequest implements Parcelable { long maxUpdateDelayMillis, boolean hiddenFromAppOps, boolean adasGnssBypass, - boolean locationSettingsIgnored, + boolean bypass, boolean lowPower, WorkSource workSource) { mProvider = provider; - mInterval = intervalMillis; + mIntervalMillis = intervalMillis; mQuality = quality; mMinUpdateIntervalMillis = minUpdateIntervalMillis; mExpireAtRealtimeMillis = expireAtRealtimeMillis; @@ -305,7 +298,7 @@ public final class LocationRequest implements Parcelable { mMaxUpdateDelayMillis = maxUpdateDelayMillis; mHideFromAppOps = hiddenFromAppOps; mAdasGnssBypass = adasGnssBypass; - mLocationSettingsIgnored = locationSettingsIgnored; + mBypass = bypass; mLowPower = lowPower; mWorkSource = Objects.requireNonNull(workSource); } @@ -354,7 +347,7 @@ public final class LocationRequest implements Parcelable { mQuality = QUALITY_LOW_POWER; break; case POWER_NONE: - mInterval = PASSIVE_INTERVAL; + mIntervalMillis = PASSIVE_INTERVAL; break; default: throw new IllegalArgumentException("invalid quality: " + quality); @@ -388,9 +381,9 @@ public final class LocationRequest implements Parcelable { millis = Long.MAX_VALUE - 1; } - mInterval = millis; - if (mMinUpdateIntervalMillis > mInterval) { - mMinUpdateIntervalMillis = mInterval; + mIntervalMillis = millis; + if (mMinUpdateIntervalMillis > mIntervalMillis) { + mMinUpdateIntervalMillis = mIntervalMillis; } return this; } @@ -418,7 +411,7 @@ public final class LocationRequest implements Parcelable { * @return the desired interval of location updates */ public @IntRange(from = 0) long getIntervalMillis() { - return mInterval; + return mIntervalMillis; } /** @@ -556,11 +549,11 @@ public final class LocationRequest implements Parcelable { */ public @IntRange(from = 0) long getMinUpdateIntervalMillis() { if (mMinUpdateIntervalMillis == IMPLICIT_MIN_UPDATE_INTERVAL) { - return (long) (mInterval * IMPLICIT_MIN_UPDATE_INTERVAL_FACTOR); + return (long) (mIntervalMillis * IMPLICIT_MIN_UPDATE_INTERVAL_FACTOR); } else { // the min is only necessary in case someone use a deprecated function to mess with the // interval or min update interval - return min(mMinUpdateIntervalMillis, mInterval); + return min(mMinUpdateIntervalMillis, mIntervalMillis); } } @@ -673,7 +666,7 @@ public final class LocationRequest implements Parcelable { @Deprecated @RequiresPermission(Manifest.permission.WRITE_SECURE_SETTINGS) public @NonNull LocationRequest setLocationSettingsIgnored(boolean locationSettingsIgnored) { - mLocationSettingsIgnored = locationSettingsIgnored; + mBypass = locationSettingsIgnored; return this; } @@ -687,7 +680,7 @@ public final class LocationRequest implements Parcelable { */ @SystemApi public boolean isLocationSettingsIgnored() { - return mLocationSettingsIgnored; + return mBypass; } /** @@ -696,7 +689,7 @@ public final class LocationRequest implements Parcelable { * @hide */ public boolean isBypass() { - return mAdasGnssBypass || mLocationSettingsIgnored; + return mAdasGnssBypass || mBypass; } /** @@ -796,7 +789,7 @@ public final class LocationRequest implements Parcelable { @Override public void writeToParcel(@NonNull Parcel parcel, int flags) { parcel.writeString(mProvider); - parcel.writeLong(mInterval); + parcel.writeLong(mIntervalMillis); parcel.writeInt(mQuality); parcel.writeLong(mExpireAtRealtimeMillis); parcel.writeLong(mDurationMillis); @@ -806,7 +799,7 @@ public final class LocationRequest implements Parcelable { parcel.writeLong(mMaxUpdateDelayMillis); parcel.writeBoolean(mHideFromAppOps); parcel.writeBoolean(mAdasGnssBypass); - parcel.writeBoolean(mLocationSettingsIgnored); + parcel.writeBoolean(mBypass); parcel.writeBoolean(mLowPower); parcel.writeTypedObject(mWorkSource, 0); } @@ -821,7 +814,7 @@ public final class LocationRequest implements Parcelable { } LocationRequest that = (LocationRequest) o; - return mInterval == that.mInterval + return mIntervalMillis == that.mIntervalMillis && mQuality == that.mQuality && mExpireAtRealtimeMillis == that.mExpireAtRealtimeMillis && mDurationMillis == that.mDurationMillis @@ -831,7 +824,7 @@ public final class LocationRequest implements Parcelable { && mMaxUpdateDelayMillis == that.mMaxUpdateDelayMillis && mHideFromAppOps == that.mHideFromAppOps && mAdasGnssBypass == that.mAdasGnssBypass - && mLocationSettingsIgnored == that.mLocationSettingsIgnored + && mBypass == that.mBypass && mLowPower == that.mLowPower && Objects.equals(mProvider, that.mProvider) && Objects.equals(mWorkSource, that.mWorkSource); @@ -839,7 +832,7 @@ public final class LocationRequest implements Parcelable { @Override public int hashCode() { - return Objects.hash(mProvider, mInterval, mWorkSource); + return Objects.hash(mProvider, mIntervalMillis, mWorkSource); } @NonNull @@ -850,9 +843,9 @@ public final class LocationRequest implements Parcelable { if (mProvider != null) { s.append(mProvider).append(" "); } - if (mInterval != PASSIVE_INTERVAL) { + if (mIntervalMillis != PASSIVE_INTERVAL) { s.append("@"); - TimeUtils.formatDuration(mInterval, s); + TimeUtils.formatDuration(mIntervalMillis, s); switch (mQuality) { case QUALITY_HIGH_ACCURACY: @@ -879,14 +872,14 @@ public final class LocationRequest implements Parcelable { s.append(", maxUpdates=").append(mMaxUpdates); } if (mMinUpdateIntervalMillis != IMPLICIT_MIN_UPDATE_INTERVAL - && mMinUpdateIntervalMillis < mInterval) { + && mMinUpdateIntervalMillis < mIntervalMillis) { s.append(", minUpdateInterval="); TimeUtils.formatDuration(mMinUpdateIntervalMillis, s); } if (mMinUpdateDistanceMeters > 0.0) { s.append(", minUpdateDistance=").append(mMinUpdateDistanceMeters); } - if (mMaxUpdateDelayMillis / 2 > mInterval) { + if (mMaxUpdateDelayMillis / 2 > mIntervalMillis) { s.append(", maxUpdateDelay="); TimeUtils.formatDuration(mMaxUpdateDelayMillis, s); } @@ -899,8 +892,8 @@ public final class LocationRequest implements Parcelable { if (mAdasGnssBypass) { s.append(", adasGnssBypass"); } - if (mLocationSettingsIgnored) { - s.append(", settingsBypass"); + if (mBypass) { + s.append(", bypass"); } if (mWorkSource != null && !mWorkSource.isEmpty()) { s.append(", ").append(mWorkSource); @@ -923,7 +916,7 @@ public final class LocationRequest implements Parcelable { private long mMaxUpdateDelayMillis; private boolean mHiddenFromAppOps; private boolean mAdasGnssBypass; - private boolean mLocationSettingsIgnored; + private boolean mBypass; private boolean mLowPower; @Nullable private WorkSource mWorkSource; @@ -943,7 +936,7 @@ public final class LocationRequest implements Parcelable { mMaxUpdateDelayMillis = 0; mHiddenFromAppOps = false; mAdasGnssBypass = false; - mLocationSettingsIgnored = false; + mBypass = false; mLowPower = false; mWorkSource = null; } @@ -952,7 +945,7 @@ public final class LocationRequest implements Parcelable { * Creates a new Builder with all parameters copied from the given location request. */ public Builder(@NonNull LocationRequest locationRequest) { - mIntervalMillis = locationRequest.mInterval; + mIntervalMillis = locationRequest.mIntervalMillis; mQuality = locationRequest.mQuality; mDurationMillis = locationRequest.mDurationMillis; mMaxUpdates = locationRequest.mMaxUpdates; @@ -961,7 +954,7 @@ public final class LocationRequest implements Parcelable { mMaxUpdateDelayMillis = locationRequest.mMaxUpdateDelayMillis; mHiddenFromAppOps = locationRequest.mHideFromAppOps; mAdasGnssBypass = locationRequest.mAdasGnssBypass; - mLocationSettingsIgnored = locationRequest.mLocationSettingsIgnored; + mBypass = locationRequest.mBypass; mLowPower = locationRequest.mLowPower; mWorkSource = locationRequest.mWorkSource; @@ -1160,14 +1153,15 @@ public final class LocationRequest implements Parcelable { @SystemApi @RequiresPermission(Manifest.permission.WRITE_SECURE_SETTINGS) public @NonNull Builder setLocationSettingsIgnored(boolean locationSettingsIgnored) { - mLocationSettingsIgnored = locationSettingsIgnored; + mBypass = locationSettingsIgnored; return this; } /** * It set to true, indicates that extreme trade-offs should be made if possible to save * power for this request. This usually involves specialized hardware modes which can - * greatly affect the quality of locations. Defaults to false. + * greatly affect the quality of locations. Not all devices may support this. Defaults to + * false. * *

Permissions enforcement occurs when resulting location request is actually used, not * when this method is invoked. @@ -1227,7 +1221,7 @@ public final class LocationRequest implements Parcelable { mMaxUpdateDelayMillis, mHiddenFromAppOps, mAdasGnssBypass, - mLocationSettingsIgnored, + mBypass, mLowPower, new WorkSource(mWorkSource)); }