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
This commit is contained in:
Soonil Nagarkar
2022-01-24 12:38:54 -08:00
parent 33abaa26fe
commit abb7ac8e60

View File

@@ -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.
*
* <p>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));
}