Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 210da15b authored by Etan Cohen's avatar Etan Cohen
Browse files

[RTT2] Error code reconfiguration

Error code changes:
- Error code for overall failure
- Error code for individual failures
- Throw exception when trying to access invalid results

Bug: 65108607
Test: unit tests and integration tests
Change-Id: I97372fe078cc4b80ae01d5ffaab78f8e8ee84b7f
parent 3efe3cdd
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -26,7 +26,12 @@ import android.net.wifi.rtt.RangingResult;
oneway interface IRttCallback
{
    /**
     * Service to manager callback providing RTT status and results.
     * Service to manager callback indicating failure.
     */
    void onRangingResults(int status, in List<RangingResult> results);
    void onRangingFailure(int status);

    /**
     * Service to manager callback indicating success and providing results.
     */
    void onRangingResults(in List<RangingResult> results);
}
+50 −24
Original line number Diff line number Diff line
@@ -16,14 +16,16 @@

package android.net.wifi.rtt;

import android.annotation.IntDef;
import android.net.wifi.aware.PeerHandle;
import android.os.Handler;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.Log;

import libcore.util.HexEncoding;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
@@ -41,6 +43,24 @@ import java.util.Objects;
public final class RangingResult implements Parcelable {
    private static final String TAG = "RangingResult";

    /** @hide */
    @IntDef({STATUS_SUCCESS, STATUS_FAIL})
    @Retention(RetentionPolicy.SOURCE)
    public @interface RangeResultStatus {
    }

    /**
     * Individual range request status, {@link #getStatus()}. Indicates ranging operation was
     * successful and distance value is valid.
     */
    public static final int STATUS_SUCCESS = 0;

    /**
     * Individual range request status, {@link #getStatus()}. Indicates ranging operation failed
     * and the distance value is invalid.
     */
    public static final int STATUS_FAIL = 1;

