Merge "Adding setter and getters for setRttBurstSize() in RangingRequest (client)"

This commit is contained in:
Roy Want
2020-12-14 05:13:40 +00:00
committed by Android (Google) Code Review
4 changed files with 196 additions and 7 deletions

View File

@@ -1157,7 +1157,11 @@ package android.net.wifi.rtt {
public final class RangingRequest implements android.os.Parcelable {
method public int describeContents();
method public static int getDefaultRttBurstSize();
method public static int getMaxPeers();
method public static int getMaxRttBurstSize();
method public static int getMinRttBurstSize();
method public int getRttBurstSize();
method public void writeToParcel(android.os.Parcel, int);
field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.rtt.RangingRequest> CREATOR;
}
@@ -1169,6 +1173,7 @@ package android.net.wifi.rtt {
method public android.net.wifi.rtt.RangingRequest.Builder addWifiAwarePeer(@NonNull android.net.MacAddress);
method public android.net.wifi.rtt.RangingRequest.Builder addWifiAwarePeer(@NonNull android.net.wifi.aware.PeerHandle);
method public android.net.wifi.rtt.RangingRequest build();
method @NonNull public android.net.wifi.rtt.RangingRequest.Builder setRttBurstSize(int);
}
public final class RangingResult implements android.os.Parcelable {

View File

@@ -964,6 +964,10 @@ package android.net.wifi.p2p {
package android.net.wifi.rtt {
public final class RangingRequest implements android.os.Parcelable {
method @NonNull public java.util.List<android.net.wifi.rtt.ResponderConfig> getRttPeers();
}
public static final class RangingRequest.Builder {
method public android.net.wifi.rtt.RangingRequest.Builder addResponder(@NonNull android.net.wifi.rtt.ResponderConfig);
}

View File

@@ -30,8 +30,11 @@ import android.os.Handler;
import android.os.Parcel;
import android.os.Parcelable;
import com.android.modules.utils.build.SdkLevel;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.StringJoiner;
/**
@@ -46,6 +49,9 @@ import java.util.StringJoiner;
*/
public final class RangingRequest implements Parcelable {
private static final int MAX_PEERS = 10;
private static final int DEFAULT_RTT_BURST_SIZE = 8;
private static final int MIN_RTT_BURST_SIZE = 2;
private static final int MAX_RTT_BURST_SIZE = 17;
/**
* Returns the maximum number of peers to range which can be specified in a single {@code
@@ -59,12 +65,80 @@ public final class RangingRequest implements Parcelable {
return MAX_PEERS;
}
/**
* Returns the default RTT burst size used to determine the average range.
*
* @return the RTT burst size used by default
*/
public static int getDefaultRttBurstSize() {
if (!SdkLevel.isAtLeastS()) {
throw new UnsupportedOperationException();
}
return DEFAULT_RTT_BURST_SIZE;
}
/**
* Returns the minimum RTT burst size that can be used to determine a average range.
*
* @return the minimum RTT burst size that can be used
*/
public static int getMinRttBurstSize() {
if (!SdkLevel.isAtLeastS()) {
throw new UnsupportedOperationException();
}
return MIN_RTT_BURST_SIZE;
}
/**
* Returns the minimum RTT burst size that can be used to determine a average range.
*
* @return the maximum RTT burst size that can be used
*/
public static int getMaxRttBurstSize() {
if (!SdkLevel.isAtLeastS()) {
throw new UnsupportedOperationException();
}
return MAX_RTT_BURST_SIZE;
}
/** @hide */
public final List<ResponderConfig> mRttPeers;
/** @hide */
private RangingRequest(List<ResponderConfig> rttPeers) {
public final int mRttBurstSize;
/** @hide */
private RangingRequest(List<ResponderConfig> rttPeers, int rttBurstSize) {
mRttPeers = rttPeers;
mRttBurstSize = rttBurstSize;
}
/**
* Returns the list of RTT capable peers.
*
* @return the list of RTT capable peers in a common system representation
*
* @hide
*/
@SystemApi
@NonNull
public List<ResponderConfig> getRttPeers() {
if (!SdkLevel.isAtLeastS()) {
throw new UnsupportedOperationException();
}
return mRttPeers;
}
/**
* Returns the RTT burst size used to determine the average range.
*
* @return the RTT burst size used
*/
public int getRttBurstSize() {
if (!SdkLevel.isAtLeastS()) {
throw new UnsupportedOperationException();
}
return mRttBurstSize;
}
@Override
@@ -75,6 +149,7 @@ public final class RangingRequest implements Parcelable {
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeList(mRttPeers);
dest.writeInt(mRttBurstSize);
}
public static final @android.annotation.NonNull Creator<RangingRequest> CREATOR = new Creator<RangingRequest>() {
@@ -85,7 +160,7 @@ public final class RangingRequest implements Parcelable {
@Override
public RangingRequest createFromParcel(Parcel in) {
return new RangingRequest(in.readArrayList(null));
return new RangingRequest(in.readArrayList(null), in.readInt());
}
};
@@ -105,12 +180,20 @@ public final class RangingRequest implements Parcelable {
throw new IllegalArgumentException(
"Ranging to too many peers requested. Use getMaxPeers() API to get limit.");
}
for (ResponderConfig peer: mRttPeers) {
if (!peer.isValid(awareSupported)) {
throw new IllegalArgumentException("Invalid Responder specification");
}
}
if (SdkLevel.isAtLeastS()) {
if (mRttBurstSize < getMinRttBurstSize() || mRttBurstSize > getMaxRttBurstSize()) {
throw new IllegalArgumentException("RTT burst size is out of range");
}
} else {
if (mRttBurstSize != DEFAULT_RTT_BURST_SIZE) {
throw new IllegalArgumentException("RTT burst size is not the default value");
}
}
}
/**
@@ -118,6 +201,32 @@ public final class RangingRequest implements Parcelable {
*/
public static final class Builder {
private List<ResponderConfig> mRttPeers = new ArrayList<>();
private int mRttBurstSize = DEFAULT_RTT_BURST_SIZE;
/**
* Set the RTT Burst size for the ranging request.
* <p>
* If not set, the default RTT burst size given by
* {@link #getDefaultRttBurstSize()} is used to determine the default value.
* If set, the value must be in the range {@link #getMinRttBurstSize()} and
* {@link #getMaxRttBurstSize()} inclusively, or a
* {@link java.lang.IllegalArgumentException} will be thrown.
*
* @param rttBurstSize The number of FTM packets used to estimate a range.
* @return The builder to facilitate chaining
* {@code builder.setXXX(..).setXXX(..)}.
*/
@NonNull
public Builder setRttBurstSize(int rttBurstSize) {
if (!SdkLevel.isAtLeastS()) {
throw new UnsupportedOperationException();
}
if (rttBurstSize < MIN_RTT_BURST_SIZE || rttBurstSize > MAX_RTT_BURST_SIZE) {
throw new IllegalArgumentException("RTT burst size out of range.");
}
mRttBurstSize = rttBurstSize;
return this;
}
/**
* Add the device specified by the {@link ScanResult} to the list of devices with
@@ -241,7 +350,7 @@ public final class RangingRequest implements Parcelable {
* builder.
*/
public RangingRequest build() {
return new RangingRequest(mRttPeers);
return new RangingRequest(mRttPeers, mRttBurstSize);
}
}
@@ -257,11 +366,13 @@ public final class RangingRequest implements Parcelable {
RangingRequest lhs = (RangingRequest) o;
return mRttPeers.size() == lhs.mRttPeers.size() && mRttPeers.containsAll(lhs.mRttPeers);
return mRttPeers.size() == lhs.mRttPeers.size()
&& mRttPeers.containsAll(lhs.mRttPeers)
&& mRttBurstSize == lhs.mRttBurstSize;
}
@Override
public int hashCode() {
return mRttPeers.hashCode();
return Objects.hash(mRttPeers, mRttBurstSize);
}
}

View File

@@ -16,6 +16,8 @@
package android.net.wifi.rtt;
import static junit.framework.Assert.fail;
import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
@@ -143,6 +145,7 @@ public class WifiRttManagerTest {
PeerHandle peerHandle1 = new PeerHandle(12);
RangingRequest.Builder builder = new RangingRequest.Builder();
builder.setRttBurstSize(4);
builder.addAccessPoint(scanResult1);
builder.addAccessPoints(scanResults2and3);
builder.addWifiAwarePeer(mac1);
@@ -162,6 +165,60 @@ public class WifiRttManagerTest {
assertEquals(request, rereadRequest);
}
/**
* Validate the rtt burst size is set correctly when in range.
*/
@Test
public void testRangingRequestSetBurstSize() {
ScanResult scanResult = new ScanResult();
scanResult.BSSID = "AA:BB:CC:DD:EE:FF";
// create request
RangingRequest.Builder builder = new RangingRequest.Builder();
builder.setRttBurstSize(4);
builder.addAccessPoint(scanResult);
RangingRequest request = builder.build();
// confirm rtt burst size is set correctly to default value
assertEquals(request.getRttBurstSize(), 4);
}
/**
* Validate the rtt burst size cannot be smaller than the minimum.
*/
@Test
public void testRangingRequestMinBurstSizeIsEnforced() {
ScanResult scanResult = new ScanResult();
scanResult.BSSID = "AA:BB:CC:DD:EE:FF";
// create request
try {
RangingRequest.Builder builder = new RangingRequest.Builder();
builder.setRttBurstSize(RangingRequest.getMinRttBurstSize() - 1);
fail("RTT burst size was smaller than min value.");
} catch (IllegalArgumentException e) {
// expected
}
}
/**
* Validate the rtt burst size cannot exceed the maximum.
*/
@Test
public void testRangingRequestMaxBurstSizeIsEnforced() {
ScanResult scanResult = new ScanResult();
scanResult.BSSID = "AA:BB:CC:DD:EE:FF";
// create request
try {
RangingRequest.Builder builder = new RangingRequest.Builder();
builder.setRttBurstSize(RangingRequest.getMaxRttBurstSize() + 1);
fail("RTT Burst size exceeded max value.");
} catch (IllegalArgumentException e) {
// expected
}
}
/**
* Validate that can request as many range operation as the upper limit on number of requests.
*/
@@ -175,7 +232,7 @@ public class WifiRttManagerTest {
}
MacAddress mac1 = MacAddress.fromString("00:01:02:03:04:05");
// create request
// create request using max RTT Peers
RangingRequest.Builder builder = new RangingRequest.Builder();
builder.addAccessPoint(scanResult);
builder.addAccessPoints(scanResultList);
@@ -185,6 +242,18 @@ public class WifiRttManagerTest {
// verify request
request.enforceValidity(true);
// confirm rtt burst size is set correctly to default value
assertEquals(request.getRttBurstSize(), RangingRequest.getDefaultRttBurstSize());
// confirm the number of peers in the request is the max number of peers
List<ResponderConfig> rttPeers = request.getRttPeers();
int numRttPeers = rttPeers.size();
assertEquals(RangingRequest.getMaxPeers(), numRttPeers);
// confirm each peer has the correct mac address
for (int i = 0; i < numRttPeers - 1; ++i) {
assertEquals("AA:BB:CC:DD:EE:FF", rttPeers.get(i).macAddress.toString().toUpperCase());
}
assertEquals("00:01:02:03:04:05",
rttPeers.get(numRttPeers - 1).macAddress.toString().toUpperCase());
}
/**