Implement parcelable for UWB types

Make the UWB objects parcelable so that they may be re-used in AIDL
interfaces.

Bug: 170323306
Test: Builds

Change-Id: I8d3b81a581e66f2c777bedfd42a877548a51e875
This commit is contained in:
Brian Stack
2020-10-13 13:29:56 -07:00
parent 9ae9b395e0
commit 3c99301acb
7 changed files with 256 additions and 9 deletions

View File

@@ -17,6 +17,8 @@
package android.uwb;
import android.annotation.FloatRange;
import android.os.Parcel;
import android.os.Parcelable;
/**
* Angle measurement
@@ -26,7 +28,7 @@ import android.annotation.FloatRange;
*
* @hide
*/
public final class AngleMeasurement {
public final class AngleMeasurement implements Parcelable {
private final double mRadians;
private final double mErrorRadians;
private final double mConfidenceLevel;
@@ -39,7 +41,7 @@ public final class AngleMeasurement {
/**
* Angle measurement in radians
*
*
* @return angle in radians
*/
@FloatRange(from = -Math.PI, to = +Math.PI)
@@ -73,6 +75,35 @@ public final class AngleMeasurement {
return mConfidenceLevel;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeDouble(mRadians);
dest.writeDouble(mErrorRadians);
dest.writeDouble(mConfidenceLevel);
}
public static final @android.annotation.NonNull Creator<AngleMeasurement> CREATOR =
new Creator<AngleMeasurement>() {
@Override
public AngleMeasurement createFromParcel(Parcel in) {
Builder builder = new Builder();
builder.setRadians(in.readDouble());
builder.setErrorRadians(in.readDouble());
builder.setConfidenceLevel(in.readDouble());
return builder.build();
}
@Override
public AngleMeasurement[] newArray(int size) {
return new AngleMeasurement[size];
}
};
/**
* Builder class for {@link AngleMeasurement}.
*/

View File

@@ -18,13 +18,15 @@ package android.uwb;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.os.Parcel;
import android.os.Parcelable;
/**
* Represents an angle of arrival measurement between two devices using Ultra Wideband
*
* @hide
*/
public final class AngleOfArrivalMeasurement {
public final class AngleOfArrivalMeasurement implements Parcelable {
private final AngleMeasurement mAzimuthAngleMeasurement;
private final AngleMeasurement mAltitudeAngleMeasurement;
@@ -70,6 +72,38 @@ public final class AngleOfArrivalMeasurement {
return mAltitudeAngleMeasurement;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeParcelable(mAzimuthAngleMeasurement, flags);
dest.writeParcelable(mAltitudeAngleMeasurement, flags);
}
public static final @android.annotation.NonNull Creator<AngleOfArrivalMeasurement> CREATOR =
new Creator<AngleOfArrivalMeasurement>() {
@Override
public AngleOfArrivalMeasurement createFromParcel(Parcel in) {
Builder builder = new Builder();
builder.setAzimuthAngleMeasurement(
in.readParcelable(AngleMeasurement.class.getClassLoader()));
builder.setAltitudeAngleMeasurement(
in.readParcelable(AngleMeasurement.class.getClassLoader()));
return builder.build();
}
@Override
public AngleOfArrivalMeasurement[] newArray(int size) {
return new AngleOfArrivalMeasurement[size];
}
};
/**
* Builder class for {@link AngleOfArrivalMeasurement}.
*/

View File

@@ -17,6 +17,8 @@
package android.uwb;
import android.annotation.FloatRange;
import android.os.Parcel;
import android.os.Parcelable;
/**
* A data point for the distance measurement
@@ -26,7 +28,7 @@ import android.annotation.FloatRange;
*
* @hide
*/
public final class DistanceMeasurement {
public final class DistanceMeasurement implements Parcelable {
private final double mMeters;
private final double mErrorMeters;
private final double mConfidenceLevel;
@@ -69,6 +71,35 @@ public final class DistanceMeasurement {
return mConfidenceLevel;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeDouble(mMeters);
dest.writeDouble(mErrorMeters);
dest.writeDouble(mConfidenceLevel);
}
public static final @android.annotation.NonNull Creator<DistanceMeasurement> CREATOR =
new Creator<DistanceMeasurement>() {
@Override
public DistanceMeasurement createFromParcel(Parcel in) {
Builder builder = new Builder();
builder.setMeters(in.readDouble());
builder.setErrorMeters(in.readDouble());
builder.setConfidenceLevel(in.readDouble());
return builder.build();
}
@Override
public DistanceMeasurement[] newArray(int size) {
return new DistanceMeasurement[size];
}
};
/**
* Builder to get a {@link DistanceMeasurement} object.
*/

View File

@@ -20,6 +20,8 @@ import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SuppressLint;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.SystemClock;
import java.lang.annotation.Retention;
@@ -30,7 +32,7 @@ import java.lang.annotation.RetentionPolicy;
*
* @hide
*/
public final class RangingMeasurement {
public final class RangingMeasurement implements Parcelable {
private final UwbAddress mRemoteDeviceAddress;
private final @Status int mStatus;
private final long mElapsedRealtimeNanos;
@@ -127,6 +129,42 @@ public final class RangingMeasurement {
return mAngleOfArrivalMeasurement;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeParcelable(mRemoteDeviceAddress, flags);
dest.writeInt(mStatus);
dest.writeLong(mElapsedRealtimeNanos);
dest.writeParcelable(mDistanceMeasurement, flags);
dest.writeParcelable(mAngleOfArrivalMeasurement, flags);
}
public static final @android.annotation.NonNull Creator<RangingMeasurement> CREATOR =
new Creator<RangingMeasurement>() {
@Override
public RangingMeasurement createFromParcel(Parcel in) {
Builder builder = new Builder();
builder.setRemoteDeviceAddress(
in.readParcelable(UwbAddress.class.getClassLoader()));
builder.setStatus(in.readInt());
builder.setElapsedRealtimeNanos(in.readLong());
builder.setDistanceMeasurement(
in.readParcelable(DistanceMeasurement.class.getClassLoader()));
builder.setAngleOfArrivalMeasurement(
in.readParcelable(AngleOfArrivalMeasurement.class.getClassLoader()));
return builder.build();
}
@Override
public RangingMeasurement[] newArray(int size) {
return new RangingMeasurement[size];
}
};
/**
* Builder for a {@link RangingMeasurement} object.
*/

View File

@@ -19,11 +19,13 @@ package android.uwb;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.PersistableBundle;
import android.util.Duration;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.time.Duration;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
@@ -36,7 +38,7 @@ import java.util.Set;
*
* @hide
*/
public final class RangingParams {
public final class RangingParams implements Parcelable {
private final boolean mIsInitiator;
private final boolean mIsController;
private final Duration mSamplePeriod;
@@ -199,6 +201,62 @@ public final class RangingParams {
return new PersistableBundle(mSpecificationParameters);
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeBoolean(mIsInitiator);
dest.writeBoolean(mIsController);
dest.writeLong(mSamplePeriod.getSeconds());
dest.writeInt(mSamplePeriod.getNano());
dest.writeParcelable(mLocalDeviceAddress, flags);
UwbAddress[] remoteAddresses = new UwbAddress[mRemoteDeviceAddresses.size()];
mRemoteDeviceAddresses.toArray(remoteAddresses);
dest.writeParcelableArray(remoteAddresses, flags);
dest.writeInt(mChannelNumber);
dest.writeInt(mTransmitPreambleCodeIndex);
dest.writeInt(mReceivePreambleCodeIndex);
dest.writeInt(mStsPhyPacketType);
dest.writePersistableBundle(mSpecificationParameters);
}
public static final @android.annotation.NonNull Creator<RangingParams> CREATOR =
new Creator<RangingParams>() {
@Override
public RangingParams createFromParcel(Parcel in) {
Builder builder = new Builder();
builder.setIsInitiator(in.readBoolean());
builder.setIsController(in.readBoolean());
builder.setSamplePeriod(Duration.ofSeconds(in.readLong(), in.readInt()));
builder.setLocalDeviceAddress(
in.readParcelable(UwbAddress.class.getClassLoader()));
UwbAddress[] remoteAddresses =
in.readParcelableArray(null, UwbAddress.class);
for (UwbAddress remoteAddress : remoteAddresses) {
builder.addRemoteDeviceAddress(remoteAddress);
}
builder.setChannelNumber(in.readInt());
builder.setTransmitPreambleCodeIndex(in.readInt());
builder.setReceivePreambleCodeIndex(in.readInt());
builder.setStsPhPacketType(in.readInt());
builder.setSpecificationParameters(in.readPersistableBundle());
return builder.build();
}
@Override
public RangingParams[] newArray(int size) {
return new RangingParams[size];
}
};
/**
* Builder class for {@link RangingParams}.
*/

View File

@@ -17,6 +17,8 @@
package android.uwb;
import android.annotation.NonNull;
import android.os.Parcel;
import android.os.Parcelable;
import java.util.ArrayList;
import java.util.List;
@@ -26,7 +28,7 @@ import java.util.List;
*
* @hide
*/
public final class RangingReport {
public final class RangingReport implements Parcelable {
private final List<RangingMeasurement> mRangingMeasurements;
private RangingReport(@NonNull List<RangingMeasurement> rangingMeasurements) {
@@ -48,6 +50,31 @@ public final class RangingReport {
return mRangingMeasurements;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeTypedList(mRangingMeasurements);
}
public static final @android.annotation.NonNull Creator<RangingReport> CREATOR =
new Creator<RangingReport>() {
@Override
public RangingReport createFromParcel(Parcel in) {
Builder builder = new Builder();
builder.addMeasurements(in.createTypedArrayList(RangingMeasurement.CREATOR));
return builder.build();
}
@Override
public RangingReport[] newArray(int size) {
return new RangingReport[size];
}
};
/**
* Builder for {@link RangingReport} object
*/

View File

@@ -18,6 +18,8 @@ package android.uwb;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.os.Parcel;
import android.os.Parcelable;
import java.util.Arrays;
@@ -26,7 +28,7 @@ import java.util.Arrays;
*
* @hide
*/
public final class UwbAddress {
public final class UwbAddress implements Parcelable {
public static final int SHORT_ADDRESS_BYTE_LENGTH = 2;
public static final int EXTENDED_ADDRESS_BYTE_LENGTH = 8;
@@ -98,4 +100,30 @@ public final class UwbAddress {
public int hashCode() {
return Arrays.hashCode(mAddressBytes);
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(mAddressBytes.length);
dest.writeByteArray(mAddressBytes);
}
public static final @android.annotation.NonNull Creator<UwbAddress> CREATOR =
new Creator<UwbAddress>() {
@Override
public UwbAddress createFromParcel(Parcel in) {
byte[] address = new byte[in.readInt()];
in.readByteArray(address);
return UwbAddress.fromBytes(address);
}
@Override
public UwbAddress[] newArray(int size) {
return new UwbAddress[size];
}
};
}