    private final int mStatus;
    private final byte[] mMac;
    private final PeerHandle mPeerHandle;
@@ -50,8 +70,8 @@ public final class RangingResult implements Parcelable {
    private final long mTimestamp;

    /** @hide */
    public RangingResult(int status, byte[] mac, int distanceMm, int distanceStdDevMm, int rssi,
            long timestamp) {
    public RangingResult(@RangeResultStatus int status, byte[] mac, int distanceMm,
            int distanceStdDevMm, int rssi, long timestamp) {
        mStatus = status;
        mMac = mac;
        mPeerHandle = null;
@@ -62,8 +82,8 @@ public final class RangingResult implements Parcelable {
    }

    /** @hide */
    public RangingResult(int status, PeerHandle peerHandle, int distanceMm, int distanceStdDevMm,
            int rssi, long timestamp) {
    public RangingResult(@RangeResultStatus int status, PeerHandle peerHandle, int distanceMm,
            int distanceStdDevMm, int rssi, long timestamp) {
        mStatus = status;
        mMac = null;
        mPeerHandle = peerHandle;
@@ -74,9 +94,10 @@ public final class RangingResult implements Parcelable {
    }

    /**
     * @return The status of ranging measurement: {@link RangingResultCallback#STATUS_SUCCESS} in
     * case of success, and {@link RangingResultCallback#STATUS_FAIL} in case of failure.
     * @return The status of ranging measurement: {@link #STATUS_SUCCESS} in case of success, and
     * {@link #STATUS_FAIL} in case of failure.
     */
    @RangeResultStatus
    public int getStatus() {
        return mStatus;
    }
@@ -87,8 +108,6 @@ public final class RangingResult implements Parcelable {
     * <p>
     * Will return a {@code null} for results corresponding to requests issued using a {@code
     * PeerHandle}, i.e. using the {@link RangingRequest.Builder#addWifiAwarePeer(PeerHandle)} API.
     * <p>
     * Valid whether {@link #getStatus()} is SUCCESS or FAIL.
     */
    public byte[] getMacAddress() {
        return mMac;
@@ -100,9 +119,6 @@ public final class RangingResult implements Parcelable {
     * {@link RangingRequest.Builder#addWifiAwarePeer(PeerHandle)}.
     * <p>
     * Will return a {@code null} for results corresponding to requests issued using a MAC address.
     * <p>
     *
     * Valid whether {@link #getStatus()} is SUCCESS or FAIL.
     */
    public PeerHandle getPeerHandle() {
        return mPeerHandle;
@@ -112,11 +128,13 @@ public final class RangingResult implements Parcelable {
     * @return The distance (in mm) to the device specified by {@link #getMacAddress()} or
     * {@link #getPeerHandle()}.
     * <p>
     * Only valid if {@link #getStatus()} returns {@link RangingResultCallback#STATUS_SUCCESS}.
     * Only valid if {@link #getStatus()} returns {@link #STATUS_SUCCESS}, otherwise will throw an
     * exception.
     */
    public int getDistanceMm() {
        if (mStatus != RangingResultCallback.STATUS_SUCCESS) {
            Log.e(TAG, "getDistanceMm(): invalid value retrieved");
        if (mStatus != STATUS_SUCCESS) {
            throw new IllegalStateException(
                    "getDistanceMm(): invoked on an invalid result: getStatus()=" + mStatus);
        }
        return mDistanceMm;
    }
@@ -126,11 +144,13 @@ public final class RangingResult implements Parcelable {
     * {@link #getMacAddress()} or {@link #getPeerHandle()}. The standard deviation is calculated
     * over the measurements executed in a single RTT burst.
     * <p>
     * Only valid if {@link #getStatus()} returns {@link RangingResultCallback#STATUS_SUCCESS}.
     * Only valid if {@link #getStatus()} returns {@link #STATUS_SUCCESS}, otherwise will throw an
     * exception.
     */
    public int getDistanceStdDevMm() {
        if (mStatus != RangingResultCallback.STATUS_SUCCESS) {
            Log.e(TAG, "getDistanceStdDevMm(): invalid value retrieved");
        if (mStatus != STATUS_SUCCESS) {
            throw new IllegalStateException(
                    "getDistanceStdDevMm(): invoked on an invalid result: getStatus()=" + mStatus);
        }
        return mDistanceStdDevMm;
    }
@@ -138,12 +158,13 @@ public final class RangingResult implements Parcelable {
    /**
     * @return The average RSSI (in units of -0.5dB) observed during the RTT measurement.
     * <p>
     * Only valid if {@link #getStatus()} returns {@link RangingResultCallback#STATUS_SUCCESS}.
     * Only valid if {@link #getStatus()} returns {@link #STATUS_SUCCESS}, otherwise will throw an
     * exception.
     */
    public int getRssi() {
        if (mStatus != RangingResultCallback.STATUS_SUCCESS) {
            // TODO: should this be an exception?
            Log.e(TAG, "getRssi(): invalid value retrieved");
        if (mStatus != STATUS_SUCCESS) {
            throw new IllegalStateException(
                    "getRssi(): invoked on an invalid result: getStatus()=" + mStatus);
        }
        return mRssi;
    }
@@ -151,9 +172,14 @@ public final class RangingResult implements Parcelable {
    /**
     * @return The timestamp, in us since boot, at which the ranging operation was performed.
     * <p>
     * Only valid if {@link #getStatus()} returns {@link RangingResultCallback#STATUS_SUCCESS}.
     * Only valid if {@link #getStatus()} returns {@link #STATUS_SUCCESS}, otherwise will throw an
     * exception.
     */
    public long getRangingTimestampUs() {
        if (mStatus != STATUS_SUCCESS) {
            throw new IllegalStateException(
                    "getRangingTimestamp(): invoked on an invalid result: getStatus()=" + mStatus);
        }
        return mTimestamp;
    }

+19 −11
Original line number Diff line number Diff line
@@ -16,35 +16,43 @@

package android.net.wifi.rtt;

import android.annotation.IntDef;
import android.os.Handler;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.List;

/**
 * Base class for ranging result callbacks. Should be extended by applications and set when calling
 * {@link WifiRttManager#startRanging(RangingRequest, RangingResultCallback, Handler)}. A single
 * result from a range request will be called in this object.
 * {@link WifiRttManager#startRanging(RangingRequest, RangingResultCallback, Handler)}. If the
 * ranging operation fails in whole (not attempted) then {@link #onRangingFailure(int)} will be
 * called with a failure code. If the ranging operation is performed for each of the requested
 * peers then the {@link #onRangingResults(List)} will be called with the set of results (@link
 * {@link RangingResult}, each of which has its own success/failure code
 * {@link RangingResult#getStatus()}.
 *
 * @hide RTT_API
 */
public abstract class RangingResultCallback {
    /**
     * Individual range request status, {@link RangingResult#getStatus()}. Indicates ranging
     * operation was successful and distance value is valid.
     */
    public static final int STATUS_SUCCESS = 0;
    /** @hide */
    @IntDef({STATUS_CODE_FAIL})
    @Retention(RetentionPolicy.SOURCE)
    public @interface RangingOperationStatus {
    }

    /**
     * Individual range request status, {@link RangingResult#getStatus()}. Indicates ranging
     * operation failed and the distance value is invalid.
     * A failure code for the whole ranging request operation. Indicates a failure.
     */
    public static final int STATUS_FAIL = 1;
    public static final int STATUS_CODE_FAIL = 1;

    /**
     * Called when a ranging operation failed in whole - i.e. no ranging operation to any of the
     * devices specified in the request was attempted.
     *
     * @param code A status code indicating the type of failure.
     */
    public abstract void onRangingFailure();
    public abstract void onRangingFailure(@RangingOperationStatus int code);

    /**
     * Called when a ranging operation was executed. The list of results corresponds to devices
+11 −10
Original line number Diff line number Diff line
@@ -83,17 +83,18 @@ public class WifiRttManager {
        }

        @Override
        public void onRangingResults(int status, List<RangingResult> results) throws RemoteException {
            if (VDBG) {
                Log.v(TAG, "RttCallbackProxy: onRanginResults: status=" + status + ", results="
                        + results);
        public void onRangingFailure(int status) throws RemoteException {
            if (VDBG) Log.v(TAG, "RttCallbackProxy: onRangingFailure: status=" + status);
            mHandler.post(() -> {
               mCallback.onRangingFailure(status);
            });
        }

        @Override
        public void onRangingResults(List<RangingResult> results) throws RemoteException {
            if (VDBG) Log.v(TAG, "RttCallbackProxy: onRanginResults: results=" + results);
            mHandler.post(() -> {
               if (status == RangingResultCallback.STATUS_SUCCESS) {
               mCallback.onRangingResults(results);
               } else {
                   mCallback.onRangingFailure();
               }
            });
        }
    }
+7 −7
Original line number Diff line number Diff line
@@ -79,9 +79,7 @@ public class WifiRttManagerTest {
    public void testRangeSuccess() throws Exception {
        RangingRequest request = new RangingRequest.Builder().build();
        List<RangingResult> results = new ArrayList<>();
        results.add(
                new RangingResult(RangingResultCallback.STATUS_SUCCESS, (byte[]) null, 15, 5, 10,
                        666));
        results.add(new RangingResult(RangingResult.STATUS_SUCCESS, (byte[]) null, 15, 5, 10, 666));
        RangingResultCallback callbackMock = mock(RangingResultCallback.class);
        ArgumentCaptor<IRttCallback> callbackCaptor = ArgumentCaptor.forClass(IRttCallback.class);

@@ -91,7 +89,7 @@ public class WifiRttManagerTest {
                callbackCaptor.capture());

        // service calls back with success
        callbackCaptor.getValue().onRangingResults(RangingResultCallback.STATUS_SUCCESS, results);
        callbackCaptor.getValue().onRangingResults(results);
        mMockLooper.dispatchAll();
        verify(callbackMock).onRangingResults(results);

@@ -103,6 +101,8 @@ public class WifiRttManagerTest {
     */
    @Test
    public void testRangeFail() throws Exception {
        int failureCode = RangingResultCallback.STATUS_CODE_FAIL;

        RangingRequest request = new RangingRequest.Builder().build();
        RangingResultCallback callbackMock = mock(RangingResultCallback.class);
        ArgumentCaptor<IRttCallback> callbackCaptor = ArgumentCaptor.forClass(IRttCallback.class);
@@ -113,9 +113,9 @@ public class WifiRttManagerTest {
                callbackCaptor.capture());

        // service calls back with failure code
        callbackCaptor.getValue().onRangingResults(RangingResultCallback.STATUS_FAIL, null);
        callbackCaptor.getValue().onRangingFailure(failureCode);
        mMockLooper.dispatchAll();
        verify(callbackMock).onRangingFailure();
        verify(callbackMock).onRangingFailure(failureCode);

        verifyNoMoreInteractions(mockRttService, callbackMock);
    }
@@ -227,7 +227,7 @@ public class WifiRttManagerTest {
    @Test
    public void testRangingResultsParcel() {
        // Note: not validating parcel code of ScanResult (assumed to work)
        int status = RangingResultCallback.STATUS_SUCCESS;
        int status = RangingResult.STATUS_SUCCESS;
        final byte[] mac = HexEncoding.decode("000102030405".toCharArray(), false);
        PeerHandle peerHandle = new PeerHandle(10);
        int distanceCm = 105;