This allows third party location providers to link against the standard API surface. This replaces the LocationProviderBase implementation in the com.android.location.providers API. Both will temporarily coexist until third party applications can be migrated, and then old version will be removed. Only the LocationProviderBase API is migrated right now as its the only API that has undergone changes. This also restores some old, unused classes which should not have been remove from the API surface. Clients that support older API version will still need to link against these classes. Bug: 176115245 Test: builds Change-Id: I2d688447e1f59e441f5c48ff36d3f0dd8b5dc7f6
415 lines
14 KiB
Java
415 lines
14 KiB
Java
/*
|
|
* Copyright (C) 2021 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 android.location.provider;
|
|
|
|
import android.annotation.IntDef;
|
|
import android.annotation.NonNull;
|
|
import android.os.Parcel;
|
|
import android.os.Parcelable;
|
|
|
|
import com.android.internal.util.Preconditions;
|
|
|
|
import java.lang.annotation.Retention;
|
|
import java.lang.annotation.RetentionPolicy;
|
|
import java.util.Objects;
|
|
|
|
/**
|
|
* Location provider properties.
|
|
*/
|
|
public final class ProviderProperties implements Parcelable {
|
|
|
|
/**
|
|
* A constant indicating low power usage.
|
|
*/
|
|
public static final int POWER_USAGE_LOW = 1;
|
|
|
|
/**
|
|
* A constant indicating a medium power usage.
|
|
*/
|
|
public static final int POWER_USAGE_MEDIUM = 2;
|
|
|
|
/**
|
|
* A constant indicating high power usage.
|
|
*/
|
|
public static final int POWER_USAGE_HIGH = 3;
|
|
|
|
/** @hide */
|
|
@Retention(RetentionPolicy.SOURCE)
|
|
@IntDef(prefix = "POWER_USAGE_", value = {POWER_USAGE_LOW, POWER_USAGE_MEDIUM,
|
|
POWER_USAGE_HIGH})
|
|
public @interface PowerUsage {}
|
|
|
|
/**
|
|
* A constant indicating a finer location accuracy.
|
|
*/
|
|
public static final int ACCURACY_FINE = 1;
|
|
|
|
/**
|
|
* A constant indicating a coarser location accuracy.
|
|
*/
|
|
public static final int ACCURACY_COARSE = 2;
|
|
|
|
/** @hide */
|
|
@Retention(RetentionPolicy.SOURCE)
|
|
@IntDef(prefix = "ACCURACY_", value = {ACCURACY_FINE, ACCURACY_COARSE})
|
|
public @interface Accuracy {}
|
|
|
|
private final boolean mHasNetworkRequirement;
|
|
private final boolean mHasSatelliteRequirement;
|
|
private final boolean mHasCellRequirement;
|
|
private final boolean mHasMonetaryCost;
|
|
private final boolean mHasAltitudeSupport;
|
|
private final boolean mHasSpeedSupport;
|
|
private final boolean mHasBearingSupport;
|
|
private final @PowerUsage int mPowerUsage;
|
|
private final @Accuracy int mAccuracy;
|
|
|
|
private ProviderProperties(boolean hasNetworkRequirement, boolean hasSatelliteRequirement,
|
|
boolean hasCellRequirement, boolean hasMonetaryCost, boolean hasAltitudeSupport,
|
|
boolean hasSpeedSupport, boolean hasBearingSupport,
|
|
@PowerUsage int powerUsage, @Accuracy int accuracy) {
|
|
mHasNetworkRequirement = hasNetworkRequirement;
|
|
mHasSatelliteRequirement = hasSatelliteRequirement;
|
|
mHasCellRequirement = hasCellRequirement;
|
|
mHasMonetaryCost = hasMonetaryCost;
|
|
mHasAltitudeSupport = hasAltitudeSupport;
|
|
mHasSpeedSupport = hasSpeedSupport;
|
|
mHasBearingSupport = hasBearingSupport;
|
|
mPowerUsage = powerUsage;
|
|
mAccuracy = accuracy;
|
|
}
|
|
|
|
/**
|
|
* True if provider requires access to a data network (e.g., the Internet).
|
|
*/
|
|
public boolean hasNetworkRequirement() {
|
|
return mHasNetworkRequirement;
|
|
}
|
|
|
|
/**
|
|
* True if the provider requires access to a satellite-based positioning system (e.g., GPS).
|
|
*/
|
|
public boolean hasSatelliteRequirement() {
|
|
return mHasSatelliteRequirement;
|
|
}
|
|
|
|
/**
|
|
* True if the provider requires access to a cellular network (e.g., for cell tower IDs).
|
|
*/
|
|
public boolean hasCellRequirement() {
|
|
return mHasCellRequirement;
|
|
}
|
|
|
|
/**
|
|
* True if this provider may result in a monetary charge to the user. Network usage is not
|
|
* considered a monetary cost.
|
|
*/
|
|
public boolean hasMonetaryCost() {
|
|
return mHasMonetaryCost;
|
|
}
|
|
|
|
/**
|
|
* True if the provider is able to provide altitude under at least some conditions.
|
|
*/
|
|
public boolean hasAltitudeSupport() {
|
|
return mHasAltitudeSupport;
|
|
}
|
|
|
|
/**
|
|
* True if the provider is able to provide speed under at least some conditions.
|
|
*/
|
|
public boolean hasSpeedSupport() {
|
|
return mHasSpeedSupport;
|
|
}
|
|
|
|
/**
|
|
* True if the provider is able to provide bearing under at least some conditions.
|
|
*/
|
|
public boolean hasBearingSupport() {
|
|
return mHasBearingSupport;
|
|
}
|
|
|
|
/**
|
|
* Power usage for this provider.
|
|
*/
|
|
public @PowerUsage int getPowerUsage() {
|
|
return mPowerUsage;
|
|
}
|
|
|
|
/**
|
|
* Rough location accuracy for this provider, primarily with respect to horizontal location
|
|
* accuracy.
|
|
*/
|
|
public @Accuracy int getAccuracy() {
|
|
return mAccuracy;
|
|
}
|
|
|
|
public static final @NonNull Creator<ProviderProperties> CREATOR =
|
|
new Creator<ProviderProperties>() {
|
|
@Override
|
|
public ProviderProperties createFromParcel(Parcel in) {
|
|
return new ProviderProperties(
|
|
/* hasNetworkRequirement= */ in.readBoolean(),
|
|
/* hasSatelliteRequirement= */ in.readBoolean(),
|
|
/* hasCellRequirement= */ in.readBoolean(),
|
|
/* hasMonetaryCost= */ in.readBoolean(),
|
|
/* hasAltitudeSupport= */ in.readBoolean(),
|
|
/* hasSpeedSupport= */ in.readBoolean(),
|
|
/* hasBearingSupport= */ in.readBoolean(),
|
|
/* powerUsage= */ in.readInt(),
|
|
/* accuracy= */ in.readInt());
|
|
}
|
|
|
|
@Override
|
|
public ProviderProperties[] newArray(int size) {
|
|
return new ProviderProperties[size];
|
|
}
|
|
};
|
|
|
|
@Override
|
|
public int describeContents() {
|
|
return 0;
|
|
}
|
|
|
|
@Override
|
|
public void writeToParcel(@NonNull Parcel parcel, int flags) {
|
|
parcel.writeBoolean(mHasNetworkRequirement);
|
|
parcel.writeBoolean(mHasSatelliteRequirement);
|
|
parcel.writeBoolean(mHasCellRequirement);
|
|
parcel.writeBoolean(mHasMonetaryCost);
|
|
parcel.writeBoolean(mHasAltitudeSupport);
|
|
parcel.writeBoolean(mHasSpeedSupport);
|
|
parcel.writeBoolean(mHasBearingSupport);
|
|
parcel.writeInt(mPowerUsage);
|
|
parcel.writeInt(mAccuracy);
|
|
}
|
|
|
|
@Override
|
|
public boolean equals(Object o) {
|
|
if (this == o) {
|
|
return true;
|
|
}
|
|
if (!(o instanceof ProviderProperties)) {
|
|
return false;
|
|
}
|
|
ProviderProperties that = (ProviderProperties) o;
|
|
return mHasNetworkRequirement == that.mHasNetworkRequirement
|
|
&& mHasSatelliteRequirement == that.mHasSatelliteRequirement
|
|
&& mHasCellRequirement == that.mHasCellRequirement
|
|
&& mHasMonetaryCost == that.mHasMonetaryCost
|
|
&& mHasAltitudeSupport == that.mHasAltitudeSupport
|
|
&& mHasSpeedSupport == that.mHasSpeedSupport
|
|
&& mHasBearingSupport == that.mHasBearingSupport
|
|
&& mPowerUsage == that.mPowerUsage
|
|
&& mAccuracy == that.mAccuracy;
|
|
}
|
|
|
|
@Override
|
|
public int hashCode() {
|
|
return Objects.hash(mHasNetworkRequirement, mHasSatelliteRequirement, mHasCellRequirement,
|
|
mHasMonetaryCost, mHasAltitudeSupport, mHasSpeedSupport, mHasBearingSupport,
|
|
mPowerUsage, mAccuracy);
|
|
}
|
|
|
|
@Override
|
|
public String toString() {
|
|
StringBuilder b = new StringBuilder("ProviderProperties[");
|
|
b.append("powerUsage=").append(powerToString(mPowerUsage)).append(", ");
|
|
b.append("accuracy=").append(accuracyToString(mAccuracy));
|
|
if (mHasNetworkRequirement || mHasSatelliteRequirement || mHasCellRequirement) {
|
|
b.append(", requires=");
|
|
if (mHasNetworkRequirement) {
|
|
b.append("network,");
|
|
}
|
|
if (mHasSatelliteRequirement) {
|
|
b.append("satellite,");
|
|
}
|
|
if (mHasCellRequirement) {
|
|
b.append("cell,");
|
|
}
|
|
b.setLength(b.length() - 1);
|
|
}
|
|
if (mHasMonetaryCost) {
|
|
b.append(", hasMonetaryCost");
|
|
}
|
|
if (mHasBearingSupport || mHasSpeedSupport || mHasAltitudeSupport) {
|
|
b.append(", supports=[");
|
|
if (mHasBearingSupport) {
|
|
b.append("bearing,");
|
|
}
|
|
if (mHasSpeedSupport) {
|
|
b.append("speed,");
|
|
}
|
|
if (mHasAltitudeSupport) {
|
|
b.append("altitude,");
|
|
}
|
|
b.setLength(b.length() - 1);
|
|
b.append("]");
|
|
}
|
|
b.append("]");
|
|
return b.toString();
|
|
}
|
|
|
|
private static String powerToString(@PowerUsage int power) {
|
|
switch (power) {
|
|
case POWER_USAGE_LOW:
|
|
return "Low";
|
|
case POWER_USAGE_MEDIUM:
|
|
return "Medium";
|
|
case POWER_USAGE_HIGH:
|
|
return "High";
|
|
default:
|
|
throw new AssertionError();
|
|
}
|
|
}
|
|
|
|
private static String accuracyToString(@Accuracy int accuracy) {
|
|
switch (accuracy) {
|
|
case ACCURACY_COARSE:
|
|
return "Coarse";
|
|
case ACCURACY_FINE:
|
|
return "Fine";
|
|
default:
|
|
throw new AssertionError();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Builder for ProviderProperties.
|
|
*/
|
|
public static final class Builder {
|
|
|
|
private boolean mHasNetworkRequirement;
|
|
private boolean mHasSatelliteRequirement;
|
|
private boolean mHasCellRequirement;
|
|
private boolean mHasMonetaryCost;
|
|
private boolean mHasAltitudeSupport;
|
|
private boolean mHasSpeedSupport;
|
|
private boolean mHasBearingSupport;
|
|
private @PowerUsage int mPowerUsage;
|
|
private @Accuracy int mAccuracy;
|
|
|
|
public Builder() {
|
|
mHasNetworkRequirement = false;
|
|
mHasSatelliteRequirement = false;
|
|
mHasCellRequirement = false;
|
|
mHasMonetaryCost = false;
|
|
mHasAltitudeSupport = false;
|
|
mHasSpeedSupport = false;
|
|
mHasBearingSupport = false;
|
|
mPowerUsage = POWER_USAGE_HIGH;
|
|
mAccuracy = ACCURACY_COARSE;
|
|
}
|
|
|
|
public Builder(@NonNull ProviderProperties providerProperties) {
|
|
mHasNetworkRequirement = providerProperties.mHasNetworkRequirement;
|
|
mHasSatelliteRequirement = providerProperties.mHasSatelliteRequirement;
|
|
mHasCellRequirement = providerProperties.mHasCellRequirement;
|
|
mHasMonetaryCost = providerProperties.mHasMonetaryCost;
|
|
mHasAltitudeSupport = providerProperties.mHasAltitudeSupport;
|
|
mHasSpeedSupport = providerProperties.mHasSpeedSupport;
|
|
mHasBearingSupport = providerProperties.mHasBearingSupport;
|
|
mPowerUsage = providerProperties.mPowerUsage;
|
|
mAccuracy = providerProperties.mAccuracy;
|
|
}
|
|
|
|
/**
|
|
* Sets whether a provider requires network access. False by default.
|
|
*/
|
|
public @NonNull Builder setHasNetworkRequirement(boolean requiresNetwork) {
|
|
mHasNetworkRequirement = requiresNetwork;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets whether a provider requires satellite access. False by default.
|
|
*/
|
|
public @NonNull Builder setHasSatelliteRequirement(boolean requiresSatellite) {
|
|
mHasSatelliteRequirement = requiresSatellite;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets whether a provider requires cell tower access. False by default.
|
|
*/
|
|
public @NonNull Builder setHasCellRequirement(boolean requiresCell) {
|
|
mHasCellRequirement = requiresCell;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets whether a provider has a monetary cost. False by default.
|
|
*/
|
|
public @NonNull Builder setHasMonetaryCost(boolean monetaryCost) {
|
|
mHasMonetaryCost = monetaryCost;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets whether a provider can provide altitude information. False by default.
|
|
*/
|
|
public @NonNull Builder setHasAltitudeSupport(boolean supportsAltitude) {
|
|
mHasAltitudeSupport = supportsAltitude;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets whether a provider can provide speed information. False by default.
|
|
*/
|
|
public @NonNull Builder setHasSpeedSupport(boolean supportsSpeed) {
|
|
mHasSpeedSupport = supportsSpeed;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets whether a provider can provide bearing information. False by default.
|
|
*/
|
|
public @NonNull Builder setHasBearingSupport(boolean supportsBearing) {
|
|
mHasBearingSupport = supportsBearing;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets a very rough bucket of provider power usage. {@link #POWER_USAGE_HIGH} by default.
|
|
*/
|
|
public @NonNull Builder setPowerUsage(@PowerUsage int powerUsage) {
|
|
mPowerUsage = Preconditions.checkArgumentInRange(powerUsage, POWER_USAGE_LOW,
|
|
POWER_USAGE_HIGH, "powerUsage");
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets a very rough bucket of provider location accuracy. {@link #ACCURACY_COARSE} by
|
|
* default.
|
|
*/
|
|
public @NonNull Builder setAccuracy(@Accuracy int accuracy) {
|
|
mAccuracy = Preconditions.checkArgumentInRange(accuracy, ACCURACY_FINE,
|
|
ACCURACY_COARSE, "accuracy");
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Builds a new ProviderProperties.
|
|
*/
|
|
public @NonNull ProviderProperties build() {
|
|
return new ProviderProperties(mHasNetworkRequirement, mHasSatelliteRequirement,
|
|
mHasCellRequirement, mHasMonetaryCost, mHasAltitudeSupport, mHasSpeedSupport,
|
|
mHasBearingSupport, mPowerUsage, mAccuracy);
|
|
}
|
|
}
|
|
}
|