Move existing UWB API classes to UWB apex
Following instructions from go/mainline-java-lib to move the existing
UWB API classes to the new apex.
Bug: 194906542
Test: Compiles
Change-Id: I08801b418c7ba42c76952f5a80745cd0057ca329
diff --git a/Android.bp b/Android.bp
index 3afd6ec..c156774 100644
--- a/Android.bp
+++ b/Android.bp
@@ -156,6 +156,7 @@
"framework-sdkextensions.stubs.module_lib",
"framework-statsd.stubs.module_lib",
"framework-tethering.stubs.module_lib",
+ "framework-uwb.stubs.module_lib",
"framework-wifi.stubs.module_lib",
],
sdk_version: "module_current",
@@ -178,6 +179,7 @@
"framework-sdkextensions.impl",
"framework-statsd.impl",
"framework-tethering.impl",
+ "framework-uwb.impl",
"framework-wifi.impl",
"updatable-media",
],
diff --git a/StubLibraries.bp b/StubLibraries.bp
index 44c55c2..1904c1f 100644
--- a/StubLibraries.bp
+++ b/StubLibraries.bp
@@ -250,6 +250,7 @@
"framework-sdkextensions.stubs",
"framework-statsd.stubs",
"framework-tethering.stubs",
+ "framework-uwb.stubs",
"framework-wifi.stubs",
"i18n.module.public.api.stubs",
]
@@ -269,6 +270,7 @@
"framework-sdkextensions.stubs.system",
"framework-statsd.stubs.system",
"framework-tethering.stubs.system",
+ "framework-uwb.stubs.system",
"framework-wifi.stubs.system",
"i18n.module.public.api.stubs", // Only has public stubs
]
diff --git a/api/Android.bp b/api/Android.bp
index 2ea180e..66b6dba 100644
--- a/api/Android.bp
+++ b/api/Android.bp
@@ -90,6 +90,7 @@
":framework-sdkextensions{.public.api.txt}",
":framework-statsd{.public.api.txt}",
":framework-tethering{.public.api.txt}",
+ ":framework-uwb{.public.api.txt}",
":framework-wifi{.public.api.txt}",
":i18n.module.public.api{.public.api.txt}",
":non-updatable-current.txt",
@@ -149,6 +150,7 @@
":framework-sdkextensions{.public.stubs.source}",
":framework-statsd{.public.stubs.source}",
":framework-tethering{.public.stubs.source}",
+ ":framework-uwb{.public.stubs.source}",
":framework-wifi{.public.stubs.source}",
":i18n.module.public.api{.public.stubs.source}",
],
@@ -175,6 +177,7 @@
":framework-sdkextensions{.public.removed-api.txt}",
":framework-statsd{.public.removed-api.txt}",
":framework-tethering{.public.removed-api.txt}",
+ ":framework-uwb{.public.removed-api.txt}",
":framework-wifi{.public.removed-api.txt}",
":i18n.module.public.api{.public.removed-api.txt}",
":non-updatable-removed.txt",
@@ -215,6 +218,7 @@
":framework-sdkextensions{.system.api.txt}",
":framework-statsd{.system.api.txt}",
":framework-tethering{.system.api.txt}",
+ ":framework-uwb{.system.api.txt}",
":framework-wifi{.system.api.txt}",
":non-updatable-system-current.txt",
],
@@ -273,6 +277,7 @@
":framework-sdkextensions{.system.removed-api.txt}",
":framework-statsd{.system.removed-api.txt}",
":framework-tethering{.system.removed-api.txt}",
+ ":framework-uwb{.system.removed-api.txt}",
":framework-wifi{.system.removed-api.txt}",
":non-updatable-system-removed.txt",
],
@@ -313,6 +318,7 @@
":framework-sdkextensions{.module-lib.api.txt}",
":framework-statsd{.module-lib.api.txt}",
":framework-tethering{.module-lib.api.txt}",
+ ":framework-uwb{.module-lib.api.txt}",
":framework-wifi{.module-lib.api.txt}",
":non-updatable-module-lib-current.txt",
],
@@ -373,6 +379,7 @@
":framework-sdkextensions{.module-lib.removed-api.txt}",
":framework-statsd{.module-lib.removed-api.txt}",
":framework-tethering{.module-lib.removed-api.txt}",
+ ":framework-uwb{.module-lib.removed-api.txt}",
":framework-wifi{.module-lib.removed-api.txt}",
":non-updatable-module-lib-removed.txt",
],
@@ -491,6 +498,7 @@
":framework-sdkextensions.stubs{.jar}",
":framework-statsd.stubs{.jar}",
":framework-tethering.stubs{.jar}",
+ ":framework-uwb.stubs{.jar}",
":framework-wifi.stubs{.jar}",
":i18n.module.public.api.stubs{.jar}",
],
diff --git a/boot/Android.bp b/boot/Android.bp
index b71f9bf..049c802 100644
--- a/boot/Android.bp
+++ b/boot/Android.bp
@@ -100,6 +100,10 @@
module: "com.android.tethering-bootclasspath-fragment",
},
{
+ apex: "com.android.uwb",
+ module: "com.android.uwb-bootclasspath-fragment",
+ },
+ {
apex: "com.android.wifi",
module: "com.android.wifi-bootclasspath-fragment",
},
diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index 2c2e811..82b032a 100755
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -14267,148 +14267,6 @@
}
-package android.uwb {
-
- public final class AngleMeasurement implements android.os.Parcelable {
- ctor public AngleMeasurement(@FloatRange(from=-3.141592653589793, to=3.141592653589793) double, @FloatRange(from=0.0, to=3.141592653589793) double, @FloatRange(from=0.0, to=1.0) double);
- method public int describeContents();
- method @FloatRange(from=0.0, to=1.0) public double getConfidenceLevel();
- method @FloatRange(from=0.0, to=3.141592653589793) public double getErrorRadians();
- method @FloatRange(from=-3.141592653589793, to=3.141592653589793) public double getRadians();
- method public void writeToParcel(@NonNull android.os.Parcel, int);
- field @NonNull public static final android.os.Parcelable.Creator<android.uwb.AngleMeasurement> CREATOR;
- }
-
- public final class AngleOfArrivalMeasurement implements android.os.Parcelable {
- method public int describeContents();
- method @Nullable public android.uwb.AngleMeasurement getAltitude();
- method @NonNull public android.uwb.AngleMeasurement getAzimuth();
- method public void writeToParcel(@NonNull android.os.Parcel, int);
- field @NonNull public static final android.os.Parcelable.Creator<android.uwb.AngleOfArrivalMeasurement> CREATOR;
- }
-
- public static final class AngleOfArrivalMeasurement.Builder {
- ctor public AngleOfArrivalMeasurement.Builder(@NonNull android.uwb.AngleMeasurement);
- method @NonNull public android.uwb.AngleOfArrivalMeasurement build();
- method @NonNull public android.uwb.AngleOfArrivalMeasurement.Builder setAltitude(@NonNull android.uwb.AngleMeasurement);
- }
-
- public final class DistanceMeasurement implements android.os.Parcelable {
- method public int describeContents();
- method @FloatRange(from=0.0, to=1.0) public double getConfidenceLevel();
- method @FloatRange(from=0.0) public double getErrorMeters();
- method public double getMeters();
- method public void writeToParcel(@NonNull android.os.Parcel, int);
- field @NonNull public static final android.os.Parcelable.Creator<android.uwb.DistanceMeasurement> CREATOR;
- }
-
- public static final class DistanceMeasurement.Builder {
- ctor public DistanceMeasurement.Builder();
- method @NonNull public android.uwb.DistanceMeasurement build();
- method @NonNull public android.uwb.DistanceMeasurement.Builder setConfidenceLevel(@FloatRange(from=0.0, to=1.0) double);
- method @NonNull public android.uwb.DistanceMeasurement.Builder setErrorMeters(@FloatRange(from=0.0) double);
- method @NonNull public android.uwb.DistanceMeasurement.Builder setMeters(double);
- }
-
- public final class RangingMeasurement implements android.os.Parcelable {
- method public int describeContents();
- method @Nullable public android.uwb.AngleOfArrivalMeasurement getAngleOfArrivalMeasurement();
- method @Nullable public android.uwb.DistanceMeasurement getDistanceMeasurement();
- method public long getElapsedRealtimeNanos();
- method @NonNull public android.uwb.UwbAddress getRemoteDeviceAddress();
- method public int getStatus();
- method public void writeToParcel(@NonNull android.os.Parcel, int);
- field @NonNull public static final android.os.Parcelable.Creator<android.uwb.RangingMeasurement> CREATOR;
- field public static final int RANGING_STATUS_FAILURE_OUT_OF_RANGE = 1; // 0x1
- field public static final int RANGING_STATUS_FAILURE_UNKNOWN_ERROR = -1; // 0xffffffff
- field public static final int RANGING_STATUS_SUCCESS = 0; // 0x0
- }
-
- public static final class RangingMeasurement.Builder {
- ctor public RangingMeasurement.Builder();
- method @NonNull public android.uwb.RangingMeasurement build();
- method @NonNull public android.uwb.RangingMeasurement.Builder setAngleOfArrivalMeasurement(@NonNull android.uwb.AngleOfArrivalMeasurement);
- method @NonNull public android.uwb.RangingMeasurement.Builder setDistanceMeasurement(@NonNull android.uwb.DistanceMeasurement);
- method @NonNull public android.uwb.RangingMeasurement.Builder setElapsedRealtimeNanos(long);
- method @NonNull public android.uwb.RangingMeasurement.Builder setRemoteDeviceAddress(@NonNull android.uwb.UwbAddress);
- method @NonNull public android.uwb.RangingMeasurement.Builder setStatus(int);
- }
-
- public final class RangingReport implements android.os.Parcelable {
- method public int describeContents();
- method @NonNull public java.util.List<android.uwb.RangingMeasurement> getMeasurements();
- method public void writeToParcel(@NonNull android.os.Parcel, int);
- field @NonNull public static final android.os.Parcelable.Creator<android.uwb.RangingReport> CREATOR;
- }
-
- public static final class RangingReport.Builder {
- ctor public RangingReport.Builder();
- method @NonNull public android.uwb.RangingReport.Builder addMeasurement(@NonNull android.uwb.RangingMeasurement);
- method @NonNull public android.uwb.RangingReport.Builder addMeasurements(@NonNull java.util.List<android.uwb.RangingMeasurement>);
- method @NonNull public android.uwb.RangingReport build();
- }
-
- public final class RangingSession implements java.lang.AutoCloseable {
- method @RequiresPermission(android.Manifest.permission.UWB_PRIVILEGED) public void close();
- method @RequiresPermission(android.Manifest.permission.UWB_PRIVILEGED) public void reconfigure(@NonNull android.os.PersistableBundle);
- method @RequiresPermission(android.Manifest.permission.UWB_PRIVILEGED) public void start(@NonNull android.os.PersistableBundle);
- method @RequiresPermission(android.Manifest.permission.UWB_PRIVILEGED) public void stop();
- }
-
- public static interface RangingSession.Callback {
- method public void onClosed(int, @NonNull android.os.PersistableBundle);
- method public void onOpenFailed(int, @NonNull android.os.PersistableBundle);
- method public void onOpened(@NonNull android.uwb.RangingSession);
- method public void onReconfigureFailed(int, @NonNull android.os.PersistableBundle);
- method public void onReconfigured(@NonNull android.os.PersistableBundle);
- method public void onReportReceived(@NonNull android.uwb.RangingReport);
- method public void onStartFailed(int, @NonNull android.os.PersistableBundle);
- method public void onStarted(@NonNull android.os.PersistableBundle);
- method public void onStopFailed(int, @NonNull android.os.PersistableBundle);
- method public void onStopped(int, @NonNull android.os.PersistableBundle);
- field public static final int REASON_BAD_PARAMETERS = 3; // 0x3
- field public static final int REASON_GENERIC_ERROR = 4; // 0x4
- field public static final int REASON_LOCAL_REQUEST = 1; // 0x1
- field public static final int REASON_MAX_SESSIONS_REACHED = 5; // 0x5
- field public static final int REASON_PROTOCOL_SPECIFIC_ERROR = 7; // 0x7
- field public static final int REASON_REMOTE_REQUEST = 2; // 0x2
- field public static final int REASON_SYSTEM_POLICY = 6; // 0x6
- field public static final int REASON_UNKNOWN = 0; // 0x0
- }
-
- public final class UwbAddress implements android.os.Parcelable {
- method public int describeContents();
- method @NonNull public static android.uwb.UwbAddress fromBytes(@NonNull byte[]);
- method public int size();
- method @NonNull public byte[] toBytes();
- method public void writeToParcel(@NonNull android.os.Parcel, int);
- field @NonNull public static final android.os.Parcelable.Creator<android.uwb.UwbAddress> CREATOR;
- field public static final int EXTENDED_ADDRESS_BYTE_LENGTH = 8; // 0x8
- field public static final int SHORT_ADDRESS_BYTE_LENGTH = 2; // 0x2
- }
-
- public final class UwbManager {
- method @RequiresPermission(android.Manifest.permission.UWB_PRIVILEGED) public long elapsedRealtimeResolutionNanos();
- method @NonNull @RequiresPermission(android.Manifest.permission.UWB_PRIVILEGED) public android.os.PersistableBundle getSpecificationInfo();
- method @NonNull @RequiresPermission(allOf={android.Manifest.permission.UWB_PRIVILEGED, android.Manifest.permission.UWB_RANGING}) public android.os.CancellationSignal openRangingSession(@NonNull android.os.PersistableBundle, @NonNull java.util.concurrent.Executor, @NonNull android.uwb.RangingSession.Callback);
- method @RequiresPermission(android.Manifest.permission.UWB_PRIVILEGED) public void registerAdapterStateCallback(@NonNull java.util.concurrent.Executor, @NonNull android.uwb.UwbManager.AdapterStateCallback);
- method @RequiresPermission(android.Manifest.permission.UWB_PRIVILEGED) public void unregisterAdapterStateCallback(@NonNull android.uwb.UwbManager.AdapterStateCallback);
- }
-
- public static interface UwbManager.AdapterStateCallback {
- method public void onStateChanged(int, int);
- field public static final int STATE_CHANGED_REASON_ALL_SESSIONS_CLOSED = 1; // 0x1
- field public static final int STATE_CHANGED_REASON_ERROR_UNKNOWN = 4; // 0x4
- field public static final int STATE_CHANGED_REASON_SESSION_STARTED = 0; // 0x0
- field public static final int STATE_CHANGED_REASON_SYSTEM_BOOT = 3; // 0x3
- field public static final int STATE_CHANGED_REASON_SYSTEM_POLICY = 2; // 0x2
- field public static final int STATE_DISABLED = 0; // 0x0
- field public static final int STATE_ENABLED_ACTIVE = 2; // 0x2
- field public static final int STATE_ENABLED_INACTIVE = 1; // 0x1
- }
-
-}
-
package android.view {
public abstract class Window {
diff --git a/core/java/android/uwb/AdapterState.aidl b/core/java/android/uwb/AdapterState.aidl
deleted file mode 100644
index 991f64a..0000000
--- a/core/java/android/uwb/AdapterState.aidl
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright 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.uwb;
-
-/**
- * @hide
- */
-@Backing(type="int")
-enum AdapterState {
- /**
- * The state when UWB is disabled.
- */
- STATE_DISABLED,
-
- /**
- * The state when UWB is enabled but has no active sessions.
- */
- STATE_ENABLED_INACTIVE,
-
- /**
- * The state when UWB is enabled and has active sessions.
- */
- STATE_ENABLED_ACTIVE,
-}
\ No newline at end of file
diff --git a/core/java/android/uwb/AdapterStateListener.java b/core/java/android/uwb/AdapterStateListener.java
deleted file mode 100644
index 7e82cc6..0000000
--- a/core/java/android/uwb/AdapterStateListener.java
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * Copyright 2020 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.uwb;
-
-import android.annotation.NonNull;
-import android.os.Binder;
-import android.os.RemoteException;
-import android.util.Log;
-import android.uwb.UwbManager.AdapterStateCallback;
-import android.uwb.UwbManager.AdapterStateCallback.State;
-import android.uwb.UwbManager.AdapterStateCallback.StateChangedReason;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.Executor;
-
-/**
- * @hide
- */
-public class AdapterStateListener extends IUwbAdapterStateCallbacks.Stub {
- private static final String TAG = "Uwb.StateListener";
-
- private final IUwbAdapter mAdapter;
- private boolean mIsRegistered = false;
-
- private final Map<AdapterStateCallback, Executor> mCallbackMap = new HashMap<>();
-
- @StateChangedReason
- private int mAdapterStateChangeReason = AdapterStateCallback.STATE_CHANGED_REASON_ERROR_UNKNOWN;
- @State
- private int mAdapterState = AdapterStateCallback.STATE_DISABLED;
-
- public AdapterStateListener(@NonNull IUwbAdapter adapter) {
- mAdapter = adapter;
- }
-
- /**
- * Register an {@link AdapterStateCallback} with this {@link AdapterStateListener}
- *
- * @param executor an {@link Executor} to execute given callback
- * @param callback user implementation of the {@link AdapterStateCallback}
- */
- public void register(@NonNull Executor executor, @NonNull AdapterStateCallback callback) {
- synchronized (this) {
- if (mCallbackMap.containsKey(callback)) {
- return;
- }
-
- mCallbackMap.put(callback, executor);
-
- if (!mIsRegistered) {
- try {
- mAdapter.registerAdapterStateCallbacks(this);
- mIsRegistered = true;
- } catch (RemoteException e) {
- Log.w(TAG, "Failed to register adapter state callback");
- throw e.rethrowFromSystemServer();
- }
- } else {
- sendCurrentState(callback);
- }
- }
- }
-
- /**
- * Unregister the specified {@link AdapterStateCallback}
- *
- * @param callback user implementation of the {@link AdapterStateCallback}
- */
- public void unregister(@NonNull AdapterStateCallback callback) {
- synchronized (this) {
- if (!mCallbackMap.containsKey(callback)) {
- return;
- }
-
- mCallbackMap.remove(callback);
-
- if (mCallbackMap.isEmpty() && mIsRegistered) {
- try {
- mAdapter.unregisterAdapterStateCallbacks(this);
- } catch (RemoteException e) {
- Log.w(TAG, "Failed to unregister AdapterStateCallback with service");
- throw e.rethrowFromSystemServer();
- }
- mIsRegistered = false;
- }
- }
- }
-
- /**
- * Sets the adapter enabled state
- *
- * @param isEnabled value of new adapter state
- */
- public void setEnabled(boolean isEnabled) {
- synchronized (this) {
- try {
- mAdapter.setEnabled(isEnabled);
- } catch (RemoteException e) {
- Log.w(TAG, "Failed to set adapter state");
- throw e.rethrowFromSystemServer();
- }
-
- }
- }
-
- /**
- * Gets the adapter enabled state
- *
- * @return integer representing adapter enabled state
- */
- public int getAdapterState() {
- synchronized (this) {
- try {
- return mAdapter.getAdapterState();
- } catch (RemoteException e) {
- Log.w(TAG, "Failed to get adapter state");
- throw e.rethrowFromSystemServer();
- }
- }
- }
-
- private void sendCurrentState(@NonNull AdapterStateCallback callback) {
- synchronized (this) {
- Executor executor = mCallbackMap.get(callback);
-
- final long identity = Binder.clearCallingIdentity();
- try {
- executor.execute(() -> callback.onStateChanged(
- mAdapterState, mAdapterStateChangeReason));
- } finally {
- Binder.restoreCallingIdentity(identity);
- }
- }
- }
-
- @Override
- public void onAdapterStateChanged(int state, int reason) {
- synchronized (this) {
- @StateChangedReason int localReason =
- convertToStateChangedReason(reason);
- @State int localState = convertToState(state);
- mAdapterStateChangeReason = localReason;
- mAdapterState = localState;
- for (AdapterStateCallback cb : mCallbackMap.keySet()) {
- sendCurrentState(cb);
- }
- }
- }
-
- private static @StateChangedReason int convertToStateChangedReason(
- @StateChangeReason int reason) {
- switch (reason) {
- case StateChangeReason.ALL_SESSIONS_CLOSED:
- return AdapterStateCallback.STATE_CHANGED_REASON_ALL_SESSIONS_CLOSED;
-
- case StateChangeReason.SESSION_STARTED:
- return AdapterStateCallback.STATE_CHANGED_REASON_SESSION_STARTED;
-
- case StateChangeReason.SYSTEM_POLICY:
- return AdapterStateCallback.STATE_CHANGED_REASON_SYSTEM_POLICY;
-
- case StateChangeReason.SYSTEM_BOOT:
- return AdapterStateCallback.STATE_CHANGED_REASON_SYSTEM_BOOT;
-
- case StateChangeReason.UNKNOWN:
- default:
- return AdapterStateCallback.STATE_CHANGED_REASON_ERROR_UNKNOWN;
- }
- }
-
- private static @State int convertToState(@AdapterState int state) {
- switch (state) {
- case AdapterState.STATE_ENABLED_INACTIVE:
- return AdapterStateCallback.STATE_ENABLED_INACTIVE;
-
- case AdapterState.STATE_ENABLED_ACTIVE:
- return AdapterStateCallback.STATE_ENABLED_ACTIVE;
-
- case AdapterState.STATE_DISABLED:
- default:
- return AdapterStateCallback.STATE_DISABLED;
- }
- }
-}
diff --git a/core/java/android/uwb/AngleMeasurement.java b/core/java/android/uwb/AngleMeasurement.java
deleted file mode 100644
index 3d60373..0000000
--- a/core/java/android/uwb/AngleMeasurement.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Copyright 2020 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.uwb;
-
-import android.annotation.FloatRange;
-import android.annotation.NonNull;
-import android.annotation.SystemApi;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import java.util.Objects;
-
-/**
- * Angle measurement
- *
- * <p>The actual angle is interpreted as:
- * {@link #getRadians()} +/- {@link #getErrorRadians()} ()} at {@link #getConfidenceLevel()}
- *
- * @hide
- */
-@SystemApi
-public final class AngleMeasurement implements Parcelable {
- private final double mRadians;
- private final double mErrorRadians;
- private final double mConfidenceLevel;
-
- /**
- * Constructs a new {@link AngleMeasurement} object
- *
- * @param radians the angle in radians
- * @param errorRadians the error of the angle measurement in radians
- * @param confidenceLevel confidence level of the angle measurement
- *
- * @throws IllegalArgumentException if the radians, errorRadians, or confidenceLevel is out of
- * allowed range
- */
- public AngleMeasurement(
- @FloatRange(from = -Math.PI, to = +Math.PI) double radians,
- @FloatRange(from = 0.0, to = +Math.PI) double errorRadians,
- @FloatRange(from = 0.0, to = 1.0) double confidenceLevel) {
- if (radians < -Math.PI || radians > Math.PI) {
- throw new IllegalArgumentException("Invalid radians: " + radians);
- }
- mRadians = radians;
-
- if (errorRadians < 0.0 || errorRadians > Math.PI) {
- throw new IllegalArgumentException("Invalid error radians: " + errorRadians);
- }
- mErrorRadians = errorRadians;
-
- if (confidenceLevel < 0.0 || confidenceLevel > 1.0) {
- throw new IllegalArgumentException("Invalid confidence level: " + confidenceLevel);
- }
- mConfidenceLevel = confidenceLevel;
- }
-
- /**
- * Angle measurement in radians
- *
- * @return angle in radians
- */
- @FloatRange(from = -Math.PI, to = +Math.PI)
- public double getRadians() {
- return mRadians;
- }
-
- /**
- * Error of angle measurement in radians
- *
- * <p>Must be a positive value
- *
- * @return angle measurement error in radians
- */
- @FloatRange(from = 0.0, to = +Math.PI)
- public double getErrorRadians() {
- return mErrorRadians;
- }
-
- /**
- * Angle measurement confidence level expressed as a value between
- * 0.0 to 1.0.
- *
- * <p>A value of 0.0 indicates there is no confidence in the measurement. A value of 1.0
- * indicates there is maximum confidence in the measurement.
- *
- * @return the confidence level of the angle measurement
- */
- @FloatRange(from = 0.0, to = 1.0)
- public double getConfidenceLevel() {
- return mConfidenceLevel;
- }
-
- /**
- * @hide
- */
- @Override
- public boolean equals(Object obj) {
- if (this == obj) {
- return true;
- }
-
- if (obj instanceof AngleMeasurement) {
- AngleMeasurement other = (AngleMeasurement) obj;
- return mRadians == other.getRadians()
- && mErrorRadians == other.getErrorRadians()
- && mConfidenceLevel == other.getConfidenceLevel();
- }
- return false;
- }
-
- /**
- * @hide
- */
- @Override
- public int hashCode() {
- return Objects.hash(mRadians, mErrorRadians, mConfidenceLevel);
- }
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(@NonNull 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) {
- return new AngleMeasurement(in.readDouble(), in.readDouble(), in.readDouble());
- }
-
- @Override
- public AngleMeasurement[] newArray(int size) {
- return new AngleMeasurement[size];
- }
- };
-}
diff --git a/core/java/android/uwb/AngleOfArrivalMeasurement.java b/core/java/android/uwb/AngleOfArrivalMeasurement.java
deleted file mode 100644
index db04ad1..0000000
--- a/core/java/android/uwb/AngleOfArrivalMeasurement.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * Copyright 2020 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.uwb;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.annotation.SystemApi;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import java.util.Objects;
-
-/**
- * Represents an angle of arrival measurement between two devices using Ultra Wideband
- *
- * @hide
- */
-@SystemApi
-public final class AngleOfArrivalMeasurement implements Parcelable {
- private final AngleMeasurement mAzimuthAngleMeasurement;
- private final AngleMeasurement mAltitudeAngleMeasurement;
-
- private AngleOfArrivalMeasurement(@NonNull AngleMeasurement azimuthAngleMeasurement,
- @Nullable AngleMeasurement altitudeAngleMeasurement) {
- mAzimuthAngleMeasurement = azimuthAngleMeasurement;
- mAltitudeAngleMeasurement = altitudeAngleMeasurement;
- }
-
- /**
- * Azimuth angle measurement
- * <p>Azimuth {@link AngleMeasurement} of remote device in horizontal coordinate system, this is
- * the angle clockwise from the meridian when viewing above the north pole.
- *
- * <p>See: https://en.wikipedia.org/wiki/Horizontal_coordinate_system
- *
- * <p>On an Android device, azimuth north is defined as the angle perpendicular away from the
- * back of the device when holding it in portrait mode upright.
- *
- * <p>Azimuth angle must be supported when Angle of Arrival is supported
- *
- * @return the azimuth {@link AngleMeasurement}
- */
- @NonNull
- public AngleMeasurement getAzimuth() {
- return mAzimuthAngleMeasurement;
- }
-
- /**
- * Altitude angle measurement
- * <p>Altitude {@link AngleMeasurement} of remote device in horizontal coordinate system, this
- * is the angle above the equator when the north pole is up.
- *
- * <p>See: https://en.wikipedia.org/wiki/Horizontal_coordinate_system
- *
- * <p>On an Android device, altitude is defined as the angle vertical from ground when holding
- * the device in portrait mode upright.
- *
- * @return altitude {@link AngleMeasurement} or null when this is not available
- */
- @Nullable
- public AngleMeasurement getAltitude() {
- return mAltitudeAngleMeasurement;
- }
-
- /**
- * @hide
- */
- @Override
- public boolean equals(Object obj) {
- if (this == obj) {
- return true;
- }
-
- if (obj instanceof AngleOfArrivalMeasurement) {
- AngleOfArrivalMeasurement other = (AngleOfArrivalMeasurement) obj;
- return mAzimuthAngleMeasurement.equals(other.getAzimuth())
- && mAltitudeAngleMeasurement.equals(other.getAltitude());
- }
- return false;
- }
-
- /**
- * @hide
- */
- @Override
- public int hashCode() {
- return Objects.hash(mAzimuthAngleMeasurement, mAltitudeAngleMeasurement);
- }
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(@NonNull 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(in.readParcelable(AngleMeasurement.class.getClassLoader()));
-
- builder.setAltitude(in.readParcelable(AngleMeasurement.class.getClassLoader()));
-
- return builder.build();
- }
-
- @Override
- public AngleOfArrivalMeasurement[] newArray(int size) {
- return new AngleOfArrivalMeasurement[size];
- }
- };
-
- /**
- * Builder class for {@link AngleOfArrivalMeasurement}.
- */
- public static final class Builder {
- private final AngleMeasurement mAzimuthAngleMeasurement;
- private AngleMeasurement mAltitudeAngleMeasurement = null;
-
- /**
- * Constructs an {@link AngleOfArrivalMeasurement} object
- *
- * @param azimuthAngle the azimuth angle of the measurement
- */
- public Builder(@NonNull AngleMeasurement azimuthAngle) {
- mAzimuthAngleMeasurement = azimuthAngle;
- }
-
- /**
- * Set the altitude angle
- *
- * @param altitudeAngle altitude angle
- */
- @NonNull
- public Builder setAltitude(@NonNull AngleMeasurement altitudeAngle) {
- mAltitudeAngleMeasurement = altitudeAngle;
- return this;
- }
-
- /**
- * Build the {@link AngleOfArrivalMeasurement} object
- */
- @NonNull
- public AngleOfArrivalMeasurement build() {
- return new AngleOfArrivalMeasurement(mAzimuthAngleMeasurement,
- mAltitudeAngleMeasurement);
- }
- }
-}
diff --git a/core/java/android/uwb/DistanceMeasurement.java b/core/java/android/uwb/DistanceMeasurement.java
deleted file mode 100644
index 9856553..0000000
--- a/core/java/android/uwb/DistanceMeasurement.java
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- * Copyright 2020 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.uwb;
-
-import android.annotation.FloatRange;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.annotation.SystemApi;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import java.util.Objects;
-
-/**
- * A data point for the distance measurement
- *
- * <p>The actual distance is interpreted as:
- * {@link #getMeters()} +/- {@link #getErrorMeters()} at {@link #getConfidenceLevel()}
- *
- * @hide
- */
-@SystemApi
-public final class DistanceMeasurement implements Parcelable {
- private final double mMeters;
- private final double mErrorMeters;
- private final double mConfidenceLevel;
-
- private DistanceMeasurement(double meters, double errorMeters, double confidenceLevel) {
- mMeters = meters;
- mErrorMeters = errorMeters;
- mConfidenceLevel = confidenceLevel;
- }
-
- /**
- * Distance measurement in meters
- *
- * @return distance in meters
- */
- public double getMeters() {
- return mMeters;
- }
-
- /**
- * Error of distance measurement in meters
- * <p>Must be positive
- *
- * @return error of distance measurement in meters
- */
- @FloatRange(from = 0.0)
- public double getErrorMeters() {
- return mErrorMeters;
- }
-
- /**
- * Distance measurement confidence level expressed as a value between 0.0 to 1.0.
- *
- * <p>A value of 0.0 indicates no confidence in the measurement. A value of 1.0 represents
- * maximum confidence in the measurement
- *
- * @return confidence level
- */
- @FloatRange(from = 0.0, to = 1.0)
- public double getConfidenceLevel() {
- return mConfidenceLevel;
- }
-
- /**
- * @hide
- */
- @Override
- public boolean equals(@Nullable Object obj) {
- if (this == obj) {
- return true;
- }
-
- if (obj instanceof DistanceMeasurement) {
- DistanceMeasurement other = (DistanceMeasurement) obj;
- return mMeters == other.getMeters()
- && mErrorMeters == other.getErrorMeters()
- && mConfidenceLevel == other.getConfidenceLevel();
- }
- return false;
- }
-
- /**
- * @hide
- */
- @Override
- public int hashCode() {
- return Objects.hash(mMeters, mErrorMeters, mConfidenceLevel);
- }
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(@NonNull 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.
- */
- public static final class Builder {
- private double mMeters = Double.NaN;
- private double mErrorMeters = Double.NaN;
- private double mConfidenceLevel = Double.NaN;
-
- /**
- * Set the distance measurement in meters
- *
- * @param meters distance in meters
- * @throws IllegalArgumentException if meters is NaN
- */
- @NonNull
- public Builder setMeters(double meters) {
- if (Double.isNaN(meters)) {
- throw new IllegalArgumentException("meters cannot be NaN");
- }
- mMeters = meters;
- return this;
- }
-
- /**
- * Set the distance error in meters
- *
- * @param errorMeters distance error in meters
- * @throws IllegalArgumentException if error is negative or NaN
- */
- @NonNull
- public Builder setErrorMeters(@FloatRange(from = 0.0) double errorMeters) {
- if (Double.isNaN(errorMeters) || errorMeters < 0.0) {
- throw new IllegalArgumentException(
- "errorMeters must be >= 0.0 and not NaN: " + errorMeters);
- }
- mErrorMeters = errorMeters;
- return this;
- }
-
- /**
- * Set the confidence level
- *
- * @param confidenceLevel the confidence level in the distance measurement
- * @throws IllegalArgumentException if confidence level is not in the range of [0.0, 1.0]
- */
- @NonNull
- public Builder setConfidenceLevel(
- @FloatRange(from = 0.0, to = 1.0) double confidenceLevel) {
- if (confidenceLevel < 0.0 || confidenceLevel > 1.0) {
- throw new IllegalArgumentException(
- "confidenceLevel must be in the range [0.0, 1.0]: " + confidenceLevel);
- }
- mConfidenceLevel = confidenceLevel;
- return this;
- }
-
- /**
- * Builds the {@link DistanceMeasurement} object
- *
- * @throws IllegalStateException if meters, error, or confidence are not set
- */
- @NonNull
- public DistanceMeasurement build() {
- if (Double.isNaN(mMeters)) {
- throw new IllegalStateException("Meters cannot be NaN");
- }
-
- if (Double.isNaN(mErrorMeters)) {
- throw new IllegalStateException("Error meters cannot be NaN");
- }
-
- if (Double.isNaN(mConfidenceLevel)) {
- throw new IllegalStateException("Confidence level cannot be NaN");
- }
-
- return new DistanceMeasurement(mMeters, mErrorMeters, mConfidenceLevel);
- }
- }
-}
diff --git a/core/java/android/uwb/IUwbAdapter.aidl b/core/java/android/uwb/IUwbAdapter.aidl
deleted file mode 100644
index d879350..0000000
--- a/core/java/android/uwb/IUwbAdapter.aidl
+++ /dev/null
@@ -1,191 +0,0 @@
-/*
- * Copyright 2020 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.uwb;
-
-import android.content.AttributionSource;
-import android.os.PersistableBundle;
-import android.uwb.IUwbAdapterStateCallbacks;
-import android.uwb.IUwbRangingCallbacks;
-import android.uwb.SessionHandle;
-
-/**
- * @hide
- */
-interface IUwbAdapter {
- /*
- * Register the callbacks used to notify the framework of events and data
- *
- * The provided callback's IUwbAdapterStateCallbacks#onAdapterStateChanged
- * function must be called immediately following registration with the current
- * state of the UWB adapter.
- *
- * @param callbacks callback to provide range and status updates to the framework
- */
- void registerAdapterStateCallbacks(in IUwbAdapterStateCallbacks adapterStateCallbacks);
-
- /*
- * Unregister the callbacks used to notify the framework of events and data
- *
- * Calling this function with an unregistered callback is a no-op
- *
- * @param callbacks callback to unregister
- */
- void unregisterAdapterStateCallbacks(in IUwbAdapterStateCallbacks callbacks);
-
- /**
- * Get the accuracy of the ranging timestamps
- *
- * @return accuracy of the ranging timestamps in nanoseconds
- */
- long getTimestampResolutionNanos();
-
- /**
- * Provides the capabilities and features of the device
- *
- * @return specification specific capabilities and features of the device
- */
- PersistableBundle getSpecificationInfo();
-
- /**
- * Request to open a new ranging session
- *
- * This function does not start the ranging session, but all necessary
- * components must be initialized and ready to start a new ranging
- * session prior to calling IUwbAdapterCallback#onRangingOpened.
- *
- * IUwbAdapterCallbacks#onRangingOpened must be called within
- * RANGING_SESSION_OPEN_THRESHOLD_MS milliseconds of #openRanging being
- * called if the ranging session is opened successfully.
- *
- * IUwbAdapterCallbacks#onRangingOpenFailed must be called within
- * RANGING_SESSION_OPEN_THRESHOLD_MS milliseconds of #openRanging being called
- * if the ranging session fails to be opened.
- *
- * If the provided sessionHandle is already open for the calling client, then
- * #onRangingOpenFailed must be called and the new session must not be opened.
- *
- * @param attributionSource AttributionSource to use for permission enforcement.
- * @param sessionHandle the session handle to open ranging for
- * @param rangingCallbacks the callbacks used to deliver ranging information
- * @param parameters the configuration to use for ranging
- */
- void openRanging(in AttributionSource attributionSource,
- in SessionHandle sessionHandle,
- in IUwbRangingCallbacks rangingCallbacks,
- in PersistableBundle parameters);
-
- /**
- * Request to start ranging
- *
- * IUwbAdapterCallbacks#onRangingStarted must be called within
- * RANGING_SESSION_START_THRESHOLD_MS milliseconds of #startRanging being
- * called if the ranging session starts successfully.
- *
- * IUwbAdapterCallbacks#onRangingStartFailed must be called within
- * RANGING_SESSION_START_THRESHOLD_MS milliseconds of #startRanging being
- * called if the ranging session fails to be started.
- *
- * @param sessionHandle the session handle to start ranging for
- * @param parameters additional configuration required to start ranging
- */
- void startRanging(in SessionHandle sessionHandle,
- in PersistableBundle parameters);
-
- /**
- * Request to reconfigure ranging
- *
- * IUwbAdapterCallbacks#onRangingReconfigured must be called after
- * successfully reconfiguring the session.
- *
- * IUwbAdapterCallbacks#onRangingReconfigureFailed must be called after
- * failing to reconfigure the session.
- *
- * A session must not be modified by a failed call to #reconfigureRanging.
- *
- * @param sessionHandle the session handle to start ranging for
- * @param parameters the parameters to reconfigure and their new values
- */
- void reconfigureRanging(in SessionHandle sessionHandle,
- in PersistableBundle parameters);
-
- /**
- * Request to stop ranging
- *
- * IUwbAdapterCallbacks#onRangingStopped must be called after
- * successfully stopping the session.
- *
- * IUwbAdapterCallbacks#onRangingStopFailed must be called after failing
- * to stop the session.
- *
- * @param sessionHandle the session handle to stop ranging for
- */
- void stopRanging(in SessionHandle sessionHandle);
-
- /**
- * Close ranging for the session associated with the given handle
- *
- * Calling with an invalid handle or a handle that has already been closed
- * is a no-op.
- *
- * IUwbAdapterCallbacks#onRangingClosed must be called within
- * RANGING_SESSION_CLOSE_THRESHOLD_MS of #closeRanging being called.
- *
- * @param sessionHandle the session handle to close ranging for
- */
- void closeRanging(in SessionHandle sessionHandle);
-
- /**
- * Disables or enables UWB for a user
- *
- * The provided callback's IUwbAdapterStateCallbacks#onAdapterStateChanged
- * function must be called immediately following state change.
- *
- * @param enabled value representing intent to disable or enable UWB. If
- * true, any subsequent calls to #openRanging will be allowed. If false,
- * all active ranging sessions will be closed and subsequent calls to
- * #openRanging will be disallowed.
- */
- void setEnabled(boolean enabled);
-
- /**
- * Returns the current enabled/disabled UWB state.
- *
- * Possible values are:
- * IUwbAdapterState#STATE_DISABLED
- * IUwbAdapterState#STATE_ENABLED_ACTIVE
- * IUwbAdapterState#STATE_ENABLED_INACTIVE
- *
- * @return value representing enabled/disabled UWB state.
- */
- int getAdapterState();
-
- /**
- * The maximum allowed time to open a ranging session.
- */
- const int RANGING_SESSION_OPEN_THRESHOLD_MS = 3000; // Value TBD
-
- /**
- * The maximum allowed time to start a ranging session.
- */
- const int RANGING_SESSION_START_THRESHOLD_MS = 3000; // Value TBD
-
- /**
- * The maximum allowed time to notify the framework that a session has been
- * closed.
- */
- const int RANGING_SESSION_CLOSE_THRESHOLD_MS = 3000; // Value TBD
-}
diff --git a/core/java/android/uwb/IUwbAdapterStateCallbacks.aidl b/core/java/android/uwb/IUwbAdapterStateCallbacks.aidl
deleted file mode 100644
index d3b34c6..0000000
--- a/core/java/android/uwb/IUwbAdapterStateCallbacks.aidl
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright 2020 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.uwb;
-
-import android.uwb.StateChangeReason;
-import android.uwb.AdapterState;
-
-/**
- * @hide
- */
-interface IUwbAdapterStateCallbacks {
- /**
- * Called whenever the adapter state changes
- *
- * @param state UWB state; enabled_active, enabled_inactive, or disabled.
- * @param reason the reason that the state has changed
- */
- void onAdapterStateChanged(AdapterState state, StateChangeReason reason);
-}
\ No newline at end of file
diff --git a/core/java/android/uwb/IUwbRangingCallbacks.aidl b/core/java/android/uwb/IUwbRangingCallbacks.aidl
deleted file mode 100644
index 555bafe..0000000
--- a/core/java/android/uwb/IUwbRangingCallbacks.aidl
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Copyright 2020 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.uwb;
-
-import android.os.PersistableBundle;
-import android.uwb.RangingChangeReason;
-import android.uwb.RangingReport;
-import android.uwb.SessionHandle;
-
-/**
- * @hide
- */
-oneway interface IUwbRangingCallbacks {
- /**
- * Called when the ranging session has been opened
- *
- * @param sessionHandle the session the callback is being invoked for
- */
- void onRangingOpened(in SessionHandle sessionHandle);
-
- /**
- * Called when a ranging session fails to start
- *
- * @param sessionHandle the session the callback is being invoked for
- * @param reason the reason the session failed to start
- * @param parameters protocol specific parameters
- */
- void onRangingOpenFailed(in SessionHandle sessionHandle,
- RangingChangeReason reason,
- in PersistableBundle parameters);
-
- /**
- * Called when ranging has started
- *
- * May output parameters generated by the lower layers that must be sent to the
- * remote device(s). The PersistableBundle must be constructed using the UWB
- * support library.
- *
- * @param sessionHandle the session the callback is being invoked for
- * @param rangingOutputParameters parameters generated by the lower layer that
- * should be sent to the remote device.
- */
- void onRangingStarted(in SessionHandle sessionHandle,
- in PersistableBundle parameters);
-
- /**
- * Called when a ranging session fails to start
- *
- * @param sessionHandle the session the callback is being invoked for
- * @param reason the reason the session failed to start
- * @param parameters protocol specific parameters
- */
- void onRangingStartFailed(in SessionHandle sessionHandle,
- RangingChangeReason reason,
- in PersistableBundle parameters);
-
- /**
- * Called when ranging has been reconfigured
- *
- * @param sessionHandle the session the callback is being invoked for
- * @param parameters the updated ranging configuration
- */
- void onRangingReconfigured(in SessionHandle sessionHandle,
- in PersistableBundle parameters);
-
- /**
- * Called when a ranging session fails to be reconfigured
- *
- * @param sessionHandle the session the callback is being invoked for
- * @param reason the reason the session failed to reconfigure
- * @param parameters protocol specific parameters
- */
- void onRangingReconfigureFailed(in SessionHandle sessionHandle,
- RangingChangeReason reason,
- in PersistableBundle parameters);
-
- /**
- * Called when the ranging session has been stopped
- *
- * @param sessionHandle the session the callback is being invoked for
- * @param reason the reason the session was stopped
- * @param parameters protocol specific parameters
- */
-
- void onRangingStopped(in SessionHandle sessionHandle,
- RangingChangeReason reason,
- in PersistableBundle parameters);
-
- /**
- * Called when a ranging session fails to stop
- *
- * @param sessionHandle the session the callback is being invoked for
- * @param reason the reason the session failed to stop
- * @param parameters protocol specific parameters
- */
- void onRangingStopFailed(in SessionHandle sessionHandle,
- RangingChangeReason reason,
- in PersistableBundle parameters);
-
- /**
- * Called when a ranging session is closed
- *
- * @param sessionHandle the session the callback is being invoked for
- * @param reason the reason the session was closed
- * @param parameters protocol specific parameters
- */
- void onRangingClosed(in SessionHandle sessionHandle,
- RangingChangeReason reason,
- in PersistableBundle parameters);
-
- /**
- * Provides a new RangingResult to the framework
- *
- * The reported timestamp for a ranging measurement must be calculated as the
- * time which the ranging round that generated this measurement concluded.
- *
- * @param sessionHandle an identifier to associate the ranging results with a
- * session that is active
- * @param result the ranging report
- */
- void onRangingResult(in SessionHandle sessionHandle, in RangingReport result);
-}
diff --git a/core/java/android/uwb/MeasurementStatus.aidl b/core/java/android/uwb/MeasurementStatus.aidl
deleted file mode 100644
index 5fa1554..0000000
--- a/core/java/android/uwb/MeasurementStatus.aidl
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright 2020 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.uwb;
-
-/**
- * @hide
- */
-@Backing(type="int")
-enum MeasurementStatus {
- /**
- * Ranging was successful
- */
- SUCCESS,
-
- /**
- * The remote device is out of range
- */
- FAILURE_OUT_OF_RANGE,
-
- /**
- * An unknown failure has occurred.
- */
- FAILURE_UNKNOWN,
-}
-
diff --git a/core/java/android/uwb/OWNERS b/core/java/android/uwb/OWNERS
deleted file mode 100644
index 17936ae..0000000
--- a/core/java/android/uwb/OWNERS
+++ /dev/null
@@ -1,6 +0,0 @@
-bstack@google.com
-eliptus@google.com
-jsolnit@google.com
-matbev@google.com
-siyuanh@google.com
-zachoverflow@google.com
diff --git a/core/java/android/uwb/RangingChangeReason.aidl b/core/java/android/uwb/RangingChangeReason.aidl
deleted file mode 100644
index 19d4b39..0000000
--- a/core/java/android/uwb/RangingChangeReason.aidl
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright 2020 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.uwb;
-
-/**
- * @hide
- */
-@Backing(type="int")
-enum RangingChangeReason {
- /**
- * Unknown reason
- */
- UNKNOWN,
-
- /**
- * A local API call triggered the change, such as a call to
- * IUwbAdapter.closeRanging.
- */
- LOCAL_API,
-
- /**
- * The maximum number of sessions has been reached. This may be generated for
- * an active session if a higher priority session begins.
- */
- MAX_SESSIONS_REACHED,
-
- /**
- * The system state has changed resulting in the session changing (e.g. the
- * user disables UWB, or the user's locale changes and an active channel is no
- * longer permitted to be used).
- */
- SYSTEM_POLICY,
-
- /**
- * The remote device has requested to change the session
- */
- REMOTE_REQUEST,
-
- /**
- * The session changed for a protocol specific reason
- */
- PROTOCOL_SPECIFIC,
-
- /**
- * The provided parameters were invalid
- */
- BAD_PARAMETERS,
-}
-
diff --git a/core/java/android/uwb/RangingManager.java b/core/java/android/uwb/RangingManager.java
deleted file mode 100644
index 6bba796..0000000
--- a/core/java/android/uwb/RangingManager.java
+++ /dev/null
@@ -1,256 +0,0 @@
-/*
- * Copyright 2020 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.uwb;
-
-import android.annotation.NonNull;
-import android.content.AttributionSource;
-import android.os.CancellationSignal;
-import android.os.PersistableBundle;
-import android.os.RemoteException;
-import android.util.Log;
-
-import java.util.Hashtable;
-import java.util.concurrent.Executor;
-
-/**
- * @hide
- */
-public class RangingManager extends android.uwb.IUwbRangingCallbacks.Stub {
- private static final String TAG = "Uwb.RangingManager";
-
- private final IUwbAdapter mAdapter;
- private final Hashtable<SessionHandle, RangingSession> mRangingSessionTable = new Hashtable<>();
- private int mNextSessionId = 1;
-
- public RangingManager(IUwbAdapter adapter) {
- mAdapter = adapter;
- }
-
- /**
- * Open a new ranging session
- *
- * @param attributionSource Attribution source to use for the enforcement of
- * {@link android.Manifest.permission#ULTRAWIDEBAND_RANGING} runtime
- * permission.
- * @param params the parameters that define the ranging session
- * @param executor {@link Executor} to run callbacks
- * @param callbacks {@link RangingSession.Callback} to associate with the {@link RangingSession}
- * that is being opened.
- * @return a {@link CancellationSignal} that may be used to cancel the opening of the
- * {@link RangingSession}.
- */
- public CancellationSignal openSession(@NonNull AttributionSource attributionSource,
- @NonNull PersistableBundle params,
- @NonNull Executor executor,
- @NonNull RangingSession.Callback callbacks) {
- synchronized (this) {
- SessionHandle sessionHandle = new SessionHandle(mNextSessionId++);
- RangingSession session =
- new RangingSession(executor, callbacks, mAdapter, sessionHandle);
- mRangingSessionTable.put(sessionHandle, session);
- try {
- mAdapter.openRanging(attributionSource, sessionHandle, this, params);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
-
- CancellationSignal cancellationSignal = new CancellationSignal();
- cancellationSignal.setOnCancelListener(() -> session.close());
- return cancellationSignal;
- }
- }
-
- private boolean hasSession(SessionHandle sessionHandle) {
- return mRangingSessionTable.containsKey(sessionHandle);
- }
-
- @Override
- public void onRangingOpened(SessionHandle sessionHandle) {
- synchronized (this) {
- if (!hasSession(sessionHandle)) {
- Log.w(TAG,
- "onRangingOpened - received unexpected SessionHandle: " + sessionHandle);
- return;
- }
-
- RangingSession session = mRangingSessionTable.get(sessionHandle);
- session.onRangingOpened();
- }
- }
-
- @Override
- public void onRangingOpenFailed(SessionHandle sessionHandle, @RangingChangeReason int reason,
- PersistableBundle parameters) {
- synchronized (this) {
- if (!hasSession(sessionHandle)) {
- Log.w(TAG,
- "onRangingOpenedFailed - received unexpected SessionHandle: "
- + sessionHandle);
- return;
- }
-
- RangingSession session = mRangingSessionTable.get(sessionHandle);
- session.onRangingOpenFailed(convertToReason(reason), parameters);
- mRangingSessionTable.remove(sessionHandle);
- }
- }
-
- @Override
- public void onRangingReconfigured(SessionHandle sessionHandle, PersistableBundle parameters) {
- synchronized (this) {
- if (!hasSession(sessionHandle)) {
- Log.w(TAG,
- "onRangingReconfigured - received unexpected SessionHandle: "
- + sessionHandle);
- return;
- }
-
- RangingSession session = mRangingSessionTable.get(sessionHandle);
- session.onRangingReconfigured(parameters);
- }
- }
-
- @Override
- public void onRangingReconfigureFailed(SessionHandle sessionHandle,
- @RangingChangeReason int reason, PersistableBundle params) {
- synchronized (this) {
- if (!hasSession(sessionHandle)) {
- Log.w(TAG, "onRangingReconfigureFailed - received unexpected SessionHandle: "
- + sessionHandle);
- return;
- }
-
- RangingSession session = mRangingSessionTable.get(sessionHandle);
- session.onRangingReconfigureFailed(convertToReason(reason), params);
- }
- }
-
-
- @Override
- public void onRangingStarted(SessionHandle sessionHandle, PersistableBundle parameters) {
- synchronized (this) {
- if (!hasSession(sessionHandle)) {
- Log.w(TAG,
- "onRangingStarted - received unexpected SessionHandle: " + sessionHandle);
- return;
- }
-
- RangingSession session = mRangingSessionTable.get(sessionHandle);
- session.onRangingStarted(parameters);
- }
- }
-
- @Override
- public void onRangingStartFailed(SessionHandle sessionHandle, @RangingChangeReason int reason,
- PersistableBundle params) {
- synchronized (this) {
- if (!hasSession(sessionHandle)) {
- Log.w(TAG, "onRangingStartFailed - received unexpected SessionHandle: "
- + sessionHandle);
- return;
- }
-
- RangingSession session = mRangingSessionTable.get(sessionHandle);
- session.onRangingStartFailed(convertToReason(reason), params);
- }
- }
-
- @Override
- public void onRangingStopped(SessionHandle sessionHandle, @RangingChangeReason int reason,
- PersistableBundle params) {
- synchronized (this) {
- if (!hasSession(sessionHandle)) {
- Log.w(TAG, "onRangingStopped - received unexpected SessionHandle: "
- + sessionHandle);
- return;
- }
-
- RangingSession session = mRangingSessionTable.get(sessionHandle);
- session.onRangingStopped(convertToReason(reason), params);
- }
- }
-
- @Override
- public void onRangingStopFailed(SessionHandle sessionHandle, @RangingChangeReason int reason,
- PersistableBundle parameters) {
- synchronized (this) {
- if (!hasSession(sessionHandle)) {
- Log.w(TAG, "onRangingStopFailed - received unexpected SessionHandle: "
- + sessionHandle);
- return;
- }
-
- RangingSession session = mRangingSessionTable.get(sessionHandle);
- session.onRangingStopFailed(convertToReason(reason), parameters);
- }
- }
-
- @Override
- public void onRangingClosed(SessionHandle sessionHandle, @RangingChangeReason int reason,
- PersistableBundle params) {
- synchronized (this) {
- if (!hasSession(sessionHandle)) {
- Log.w(TAG, "onRangingClosed - received unexpected SessionHandle: " + sessionHandle);
- return;
- }
-
- RangingSession session = mRangingSessionTable.get(sessionHandle);
- session.onRangingClosed(convertToReason(reason), params);
- mRangingSessionTable.remove(sessionHandle);
- }
- }
-
- @Override
- public void onRangingResult(SessionHandle sessionHandle, RangingReport result) {
- synchronized (this) {
- if (!hasSession(sessionHandle)) {
- Log.w(TAG, "onRangingResult - received unexpected SessionHandle: " + sessionHandle);
- return;
- }
-
- RangingSession session = mRangingSessionTable.get(sessionHandle);
- session.onRangingResult(result);
- }
- }
-
- @RangingSession.Callback.Reason
- private static int convertToReason(@RangingChangeReason int reason) {
- switch (reason) {
- case RangingChangeReason.LOCAL_API:
- return RangingSession.Callback.REASON_LOCAL_REQUEST;
-
- case RangingChangeReason.MAX_SESSIONS_REACHED:
- return RangingSession.Callback.REASON_MAX_SESSIONS_REACHED;
-
- case RangingChangeReason.SYSTEM_POLICY:
- return RangingSession.Callback.REASON_SYSTEM_POLICY;
-
- case RangingChangeReason.REMOTE_REQUEST:
- return RangingSession.Callback.REASON_REMOTE_REQUEST;
-
- case RangingChangeReason.PROTOCOL_SPECIFIC:
- return RangingSession.Callback.REASON_PROTOCOL_SPECIFIC_ERROR;
-
- case RangingChangeReason.BAD_PARAMETERS:
- return RangingSession.Callback.REASON_BAD_PARAMETERS;
-
- case RangingChangeReason.UNKNOWN:
- default:
- return RangingSession.Callback.REASON_UNKNOWN;
- }
- }
-}
diff --git a/core/java/android/uwb/RangingMeasurement.java b/core/java/android/uwb/RangingMeasurement.java
deleted file mode 100644
index 249e2b7..0000000
--- a/core/java/android/uwb/RangingMeasurement.java
+++ /dev/null
@@ -1,308 +0,0 @@
-/*
- * Copyright 2020 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.uwb;
-
-import android.annotation.IntDef;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.annotation.SuppressLint;
-import android.annotation.SystemApi;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.os.SystemClock;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.util.Objects;
-
-/**
- * Representation of a ranging measurement between the local device and a remote device
- *
- * @hide
- */
-@SystemApi
-public final class RangingMeasurement implements Parcelable {
- private final UwbAddress mRemoteDeviceAddress;
- private final @Status int mStatus;
- private final long mElapsedRealtimeNanos;
- private final DistanceMeasurement mDistanceMeasurement;
- private final AngleOfArrivalMeasurement mAngleOfArrivalMeasurement;
-
- private RangingMeasurement(@NonNull UwbAddress remoteDeviceAddress, @Status int status,
- long elapsedRealtimeNanos, @Nullable DistanceMeasurement distanceMeasurement,
- @Nullable AngleOfArrivalMeasurement angleOfArrivalMeasurement) {
- mRemoteDeviceAddress = remoteDeviceAddress;
- mStatus = status;
- mElapsedRealtimeNanos = elapsedRealtimeNanos;
- mDistanceMeasurement = distanceMeasurement;
- mAngleOfArrivalMeasurement = angleOfArrivalMeasurement;
- }
-
- /**
- * Get the remote device's {@link UwbAddress}
- *
- * @return the remote device's {@link UwbAddress}
- */
- @NonNull
- public UwbAddress getRemoteDeviceAddress() {
- return mRemoteDeviceAddress;
- }
-
- /**
- * @hide
- */
- @Retention(RetentionPolicy.SOURCE)
- @IntDef(value = {
- RANGING_STATUS_SUCCESS,
- RANGING_STATUS_FAILURE_OUT_OF_RANGE,
- RANGING_STATUS_FAILURE_UNKNOWN_ERROR})
- public @interface Status {}
-
- /**
- * Ranging attempt was successful for this device
- */
- public static final int RANGING_STATUS_SUCCESS = 0;
-
- /**
- * Ranging failed for this device because it is out of range
- */
- public static final int RANGING_STATUS_FAILURE_OUT_OF_RANGE = 1;
-
- /**
- * Ranging failed for this device because of unknown error
- */
- public static final int RANGING_STATUS_FAILURE_UNKNOWN_ERROR = -1;
-
- /**
- * Get the status of this ranging measurement
- *
- * <p>Possible values are
- * {@link #RANGING_STATUS_SUCCESS},
- * {@link #RANGING_STATUS_FAILURE_OUT_OF_RANGE},
- * {@link #RANGING_STATUS_FAILURE_UNKNOWN_ERROR}.
- *
- * @return the status of the ranging measurement
- */
- @Status
- public int getStatus() {
- return mStatus;
- }
-
- /**
- * Timestamp of this ranging measurement in time since boot nanos in the same namespace as
- * {@link SystemClock#elapsedRealtimeNanos()}
- *
- * @return timestamp of ranging measurement in nanoseconds
- */
- @SuppressLint("MethodNameUnits")
- public long getElapsedRealtimeNanos() {
- return mElapsedRealtimeNanos;
- }
-
- /**
- * Get the distance measurement
- *
- * @return a {@link DistanceMeasurement} or null if {@link #getStatus()} !=
- * {@link #RANGING_STATUS_SUCCESS}
- */
- @Nullable
- public DistanceMeasurement getDistanceMeasurement() {
- return mDistanceMeasurement;
- }
-
- /**
- * Get the angle of arrival measurement
- *
- * @return an {@link AngleOfArrivalMeasurement} or null if {@link #getStatus()} !=
- * {@link #RANGING_STATUS_SUCCESS}
- */
- @Nullable
- public AngleOfArrivalMeasurement getAngleOfArrivalMeasurement() {
- return mAngleOfArrivalMeasurement;
- }
-
- /**
- * @hide
- */
- @Override
- public boolean equals(@Nullable Object obj) {
- if (this == obj) {
- return true;
- }
-
- if (obj instanceof RangingMeasurement) {
- RangingMeasurement other = (RangingMeasurement) obj;
- return mRemoteDeviceAddress.equals(other.getRemoteDeviceAddress())
- && mStatus == other.getStatus()
- && mElapsedRealtimeNanos == other.getElapsedRealtimeNanos()
- && mDistanceMeasurement.equals(other.getDistanceMeasurement())
- && mAngleOfArrivalMeasurement.equals(other.getAngleOfArrivalMeasurement());
- }
- return false;
- }
-
- /**
- * @hide
- */
- @Override
- public int hashCode() {
- return Objects.hash(mRemoteDeviceAddress, mStatus, mElapsedRealtimeNanos,
- mDistanceMeasurement, mAngleOfArrivalMeasurement);
- }
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(@NonNull 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.
- */
- public static final class Builder {
- private UwbAddress mRemoteDeviceAddress = null;
- private @Status int mStatus = RANGING_STATUS_FAILURE_UNKNOWN_ERROR;
- private long mElapsedRealtimeNanos = -1L;
- private DistanceMeasurement mDistanceMeasurement = null;
- private AngleOfArrivalMeasurement mAngleOfArrivalMeasurement = null;
-
- /**
- * Set the remote device address that this measurement is for
- *
- * @param remoteDeviceAddress remote device's address
- */
- @NonNull
- public Builder setRemoteDeviceAddress(@NonNull UwbAddress remoteDeviceAddress) {
- mRemoteDeviceAddress = remoteDeviceAddress;
- return this;
- }
-
- /**
- * Set the status of ranging measurement
- *
- * @param status the status of the ranging measurement
- */
- @NonNull
- public Builder setStatus(@Status int status) {
- mStatus = status;
- return this;
- }
-
- /**
- * Set the elapsed realtime in nanoseconds when the ranging measurement occurred
- *
- * @param elapsedRealtimeNanos time the ranging measurement occurred
- */
- @NonNull
- public Builder setElapsedRealtimeNanos(long elapsedRealtimeNanos) {
- if (elapsedRealtimeNanos < 0) {
- throw new IllegalArgumentException("elapsedRealtimeNanos must be >= 0");
- }
- mElapsedRealtimeNanos = elapsedRealtimeNanos;
- return this;
- }
-
- /**
- * Set the {@link DistanceMeasurement}
- *
- * @param distanceMeasurement the distance measurement for this ranging measurement
- */
- @NonNull
- public Builder setDistanceMeasurement(@NonNull DistanceMeasurement distanceMeasurement) {
- mDistanceMeasurement = distanceMeasurement;
- return this;
- }
-
- /**
- * Set the {@link AngleOfArrivalMeasurement}
- *
- * @param angleOfArrivalMeasurement the angle of arrival measurement for this ranging
- * measurement
- */
- @NonNull
- public Builder setAngleOfArrivalMeasurement(
- @NonNull AngleOfArrivalMeasurement angleOfArrivalMeasurement) {
- mAngleOfArrivalMeasurement = angleOfArrivalMeasurement;
- return this;
- }
-
- /**
- * Build the {@link RangingMeasurement} object
- *
- * @throws IllegalStateException if a distance or angle of arrival measurement is provided
- * but the measurement was not successful, if the
- * elapsedRealtimeNanos of the measurement is invalid, or
- * if no remote device address is set
- */
- @NonNull
- public RangingMeasurement build() {
- if (mStatus != RANGING_STATUS_SUCCESS) {
- if (mDistanceMeasurement != null) {
- throw new IllegalStateException(
- "Distance Measurement must be null if ranging is not successful");
- }
-
- if (mAngleOfArrivalMeasurement != null) {
- throw new IllegalStateException(
- "Angle of Arrival must be null if ranging is not successful");
- }
- }
-
- if (mRemoteDeviceAddress == null) {
- throw new IllegalStateException("No remote device address was set");
- }
-
- if (mElapsedRealtimeNanos < 0) {
- throw new IllegalStateException(
- "elapsedRealtimeNanos must be >=0: " + mElapsedRealtimeNanos);
- }
-
- return new RangingMeasurement(mRemoteDeviceAddress, mStatus, mElapsedRealtimeNanos,
- mDistanceMeasurement, mAngleOfArrivalMeasurement);
- }
- }
-}
diff --git a/core/java/android/uwb/RangingReport.aidl b/core/java/android/uwb/RangingReport.aidl
deleted file mode 100644
index c32747a..0000000
--- a/core/java/android/uwb/RangingReport.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright 2020 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.uwb;
-
-parcelable RangingReport;
diff --git a/core/java/android/uwb/RangingReport.java b/core/java/android/uwb/RangingReport.java
deleted file mode 100644
index 7a2df86..0000000
--- a/core/java/android/uwb/RangingReport.java
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * Copyright 2020 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.uwb;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.annotation.SystemApi;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
-
-/**
- * This class contains the UWB ranging data
- *
- * @hide
- */
-@SystemApi
-public final class RangingReport implements Parcelable {
- private final List<RangingMeasurement> mRangingMeasurements;
-
- private RangingReport(@NonNull List<RangingMeasurement> rangingMeasurements) {
- mRangingMeasurements = rangingMeasurements;
- }
-
- /**
- * Get a {@link List} of {@link RangingMeasurement} objects in the last measurement interval
- * <p>The underlying UWB adapter may choose to do multiple measurements in each ranging
- * interval.
- *
- * <p>The entries in the {@link List} are ordered in ascending order based on
- * {@link RangingMeasurement#getElapsedRealtimeNanos()}
- *
- * @return a {@link List} of {@link RangingMeasurement} objects
- */
- @NonNull
- public List<RangingMeasurement> getMeasurements() {
- return mRangingMeasurements;
- }
-
- /**
- * @hide
- */
- @Override
- public boolean equals(@Nullable Object obj) {
- if (this == obj) {
- return true;
- }
-
- if (obj instanceof RangingReport) {
- RangingReport other = (RangingReport) obj;
- return mRangingMeasurements.equals(other.getMeasurements());
- }
-
- return false;
- }
-
- /**
- * @hide
- */
- @Override
- public int hashCode() {
- return Objects.hash(mRangingMeasurements);
- }
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(@NonNull 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
- */
- public static final class Builder {
- List<RangingMeasurement> mMeasurements = new ArrayList<>();
-
- /**
- * Add a single {@link RangingMeasurement}
- *
- * @param rangingMeasurement a ranging measurement
- */
- @NonNull
- public Builder addMeasurement(@NonNull RangingMeasurement rangingMeasurement) {
- mMeasurements.add(rangingMeasurement);
- return this;
- }
-
- /**
- * Add a {@link List} of {@link RangingMeasurement}s
- *
- * @param rangingMeasurements {@link List} of {@link RangingMeasurement}s to add
- */
- @NonNull
- public Builder addMeasurements(@NonNull List<RangingMeasurement> rangingMeasurements) {
- mMeasurements.addAll(rangingMeasurements);
- return this;
- }
-
- /**
- * Build the {@link RangingReport} object
- *
- * @throws IllegalStateException if measurements are not in monotonically increasing order
- */
- @NonNull
- public RangingReport build() {
- // Verify that all measurement timestamps are monotonically increasing
- RangingMeasurement prevMeasurement = null;
- for (int curIndex = 0; curIndex < mMeasurements.size(); curIndex++) {
- RangingMeasurement curMeasurement = mMeasurements.get(curIndex);
- if (prevMeasurement != null
- && (prevMeasurement.getElapsedRealtimeNanos()
- > curMeasurement.getElapsedRealtimeNanos())) {
- throw new IllegalStateException(
- "Timestamp (" + curMeasurement.getElapsedRealtimeNanos()
- + ") at index " + curIndex + " is less than previous timestamp ("
- + prevMeasurement.getElapsedRealtimeNanos() + ")");
- }
- prevMeasurement = curMeasurement;
- }
- return new RangingReport(mMeasurements);
- }
- }
-}
-
diff --git a/core/java/android/uwb/RangingSession.java b/core/java/android/uwb/RangingSession.java
deleted file mode 100644
index 345b69d..0000000
--- a/core/java/android/uwb/RangingSession.java
+++ /dev/null
@@ -1,496 +0,0 @@
-/*
- * Copyright 2020 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.uwb;
-
-import android.Manifest;
-import android.annotation.IntDef;
-import android.annotation.NonNull;
-import android.annotation.RequiresPermission;
-import android.annotation.SystemApi;
-import android.os.Binder;
-import android.os.PersistableBundle;
-import android.os.RemoteException;
-import android.util.Log;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.util.concurrent.Executor;
-
-/**
- * This class provides a way to control an active UWB ranging session.
- * <p>It also defines the required {@link RangingSession.Callback} that must be implemented
- * in order to be notified of UWB ranging results and status events related to the
- * {@link RangingSession}.
- *
- * <p>To get an instance of {@link RangingSession}, first use
- * {@link UwbManager#openRangingSession(PersistableBundle, Executor, Callback)} to request to open a
- * session. Once the session is opened, a {@link RangingSession} object is provided through
- * {@link RangingSession.Callback#onOpened(RangingSession)}. If opening a session fails, the failure
- * is reported through {@link RangingSession.Callback#onOpenFailed(int, PersistableBundle)} with the
- * failure reason.
- *
- * @hide
- */
-@SystemApi
-public final class RangingSession implements AutoCloseable {
- private static final String TAG = "Uwb.RangingSession";
- private final SessionHandle mSessionHandle;
- private final IUwbAdapter mAdapter;
- private final Executor mExecutor;
- private final Callback mCallback;
-
- private enum State {
- /**
- * The state of the {@link RangingSession} until
- * {@link RangingSession.Callback#onOpened(RangingSession)} is invoked
- */
- INIT,
-
- /**
- * The {@link RangingSession} is initialized and ready to begin ranging
- */
- IDLE,
-
- /**
- * The {@link RangingSession} is actively ranging
- */
- ACTIVE,
-
- /**
- * The {@link RangingSession} is closed and may not be used for ranging.
- */
- CLOSED
- }
-
- private State mState = State.INIT;
-
- /**
- * Interface for receiving {@link RangingSession} events
- */
- public interface Callback {
- /**
- * @hide
- */
- @Retention(RetentionPolicy.SOURCE)
- @IntDef(value = {
- REASON_UNKNOWN,
- REASON_LOCAL_REQUEST,
- REASON_REMOTE_REQUEST,
- REASON_BAD_PARAMETERS,
- REASON_GENERIC_ERROR,
- REASON_MAX_SESSIONS_REACHED,
- REASON_SYSTEM_POLICY,
- REASON_PROTOCOL_SPECIFIC_ERROR})
- @interface Reason {}
-
- /**
- * Indicates that the session was closed or failed to open due to an unknown reason
- */
- int REASON_UNKNOWN = 0;
-
- /**
- * Indicates that the session was closed or failed to open because
- * {@link AutoCloseable#close()} or {@link RangingSession#close()} was called
- */
- int REASON_LOCAL_REQUEST = 1;
-
- /**
- * Indicates that the session was closed or failed to open due to an explicit request from
- * the remote device.
- */
- int REASON_REMOTE_REQUEST = 2;
-
- /**
- * Indicates that the session was closed or failed to open due to erroneous parameters
- */
- int REASON_BAD_PARAMETERS = 3;
-
- /**
- * Indicates an error on this device besides the error code already listed
- */
- int REASON_GENERIC_ERROR = 4;
-
- /**
- * Indicates that the number of currently open sessions is equal to
- * {@link UwbManager#getMaxSimultaneousSessions()} and additional sessions may not be
- * opened.
- */
- int REASON_MAX_SESSIONS_REACHED = 5;
-
- /**
- * Indicates that the local system policy caused the change, such
- * as privacy policy, power management policy, permissions, and more.
- */
- int REASON_SYSTEM_POLICY = 6;
-
- /**
- * Indicates a protocol specific error. The associated {@link PersistableBundle} should be
- * consulted for additional information.
- */
- int REASON_PROTOCOL_SPECIFIC_ERROR = 7;
-
- /**
- * Invoked when {@link UwbManager#openRangingSession(PersistableBundle, Executor, Callback)}
- * is successful
- *
- * @param session the newly opened {@link RangingSession}
- */
- void onOpened(@NonNull RangingSession session);
-
- /**
- * Invoked if {@link UwbManager#openRangingSession(PersistableBundle, Executor, Callback)}}
- * fails
- *
- * @param reason the failure reason
- * @param params protocol specific parameters
- */
- void onOpenFailed(@Reason int reason, @NonNull PersistableBundle params);
-
- /**
- * Invoked when {@link RangingSession#start(PersistableBundle)} is successful
- * @param sessionInfo session specific parameters from the lower layers
- */
- void onStarted(@NonNull PersistableBundle sessionInfo);
-
- /**
- * Invoked when {@link RangingSession#start(PersistableBundle)} fails
- *
- * @param reason the failure reason
- * @param params protocol specific parameters
- */
- void onStartFailed(@Reason int reason, @NonNull PersistableBundle params);
-
- /**
- * Invoked when a request to reconfigure the session succeeds
- *
- * @param params the updated ranging configuration
- */
- void onReconfigured(@NonNull PersistableBundle params);
-
- /**
- * Invoked when a request to reconfigure the session fails
- *
- * @param reason reason the session failed to be reconfigured
- * @param params protocol specific failure reasons
- */
- void onReconfigureFailed(@Reason int reason, @NonNull PersistableBundle params);
-
- /**
- * Invoked when a request to stop the session succeeds
- *
- * @param reason reason for the session stop
- * @param parameters protocol specific parameters related to the stop reason
- */
- void onStopped(@Reason int reason, @NonNull PersistableBundle parameters);
-
- /**
- * Invoked when a request to stop the session fails
- *
- * @param reason reason the session failed to be stopped
- * @param params protocol specific failure reasons
- */
- void onStopFailed(@Reason int reason, @NonNull PersistableBundle params);
-
- /**
- * Invoked when session is either closed spontaneously, or per user request via
- * {@link RangingSession#close()} or {@link AutoCloseable#close()}.
- *
- * @param reason reason for the session closure
- * @param parameters protocol specific parameters related to the close reason
- */
- void onClosed(@Reason int reason, @NonNull PersistableBundle parameters);
-
- /**
- * Called once per ranging interval even when a ranging measurement fails
- *
- * @param rangingReport ranging report for this interval's measurements
- */
- void onReportReceived(@NonNull RangingReport rangingReport);
- }
-
- /**
- * @hide
- */
- public RangingSession(Executor executor, Callback callback, IUwbAdapter adapter,
- SessionHandle sessionHandle) {
- mState = State.INIT;
- mExecutor = executor;
- mCallback = callback;
- mAdapter = adapter;
- mSessionHandle = sessionHandle;
- }
-
- /**
- * @hide
- */
- public boolean isOpen() {
- return mState == State.IDLE || mState == State.ACTIVE;
- }
-
- /**
- * Begins ranging for the session.
- *
- * <p>On successfully starting a ranging session,
- * {@link RangingSession.Callback#onStarted(PersistableBundle)} is invoked.
- *
- * <p>On failure to start the session,
- * {@link RangingSession.Callback#onStartFailed(int, PersistableBundle)} is invoked.
- *
- * @param params configuration parameters for starting the session
- */
- @RequiresPermission(Manifest.permission.UWB_PRIVILEGED)
- public void start(@NonNull PersistableBundle params) {
- if (mState != State.IDLE) {
- throw new IllegalStateException();
- }
-
- try {
- mAdapter.startRanging(mSessionHandle, params);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- }
-
- /**
- * Attempts to reconfigure the session with the given parameters
- * <p>This call may be made when the session is open.
- *
- * <p>On successfully reconfiguring the session
- * {@link RangingSession.Callback#onReconfigured(PersistableBundle)} is invoked.
- *
- * <p>On failure to reconfigure the session,
- * {@link RangingSession.Callback#onReconfigureFailed(int, PersistableBundle)} is invoked.
- *
- * @param params the parameters to reconfigure and their new values
- */
- @RequiresPermission(Manifest.permission.UWB_PRIVILEGED)
- public void reconfigure(@NonNull PersistableBundle params) {
- if (mState != State.ACTIVE && mState != State.IDLE) {
- throw new IllegalStateException();
- }
-
- try {
- mAdapter.reconfigureRanging(mSessionHandle, params);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- }
-
- /**
- * Stops actively ranging
- *
- * <p>A session that has been stopped may be resumed by calling
- * {@link RangingSession#start(PersistableBundle)} without the need to open a new session.
- *
- * <p>Stopping a {@link RangingSession} is useful when the lower layers should not discard
- * the parameters of the session, or when a session needs to be able to be resumed quickly.
- *
- * <p>If the {@link RangingSession} is no longer needed, use {@link RangingSession#close()} to
- * completely close the session and allow lower layers of the stack to perform necessarily
- * cleanup.
- *
- * <p>Stopped sessions may be closed by the system at any time. In such a case,
- * {@link RangingSession.Callback#onClosed(int, PersistableBundle)} is invoked.
- *
- * <p>On failure to stop the session,
- * {@link RangingSession.Callback#onStopFailed(int, PersistableBundle)} is invoked.
- */
- @RequiresPermission(Manifest.permission.UWB_PRIVILEGED)
- public void stop() {
- if (mState != State.ACTIVE) {
- throw new IllegalStateException();
- }
-
- try {
- mAdapter.stopRanging(mSessionHandle);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- }
-
- /**
- * Close the ranging session
- *
- * <p>After calling this function, in order resume ranging, a new {@link RangingSession} must
- * be opened by calling
- * {@link UwbManager#openRangingSession(PersistableBundle, Executor, Callback)}.
- *
- * <p>If this session is currently ranging, it will stop and close the session.
- * <p>If the session is in the process of being opened, it will attempt to stop the session from
- * being opened.
- * <p>If the session is already closed, the registered
- * {@link Callback#onClosed(int, PersistableBundle)} callback will still be invoked.
- *
- * <p>{@link Callback#onClosed(int, PersistableBundle)} will be invoked using the same callback
- * object given to {@link UwbManager#openRangingSession(PersistableBundle, Executor, Callback)}
- * when the {@link RangingSession} was opened. The callback will be invoked after each call to
- * {@link #close()}, even if the {@link RangingSession} is already closed.
- */
- @Override
- @RequiresPermission(Manifest.permission.UWB_PRIVILEGED)
- public void close() {
- if (mState == State.CLOSED) {
- mExecutor.execute(() -> mCallback.onClosed(
- Callback.REASON_LOCAL_REQUEST, new PersistableBundle()));
- return;
- }
-
- try {
- mAdapter.closeRanging(mSessionHandle);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- }
-
- /**
- * @hide
- */
- public void onRangingOpened() {
- if (mState == State.CLOSED) {
- Log.w(TAG, "onRangingOpened invoked for a closed session");
- return;
- }
-
- mState = State.IDLE;
- executeCallback(() -> mCallback.onOpened(this));
- }
-
- /**
- * @hide
- */
- public void onRangingOpenFailed(@Callback.Reason int reason,
- @NonNull PersistableBundle params) {
- if (mState == State.CLOSED) {
- Log.w(TAG, "onRangingOpenFailed invoked for a closed session");
- return;
- }
-
- mState = State.CLOSED;
- executeCallback(() -> mCallback.onOpenFailed(reason, params));
- }
-
- /**
- * @hide
- */
- public void onRangingStarted(@NonNull PersistableBundle parameters) {
- if (mState == State.CLOSED) {
- Log.w(TAG, "onRangingStarted invoked for a closed session");
- return;
- }
-
- mState = State.ACTIVE;
- executeCallback(() -> mCallback.onStarted(parameters));
- }
-
- /**
- * @hide
- */
- public void onRangingStartFailed(@Callback.Reason int reason,
- @NonNull PersistableBundle params) {
- if (mState == State.CLOSED) {
- Log.w(TAG, "onRangingStartFailed invoked for a closed session");
- return;
- }
-
- executeCallback(() -> mCallback.onStartFailed(reason, params));
- }
-
- /**
- * @hide
- */
- public void onRangingReconfigured(@NonNull PersistableBundle params) {
- if (mState == State.CLOSED) {
- Log.w(TAG, "onRangingReconfigured invoked for a closed session");
- return;
- }
-
- executeCallback(() -> mCallback.onReconfigured(params));
- }
-
- /**
- * @hide
- */
- public void onRangingReconfigureFailed(@Callback.Reason int reason,
- @NonNull PersistableBundle params) {
- if (mState == State.CLOSED) {
- Log.w(TAG, "onRangingReconfigureFailed invoked for a closed session");
- return;
- }
-
- executeCallback(() -> mCallback.onReconfigureFailed(reason, params));
- }
-
- /**
- * @hide
- */
- public void onRangingStopped(@Callback.Reason int reason,
- @NonNull PersistableBundle params) {
- if (mState == State.CLOSED) {
- Log.w(TAG, "onRangingStopped invoked for a closed session");
- return;
- }
-
- mState = State.IDLE;
- executeCallback(() -> mCallback.onStopped(reason, params));
- }
-
- /**
- * @hide
- */
- public void onRangingStopFailed(@Callback.Reason int reason,
- @NonNull PersistableBundle params) {
- if (mState == State.CLOSED) {
- Log.w(TAG, "onRangingStopFailed invoked for a closed session");
- return;
- }
-
- executeCallback(() -> mCallback.onStopFailed(reason, params));
- }
-
- /**
- * @hide
- */
- public void onRangingClosed(@Callback.Reason int reason,
- @NonNull PersistableBundle parameters) {
- mState = State.CLOSED;
- executeCallback(() -> mCallback.onClosed(reason, parameters));
- }
-
- /**
- * @hide
- */
- public void onRangingResult(@NonNull RangingReport report) {
- if (!isOpen()) {
- Log.w(TAG, "onRangingResult invoked for non-open session");
- return;
- }
-
- executeCallback(() -> mCallback.onReportReceived(report));
- }
-
- /**
- * @hide
- */
- private void executeCallback(@NonNull Runnable runnable) {
- final long identity = Binder.clearCallingIdentity();
- try {
- mExecutor.execute(runnable);
- } finally {
- Binder.restoreCallingIdentity(identity);
- }
- }
-}
diff --git a/core/java/android/uwb/SessionHandle.aidl b/core/java/android/uwb/SessionHandle.aidl
deleted file mode 100644
index 58a7dbb..0000000
--- a/core/java/android/uwb/SessionHandle.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright 2020 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.uwb;
-
-parcelable SessionHandle;
diff --git a/core/java/android/uwb/SessionHandle.java b/core/java/android/uwb/SessionHandle.java
deleted file mode 100644
index b23f5ad..0000000
--- a/core/java/android/uwb/SessionHandle.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * Copyright 2020 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.uwb;
-
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import java.util.Objects;
-
-/**
- * @hide
- */
-public final class SessionHandle implements Parcelable {
- private final int mId;
-
- public SessionHandle(int id) {
- mId = id;
- }
-
- protected SessionHandle(Parcel in) {
- mId = in.readInt();
- }
-
- public static final Creator<SessionHandle> CREATOR = new Creator<SessionHandle>() {
- @Override
- public SessionHandle createFromParcel(Parcel in) {
- return new SessionHandle(in);
- }
-
- @Override
- public SessionHandle[] newArray(int size) {
- return new SessionHandle[size];
- }
- };
-
- public int getId() {
- return mId;
- }
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- dest.writeInt(mId);
- }
-
- @Override
- public boolean equals(Object obj) {
- if (this == obj) {
- return true;
- }
-
- if (obj instanceof SessionHandle) {
- SessionHandle other = (SessionHandle) obj;
- return mId == other.mId;
- }
- return false;
- }
-
- @Override
- public int hashCode() {
- return Objects.hashCode(mId);
- }
-
- @Override
- public String toString() {
- return "SessionHandle [id=" + mId + "]";
- }
-}
diff --git a/core/java/android/uwb/StateChangeReason.aidl b/core/java/android/uwb/StateChangeReason.aidl
deleted file mode 100644
index 28eaf9f..0000000
--- a/core/java/android/uwb/StateChangeReason.aidl
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright 2020 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.uwb;
-
-/**
- * @hide
- */
-@Backing(type="int")
-enum StateChangeReason {
- /**
- * The state changed for an unknown reason
- */
- UNKNOWN,
-
- /**
- * The adapter state changed because a session started.
- */
- SESSION_STARTED,
-
-
- /**
- * The adapter state changed because all sessions were closed.
- */
- ALL_SESSIONS_CLOSED,
-
- /**
- * The adapter state changed because of a device system change.
- */
- SYSTEM_POLICY,
-
- /**
- * Used to signal the first adapter state message after boot
- */
- SYSTEM_BOOT,
-}
-
diff --git a/core/java/android/uwb/TEST_MAPPING b/core/java/android/uwb/TEST_MAPPING
deleted file mode 100644
index 08ed2c7..0000000
--- a/core/java/android/uwb/TEST_MAPPING
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "presubmit": [
- {
- "name": "UwbManagerTests"
- },
- {
- "name": "CtsUwbTestCases"
- }
- ]
-}
diff --git a/core/java/android/uwb/UwbAddress.aidl b/core/java/android/uwb/UwbAddress.aidl
deleted file mode 100644
index a202b1a..0000000
--- a/core/java/android/uwb/UwbAddress.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright 2020 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.uwb;
-
-parcelable UwbAddress;
diff --git a/core/java/android/uwb/UwbAddress.java b/core/java/android/uwb/UwbAddress.java
deleted file mode 100644
index 22883be..0000000
--- a/core/java/android/uwb/UwbAddress.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Copyright 2020 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.uwb;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.annotation.SystemApi;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import java.util.Arrays;
-
-/**
- * A class representing a UWB address
- *
- * @hide
- */
-@SystemApi
-public final class UwbAddress implements Parcelable {
- public static final int SHORT_ADDRESS_BYTE_LENGTH = 2;
- public static final int EXTENDED_ADDRESS_BYTE_LENGTH = 8;
-
- private final byte[] mAddressBytes;
-
- private UwbAddress(byte[] address) {
- mAddressBytes = address;
- }
-
- /**
- * Create a {@link UwbAddress} from a byte array.
- *
- * <p>If the provided array is {@link #SHORT_ADDRESS_BYTE_LENGTH} bytes, a short address is
- * created. If the provided array is {@link #EXTENDED_ADDRESS_BYTE_LENGTH} bytes, then an
- * extended address is created.
- *
- * @param address a byte array to convert to a {@link UwbAddress}
- * @return a {@link UwbAddress} created from the input byte array
- * @throws IllegalArgumentException when the length is not one of
- * {@link #SHORT_ADDRESS_BYTE_LENGTH} or {@link #EXTENDED_ADDRESS_BYTE_LENGTH} bytes
- */
- @NonNull
- public static UwbAddress fromBytes(@NonNull byte[] address) {
- if (address.length != SHORT_ADDRESS_BYTE_LENGTH
- && address.length != EXTENDED_ADDRESS_BYTE_LENGTH) {
- throw new IllegalArgumentException("Invalid UwbAddress length " + address.length);
- }
- return new UwbAddress(address);
- }
-
- /**
- * Get the address as a byte array
- *
- * @return the byte representation of this {@link UwbAddress}
- */
- @NonNull
- public byte[] toBytes() {
- return mAddressBytes;
- }
-
- /**
- * The length of the address in bytes
- * <p>Possible values are {@link #SHORT_ADDRESS_BYTE_LENGTH} and
- * {@link #EXTENDED_ADDRESS_BYTE_LENGTH}.
- */
- public int size() {
- return mAddressBytes.length;
- }
-
- @NonNull
- @Override
- public String toString() {
- StringBuilder builder = new StringBuilder("0x");
- for (byte addressByte : mAddressBytes) {
- builder.append(String.format("%02X", addressByte));
- }
- return builder.toString();
- }
-
- @Override
- public boolean equals(@Nullable Object obj) {
- if (obj instanceof UwbAddress) {
- return Arrays.equals(mAddressBytes, ((UwbAddress) obj).toBytes());
- }
- return false;
- }
-
- @Override
- public int hashCode() {
- return Arrays.hashCode(mAddressBytes);
- }
-
- @Override
- public int describeContents() {
- return 0;
- }
-
- @Override
- public void writeToParcel(@NonNull 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];
- }
- };
-}
diff --git a/core/java/android/uwb/UwbManager.java b/core/java/android/uwb/UwbManager.java
deleted file mode 100644
index f7406ae..0000000
--- a/core/java/android/uwb/UwbManager.java
+++ /dev/null
@@ -1,308 +0,0 @@
-/*
- * Copyright 2020 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.uwb;
-
-import android.Manifest.permission;
-import android.annotation.CallbackExecutor;
-import android.annotation.IntDef;
-import android.annotation.NonNull;
-import android.annotation.RequiresPermission;
-import android.annotation.SuppressLint;
-import android.annotation.SystemApi;
-import android.annotation.SystemService;
-import android.content.Context;
-import android.os.CancellationSignal;
-import android.os.IBinder;
-import android.os.PersistableBundle;
-import android.os.RemoteException;
-import android.os.ServiceManager;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.util.concurrent.Executor;
-
-/**
- * This class provides a way to perform Ultra Wideband (UWB) operations such as querying the
- * device's capabilities and determining the distance and angle between the local device and a
- * remote device.
- *
- * <p>To get a {@link UwbManager}, call the <code>Context.getSystemService(UwbManager.class)</code>.
- *
- * @hide
- */
-@SystemApi
-@SystemService(Context.UWB_SERVICE)
-public final class UwbManager {
- private static final String SERVICE_NAME = Context.UWB_SERVICE;
-
- private final Context mContext;
- private final IUwbAdapter mUwbAdapter;
- private final AdapterStateListener mAdapterStateListener;
- private final RangingManager mRangingManager;
-
- /**
- * Interface for receiving UWB adapter state changes
- */
- public interface AdapterStateCallback {
- /**
- * @hide
- */
- @Retention(RetentionPolicy.SOURCE)
- @IntDef(value = {
- STATE_CHANGED_REASON_SESSION_STARTED,
- STATE_CHANGED_REASON_ALL_SESSIONS_CLOSED,
- STATE_CHANGED_REASON_SYSTEM_POLICY,
- STATE_CHANGED_REASON_SYSTEM_BOOT,
- STATE_CHANGED_REASON_ERROR_UNKNOWN})
- @interface StateChangedReason {}
-
- /**
- * @hide
- */
- @Retention(RetentionPolicy.SOURCE)
- @IntDef(value = {
- STATE_ENABLED_INACTIVE,
- STATE_ENABLED_ACTIVE,
- STATE_DISABLED})
- @interface State {}
-
- /**
- * Indicates that the state change was due to opening of first UWB session
- */
- int STATE_CHANGED_REASON_SESSION_STARTED = 0;
-
- /**
- * Indicates that the state change was due to closure of all UWB sessions
- */
- int STATE_CHANGED_REASON_ALL_SESSIONS_CLOSED = 1;
-
- /**
- * Indicates that the state change was due to changes in system policy
- */
- int STATE_CHANGED_REASON_SYSTEM_POLICY = 2;
-
- /**
- * Indicates that the current state is due to a system boot
- */
- int STATE_CHANGED_REASON_SYSTEM_BOOT = 3;
-
- /**
- * Indicates that the state change was due to some unknown error
- */
- int STATE_CHANGED_REASON_ERROR_UNKNOWN = 4;
-
- /**
- * Indicates that UWB is disabled on device
- */
- int STATE_DISABLED = 0;
- /**
- * Indicates that UWB is enabled on device but has no active ranging sessions
- */
- int STATE_ENABLED_INACTIVE = 1;
-
- /**
- * Indicates that UWB is enabled and has active ranging session
- */
- int STATE_ENABLED_ACTIVE = 2;
-
- /**
- * Invoked when underlying UWB adapter's state is changed
- * <p>Invoked with the adapter's current state after registering an
- * {@link AdapterStateCallback} using
- * {@link UwbManager#registerAdapterStateCallback(Executor, AdapterStateCallback)}.
- *
- * <p>Possible reasons for the state to change are
- * {@link #STATE_CHANGED_REASON_SESSION_STARTED},
- * {@link #STATE_CHANGED_REASON_ALL_SESSIONS_CLOSED},
- * {@link #STATE_CHANGED_REASON_SYSTEM_POLICY},
- * {@link #STATE_CHANGED_REASON_SYSTEM_BOOT},
- * {@link #STATE_CHANGED_REASON_ERROR_UNKNOWN}.
- *
- * <p>Possible values for the UWB state are
- * {@link #STATE_ENABLED_INACTIVE},
- * {@link #STATE_ENABLED_ACTIVE},
- * {@link #STATE_DISABLED}.
- *
- * @param state the UWB state; inactive, active or disabled
- * @param reason the reason for the state change
- */
- void onStateChanged(@State int state, @StateChangedReason int reason);
- }
-
- /**
- * Use <code>Context.getSystemService(UwbManager.class)</code> to get an instance.
- *
- * @param ctx Context of the client.
- * @param adapter an instance of an {@link android.uwb.IUwbAdapter}
- */
- private UwbManager(@NonNull Context ctx, @NonNull IUwbAdapter adapter) {
- mContext = ctx;
- mUwbAdapter = adapter;
- mAdapterStateListener = new AdapterStateListener(adapter);
- mRangingManager = new RangingManager(adapter);
- }
-
- /**
- * @hide
- */
- public static UwbManager getInstance(@NonNull Context ctx) {
- IBinder b = ServiceManager.getService(SERVICE_NAME);
- if (b == null) {
- return null;
- }
-
- IUwbAdapter adapter = IUwbAdapter.Stub.asInterface(b);
- if (adapter == null) {
- return null;
- }
-
- return new UwbManager(ctx, adapter);
- }
-
- /**
- * Register an {@link AdapterStateCallback} to listen for UWB adapter state changes
- * <p>The provided callback will be invoked by the given {@link Executor}.
- *
- * <p>When first registering a callback, the callbacks's
- * {@link AdapterStateCallback#onStateChanged(int, int)} is immediately invoked to indicate
- * the current state of the underlying UWB adapter with the most recent
- * {@link AdapterStateCallback.StateChangedReason} that caused the change.
- *
- * @param executor an {@link Executor} to execute given callback
- * @param callback user implementation of the {@link AdapterStateCallback}
- */
- @RequiresPermission(permission.UWB_PRIVILEGED)
- public void registerAdapterStateCallback(@NonNull @CallbackExecutor Executor executor,
- @NonNull AdapterStateCallback callback) {
- mAdapterStateListener.register(executor, callback);
- }
-
- /**
- * Unregister the specified {@link AdapterStateCallback}
- * <p>The same {@link AdapterStateCallback} object used when calling
- * {@link #registerAdapterStateCallback(Executor, AdapterStateCallback)} must be used.
- *
- * <p>Callbacks are automatically unregistered when application process goes away
- *
- * @param callback user implementation of the {@link AdapterStateCallback}
- */
- @RequiresPermission(permission.UWB_PRIVILEGED)
- public void unregisterAdapterStateCallback(@NonNull AdapterStateCallback callback) {
- mAdapterStateListener.unregister(callback);
- }
-
- /**
- * Get a {@link PersistableBundle} with the supported UWB protocols and parameters.
- * <p>The {@link PersistableBundle} should be parsed using a support library
- *
- * <p>Android reserves the '^android.*' namespace</p>
- *
- * @return {@link PersistableBundle} of the device's supported UWB protocols and parameters
- */
- @NonNull
- @RequiresPermission(permission.UWB_PRIVILEGED)
- public PersistableBundle getSpecificationInfo() {
- try {
- return mUwbAdapter.getSpecificationInfo();
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- }
-
- /**
- * Get the timestamp resolution for events in nanoseconds
- * <p>This value defines the maximum error of all timestamps for events reported to
- * {@link RangingSession.Callback}.
- *
- * @return the timestamp resolution in nanoseconds
- */
- @SuppressLint("MethodNameUnits")
- @RequiresPermission(permission.UWB_PRIVILEGED)
- public long elapsedRealtimeResolutionNanos() {
- try {
- return mUwbAdapter.getTimestampResolutionNanos();
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- }
-
- /**
- * Open a {@link RangingSession} with the given parameters
- * <p>The {@link RangingSession.Callback#onOpened(RangingSession)} function is called with a
- * {@link RangingSession} object used to control ranging when the session is successfully
- * opened.
- *
- * <p>If a session cannot be opened, then
- * {@link RangingSession.Callback#onClosed(int, PersistableBundle)} will be invoked with the
- * appropriate {@link RangingSession.Callback.Reason}.
- *
- * <p>An open {@link RangingSession} will be automatically closed if client application process
- * dies.
- *
- * <p>A UWB support library must be used in order to construct the {@code parameter}
- * {@link PersistableBundle}.
- *
- * @param parameters the parameters that define the ranging session
- * @param executor {@link Executor} to run callbacks
- * @param callbacks {@link RangingSession.Callback} to associate with the
- * {@link RangingSession} that is being opened.
- *
- * @return an {@link CancellationSignal} that is able to be used to cancel the opening of a
- * {@link RangingSession} that has been requested through {@link #openRangingSession}
- * but has not yet been made available by
- * {@link RangingSession.Callback#onOpened(RangingSession)}.
- */
- @NonNull
- @RequiresPermission(allOf = {
- permission.UWB_PRIVILEGED,
- permission.UWB_RANGING
- })
- public CancellationSignal openRangingSession(@NonNull PersistableBundle parameters,
- @NonNull @CallbackExecutor Executor executor,
- @NonNull RangingSession.Callback callbacks) {
- return mRangingManager.openSession(
- mContext.getAttributionSource(), parameters, executor, callbacks);
- }
-
- /**
- * Returns the current enabled/disabled state for UWB.
- *
- * Possible values are:
- * AdapterStateCallback#STATE_DISABLED
- * AdapterStateCallback#STATE_ENABLED_INACTIVE
- * AdapterStateCallback#STATE_ENABLED_ACTIVE
- *
- * @return value representing current enabled/disabled state for UWB.
- * @hide
- */
- public @AdapterStateCallback.State int getAdapterState() {
- return mAdapterStateListener.getAdapterState();
- }
-
- /**
- * Disables or enables UWB for a user
- *
- * @param enabled value representing intent to disable or enable UWB. If true any subsequent
- * calls to IUwbAdapter#openRanging will be allowed. If false, all active ranging sessions will
- * be closed and subsequent calls to IUwbAdapter#openRanging will be disallowed.
- *
- * @hide
- */
- public void setUwbEnabled(boolean enabled) {
- mAdapterStateListener.setEnabled(enabled);
- }
-}
diff --git a/core/tests/uwbtests/Android.bp b/core/tests/uwbtests/Android.bp
deleted file mode 100644
index 31f446f..0000000
--- a/core/tests/uwbtests/Android.bp
+++ /dev/null
@@ -1,38 +0,0 @@
-// Copyright 2020 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 {
- // See: http://go/android-license-faq
- // A large-scale-change added 'default_applicable_licenses' to import
- // all of the 'license_kinds' from "frameworks_base_license"
- // to get the below license kinds:
- // SPDX-license-identifier-Apache-2.0
- default_applicable_licenses: ["frameworks_base_license"],
-}
-
-android_test {
- name: "UwbManagerTests",
- static_libs: [
- "androidx.test.ext.junit",
- "androidx.test.rules",
- "mockito-target-minus-junit4",
- ],
- libs: [
- "android.test.runner",
- ],
- srcs: ["src/**/*.java"],
- platform_apis: true,
- certificate: "platform",
- test_suites: ["device-tests"],
-}
diff --git a/core/tests/uwbtests/AndroidManifest.xml b/core/tests/uwbtests/AndroidManifest.xml
deleted file mode 100644
index dc991ff..0000000
--- a/core/tests/uwbtests/AndroidManifest.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2020 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.
--->
-
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="android.uwb">
-
- <application>
- <uses-library android:name="android.test.runner" />
- </application>
-
- <!-- This is a self-instrumenting test package. -->
- <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
- android:targetPackage="android.uwb"
- android:label="UWB Manager Tests">
- </instrumentation>
-
-</manifest>
-
diff --git a/core/tests/uwbtests/AndroidTest.xml b/core/tests/uwbtests/AndroidTest.xml
deleted file mode 100644
index ff4b668..0000000
--- a/core/tests/uwbtests/AndroidTest.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright 2020 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.
--->
-<configuration description="Config for UWB Manager test cases">
- <option name="test-suite-tag" value="apct"/>
- <option name="test-suite-tag" value="apct-instrumentation"/>
- <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
- <option name="cleanup-apks" value="true" />
- <option name="test-file-name" value="UwbManagerTests.apk" />
- </target_preparer>
-
- <option name="test-suite-tag" value="apct"/>
- <option name="test-tag" value="UwbManagerTests"/>
-
- <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
- <option name="package" value="android.uwb" />
- <option name="hidden-api-checks" value="false"/>
- <option name="runner" value="androidx.test.runner.AndroidJUnitRunner"/>
- </test>
-</configuration>
diff --git a/core/tests/uwbtests/OWNERS b/core/tests/uwbtests/OWNERS
deleted file mode 100644
index c7b09a2..0000000
--- a/core/tests/uwbtests/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-include /core/java/android/uwb/OWNERS
diff --git a/core/tests/uwbtests/src/android/uwb/AdapterStateListenerTest.java b/core/tests/uwbtests/src/android/uwb/AdapterStateListenerTest.java
deleted file mode 100644
index 4cad535..0000000
--- a/core/tests/uwbtests/src/android/uwb/AdapterStateListenerTest.java
+++ /dev/null
@@ -1,288 +0,0 @@
-/*
- * Copyright 2020 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.uwb;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.Mockito.doAnswer;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-
-
-import android.os.RemoteException;
-import android.uwb.UwbManager.AdapterStateCallback;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.SmallTest;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.invocation.InvocationOnMock;
-import org.mockito.stubbing.Answer;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.Executor;
-
-/**
- * Test of {@link AdapterStateListener}.
- */
-@SmallTest
-@RunWith(AndroidJUnit4.class)
-public class AdapterStateListenerTest {
-
- IUwbAdapter mUwbAdapter = mock(IUwbAdapter.class);
-
- Answer mRegisterSuccessAnswer = new Answer() {
- public Object answer(InvocationOnMock invocation) {
- Object[] args = invocation.getArguments();
- IUwbAdapterStateCallbacks cb = (IUwbAdapterStateCallbacks) args[0];
- try {
- cb.onAdapterStateChanged(AdapterState.STATE_DISABLED, StateChangeReason.UNKNOWN);
- } catch (RemoteException e) {
- // Nothing to do
- }
- return new Object();
- }
- };
-
- Throwable mThrowRemoteException = new RemoteException("RemoteException");
-
- private static Executor getExecutor() {
- return new Executor() {
- @Override
- public void execute(Runnable command) {
- command.run();
- }
- };
- }
-
- private static void verifyCallbackStateChangedInvoked(
- AdapterStateCallback callback, int numTimes) {
- verify(callback, times(numTimes)).onStateChanged(anyInt(), anyInt());
- }
-
- @Test
- public void testRegister_RegisterUnregister() throws RemoteException {
- doAnswer(mRegisterSuccessAnswer).when(mUwbAdapter).registerAdapterStateCallbacks(any());
-
- AdapterStateListener adapterStateListener = new AdapterStateListener(mUwbAdapter);
- AdapterStateCallback callback1 = mock(AdapterStateCallback.class);
- AdapterStateCallback callback2 = mock(AdapterStateCallback.class);
-
- // Verify that the adapter state listener registered with the UWB Adapter
- adapterStateListener.register(getExecutor(), callback1);
- verify(mUwbAdapter, times(1)).registerAdapterStateCallbacks(any());
- verifyCallbackStateChangedInvoked(callback1, 1);
- verifyCallbackStateChangedInvoked(callback2, 0);
-
- // Register a second client and no new call to UWB Adapter
- adapterStateListener.register(getExecutor(), callback2);
- verify(mUwbAdapter, times(1)).registerAdapterStateCallbacks(any());
- verifyCallbackStateChangedInvoked(callback1, 1);
- verifyCallbackStateChangedInvoked(callback2, 1);
-
- // Unregister first callback
- adapterStateListener.unregister(callback1);
- verify(mUwbAdapter, times(1)).registerAdapterStateCallbacks(any());
- verify(mUwbAdapter, times(0)).unregisterAdapterStateCallbacks(any());
- verifyCallbackStateChangedInvoked(callback1, 1);
- verifyCallbackStateChangedInvoked(callback2, 1);
-
- // Unregister second callback
- adapterStateListener.unregister(callback2);
- verify(mUwbAdapter, times(1)).registerAdapterStateCallbacks(any());
- verify(mUwbAdapter, times(1)).unregisterAdapterStateCallbacks(any());
- verifyCallbackStateChangedInvoked(callback1, 1);
- verifyCallbackStateChangedInvoked(callback2, 1);
- }
-
- @Test
- public void testRegister_RegisterSameCallbackTwice() throws RemoteException {
- AdapterStateListener adapterStateListener = new AdapterStateListener(mUwbAdapter);
- AdapterStateCallback callback = mock(AdapterStateCallback.class);
- doAnswer(mRegisterSuccessAnswer).when(mUwbAdapter).registerAdapterStateCallbacks(any());
-
- adapterStateListener.register(getExecutor(), callback);
- verifyCallbackStateChangedInvoked(callback, 1);
-
- adapterStateListener.register(getExecutor(), callback);
- verifyCallbackStateChangedInvoked(callback, 1);
-
- // Invoke a state change and ensure the callback is only called once
- adapterStateListener.onAdapterStateChanged(AdapterState.STATE_DISABLED,
- StateChangeReason.UNKNOWN);
- verifyCallbackStateChangedInvoked(callback, 2);
- }
-
- @Test
- public void testCallback_RunViaExecutor_Success() throws RemoteException {
- // Verify that the callbacks are invoked on the executor when successful
- doAnswer(mRegisterSuccessAnswer).when(mUwbAdapter).registerAdapterStateCallbacks(any());
- runViaExecutor();
- }
-
- private void runViaExecutor() {
- AdapterStateListener adapterStateListener = new AdapterStateListener(mUwbAdapter);
- AdapterStateCallback callback = mock(AdapterStateCallback.class);
-
- Executor executor = mock(Executor.class);
-
- // Do not run commands received and ensure that the callback is not invoked
- doAnswer(new ExecutorAnswer(false)).when(executor).execute(any());
- adapterStateListener.register(executor, callback);
- verify(executor, times(1)).execute(any());
- verifyCallbackStateChangedInvoked(callback, 0);
-
- // Manually invoke the callback and ensure callback is not invoked
- adapterStateListener.onAdapterStateChanged(AdapterState.STATE_DISABLED,
- StateChangeReason.UNKNOWN);
- verify(executor, times(2)).execute(any());
- verifyCallbackStateChangedInvoked(callback, 0);
-
- // Run the command that the executor receives
- doAnswer(new ExecutorAnswer(true)).when(executor).execute(any());
- adapterStateListener.onAdapterStateChanged(AdapterState.STATE_DISABLED,
- StateChangeReason.UNKNOWN);
- verify(executor, times(3)).execute(any());
- verifyCallbackStateChangedInvoked(callback, 1);
- }
-
- class ExecutorAnswer implements Answer {
-
- final boolean mShouldRun;
- ExecutorAnswer(boolean shouldRun) {
- mShouldRun = shouldRun;
- }
-
- @Override
- public Object answer(InvocationOnMock invocation) throws Throwable {
- if (mShouldRun) {
- ((Runnable) invocation.getArgument(0)).run();
- }
- return null;
- }
- }
-
- @Test
- public void testNotify_AllCallbacksNotified() throws RemoteException {
- doAnswer(mRegisterSuccessAnswer).when(mUwbAdapter).registerAdapterStateCallbacks(any());
-
- AdapterStateListener adapterStateListener = new AdapterStateListener(mUwbAdapter);
- List<AdapterStateCallback> callbacks = new ArrayList<>();
- for (int i = 0; i < 10; i++) {
- AdapterStateCallback callback = mock(AdapterStateCallback.class);
- adapterStateListener.register(getExecutor(), callback);
- callbacks.add(callback);
- }
-
- // Ensure every callback got the initial state
- for (AdapterStateCallback callback : callbacks) {
- verifyCallbackStateChangedInvoked(callback, 1);
- }
-
- // Invoke a state change and ensure all callbacks are invoked
- adapterStateListener.onAdapterStateChanged(AdapterState.STATE_DISABLED,
- StateChangeReason.ALL_SESSIONS_CLOSED);
- for (AdapterStateCallback callback : callbacks) {
- verifyCallbackStateChangedInvoked(callback, 2);
- }
- }
-
- @Test
- public void testStateChange_CorrectValue() {
- AdapterStateListener adapterStateListener = new AdapterStateListener(mUwbAdapter);
-
- AdapterStateCallback callback = mock(AdapterStateCallback.class);
-
- adapterStateListener.register(getExecutor(), callback);
-
- runStateChangeValue(StateChangeReason.ALL_SESSIONS_CLOSED,
- AdapterState.STATE_ENABLED_INACTIVE,
- AdapterStateCallback.STATE_CHANGED_REASON_ALL_SESSIONS_CLOSED,
- AdapterStateCallback.STATE_ENABLED_INACTIVE);
-
- runStateChangeValue(StateChangeReason.SESSION_STARTED, AdapterState.STATE_ENABLED_ACTIVE,
- AdapterStateCallback.STATE_CHANGED_REASON_SESSION_STARTED,
- AdapterStateCallback.STATE_ENABLED_ACTIVE);
-
- runStateChangeValue(StateChangeReason.SYSTEM_BOOT, AdapterState.STATE_DISABLED,
- AdapterStateCallback.STATE_CHANGED_REASON_SYSTEM_BOOT,
- AdapterStateCallback.STATE_DISABLED);
-
- runStateChangeValue(StateChangeReason.SYSTEM_POLICY, AdapterState.STATE_DISABLED,
- AdapterStateCallback.STATE_CHANGED_REASON_SYSTEM_POLICY,
- AdapterStateCallback.STATE_DISABLED);
-
- runStateChangeValue(StateChangeReason.UNKNOWN, AdapterState.STATE_DISABLED,
- AdapterStateCallback.STATE_CHANGED_REASON_ERROR_UNKNOWN,
- AdapterStateCallback.STATE_DISABLED);
- }
-
- private void runStateChangeValue(@StateChangeReason int reasonIn, @AdapterState int stateIn,
- @AdapterStateCallback.StateChangedReason int reasonOut,
- @AdapterStateCallback.State int stateOut) {
- AdapterStateListener adapterStateListener = new AdapterStateListener(mUwbAdapter);
- AdapterStateCallback callback = mock(AdapterStateCallback.class);
- adapterStateListener.register(getExecutor(), callback);
-
- adapterStateListener.onAdapterStateChanged(stateIn, reasonIn);
- verify(callback, times(1)).onStateChanged(stateOut, reasonOut);
- }
-
- @Test
- public void testStateChange_FirstRegisterGetsCorrectState() throws RemoteException {
- AdapterStateListener adapterStateListener = new AdapterStateListener(mUwbAdapter);
- AdapterStateCallback callback = mock(AdapterStateCallback.class);
-
- Answer registerAnswer = new Answer() {
- public Object answer(InvocationOnMock invocation) {
- Object[] args = invocation.getArguments();
- IUwbAdapterStateCallbacks cb = (IUwbAdapterStateCallbacks) args[0];
- try {
- cb.onAdapterStateChanged(AdapterState.STATE_ENABLED_ACTIVE,
- StateChangeReason.SESSION_STARTED);
- } catch (RemoteException e) {
- // Nothing to do
- }
- return new Object();
- }
- };
-
- doAnswer(registerAnswer).when(mUwbAdapter).registerAdapterStateCallbacks(any());
-
- adapterStateListener.register(getExecutor(), callback);
- verify(callback).onStateChanged(AdapterStateCallback.STATE_ENABLED_ACTIVE,
- AdapterStateCallback.STATE_CHANGED_REASON_SESSION_STARTED);
- }
-
- @Test
- public void testStateChange_SecondRegisterGetsCorrectState() {
- AdapterStateListener adapterStateListener = new AdapterStateListener(mUwbAdapter);
- AdapterStateCallback callback1 = mock(AdapterStateCallback.class);
- AdapterStateCallback callback2 = mock(AdapterStateCallback.class);
-
- adapterStateListener.register(getExecutor(), callback1);
- adapterStateListener.onAdapterStateChanged(AdapterState.STATE_ENABLED_ACTIVE,
- StateChangeReason.SYSTEM_BOOT);
-
- adapterStateListener.register(getExecutor(), callback2);
- verify(callback2).onStateChanged(AdapterStateCallback.STATE_ENABLED_ACTIVE,
- AdapterStateCallback.STATE_CHANGED_REASON_SYSTEM_BOOT);
- }
-}
diff --git a/core/tests/uwbtests/src/android/uwb/RangingManagerTest.java b/core/tests/uwbtests/src/android/uwb/RangingManagerTest.java
deleted file mode 100644
index 24267e4..0000000
--- a/core/tests/uwbtests/src/android/uwb/RangingManagerTest.java
+++ /dev/null
@@ -1,267 +0,0 @@
-/*
- * Copyright 2020 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.uwb;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-
-import android.content.AttributionSource;
-import android.os.PersistableBundle;
-import android.os.RemoteException;
-
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-import androidx.test.filters.SmallTest;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
-
-import java.util.concurrent.Executor;
-
-/**
- * Test of {@link AdapterStateListener}.
- */
-@SmallTest
-@RunWith(AndroidJUnit4.class)
-public class RangingManagerTest {
-
- private static final Executor EXECUTOR = UwbTestUtils.getExecutor();
- private static final PersistableBundle PARAMS = new PersistableBundle();
- private static final @RangingChangeReason int REASON = RangingChangeReason.UNKNOWN;
- private static final int UID = 343453;
- private static final String PACKAGE_NAME = "com.uwb.test";
- private static final AttributionSource ATTRIBUTION_SOURCE =
- new AttributionSource.Builder(UID).setPackageName(PACKAGE_NAME).build();
-
- @Test
- public void testOpenSession_OpenRangingInvoked() throws RemoteException {
- IUwbAdapter adapter = mock(IUwbAdapter.class);
- RangingManager rangingManager = new RangingManager(adapter);
- RangingSession.Callback callback = mock(RangingSession.Callback.class);
- rangingManager.openSession(ATTRIBUTION_SOURCE, PARAMS, EXECUTOR, callback);
- verify(adapter, times(1)).openRanging(
- eq(ATTRIBUTION_SOURCE), any(), any(), any());
- }
-
- @Test
- public void testOnRangingOpened_InvalidSessionHandle() throws RemoteException {
- IUwbAdapter adapter = mock(IUwbAdapter.class);
- RangingManager rangingManager = new RangingManager(adapter);
- RangingSession.Callback callback = mock(RangingSession.Callback.class);
-
- rangingManager.onRangingOpened(new SessionHandle(2));
- verify(callback, times(0)).onOpened(any());
- }
-
- @Test
- public void testOnRangingOpened_MultipleSessionsRegistered() throws RemoteException {
- IUwbAdapter adapter = mock(IUwbAdapter.class);
- RangingSession.Callback callback1 = mock(RangingSession.Callback.class);
- RangingSession.Callback callback2 = mock(RangingSession.Callback.class);
- ArgumentCaptor<SessionHandle> sessionHandleCaptor =
- ArgumentCaptor.forClass(SessionHandle.class);
-
- RangingManager rangingManager = new RangingManager(adapter);
- rangingManager.openSession(ATTRIBUTION_SOURCE, PARAMS, EXECUTOR, callback1);
- verify(adapter, times(1)).openRanging(
- eq(ATTRIBUTION_SOURCE), sessionHandleCaptor.capture(), any(), any());
- SessionHandle sessionHandle1 = sessionHandleCaptor.getValue();
-
- rangingManager.openSession(ATTRIBUTION_SOURCE, PARAMS, EXECUTOR, callback2);
- verify(adapter, times(2)).openRanging(
- eq(ATTRIBUTION_SOURCE), sessionHandleCaptor.capture(), any(), any());
- SessionHandle sessionHandle2 = sessionHandleCaptor.getValue();
-
- rangingManager.onRangingOpened(sessionHandle1);
- verify(callback1, times(1)).onOpened(any());
- verify(callback2, times(0)).onOpened(any());
-
- rangingManager.onRangingOpened(sessionHandle2);
- verify(callback1, times(1)).onOpened(any());
- verify(callback2, times(1)).onOpened(any());
- }
-
- @Test
- public void testCorrectCallbackInvoked() throws RemoteException {
- IUwbAdapter adapter = mock(IUwbAdapter.class);
- RangingManager rangingManager = new RangingManager(adapter);
- RangingSession.Callback callback = mock(RangingSession.Callback.class);
-
- ArgumentCaptor<SessionHandle> sessionHandleCaptor =
- ArgumentCaptor.forClass(SessionHandle.class);
-
- rangingManager.openSession(ATTRIBUTION_SOURCE, PARAMS, EXECUTOR, callback);
- verify(adapter, times(1)).openRanging(
- eq(ATTRIBUTION_SOURCE), sessionHandleCaptor.capture(), any(), any());
- SessionHandle handle = sessionHandleCaptor.getValue();
-
- rangingManager.onRangingOpened(handle);
- verify(callback, times(1)).onOpened(any());
-
- rangingManager.onRangingStarted(handle, PARAMS);
- verify(callback, times(1)).onStarted(eq(PARAMS));
-
- rangingManager.onRangingStartFailed(handle, REASON, PARAMS);
- verify(callback, times(1)).onStartFailed(eq(REASON), eq(PARAMS));
-
- RangingReport report = UwbTestUtils.getRangingReports(1);
- rangingManager.onRangingResult(handle, report);
- verify(callback, times(1)).onReportReceived(eq(report));
-
- rangingManager.onRangingReconfigured(handle, PARAMS);
- verify(callback, times(1)).onReconfigured(eq(PARAMS));
-
- rangingManager.onRangingReconfigureFailed(handle, REASON, PARAMS);
- verify(callback, times(1)).onReconfigureFailed(eq(REASON), eq(PARAMS));
-
- rangingManager.onRangingStopped(handle, REASON, PARAMS);
- verify(callback, times(1)).onStopped(eq(REASON), eq(PARAMS));
-
- rangingManager.onRangingStopFailed(handle, REASON, PARAMS);
- verify(callback, times(1)).onStopFailed(eq(REASON), eq(PARAMS));
-
- rangingManager.onRangingClosed(handle, REASON, PARAMS);
- verify(callback, times(1)).onClosed(eq(REASON), eq(PARAMS));
- }
-
- @Test
- public void testOnRangingClosed_MultipleSessionsRegistered() throws RemoteException {
- IUwbAdapter adapter = mock(IUwbAdapter.class);
- // Verify that if multiple sessions are registered, only the session that is
- // requested to close receives the associated callbacks
- RangingSession.Callback callback1 = mock(RangingSession.Callback.class);
- RangingSession.Callback callback2 = mock(RangingSession.Callback.class);
-
- RangingManager rangingManager = new RangingManager(adapter);
- ArgumentCaptor<SessionHandle> sessionHandleCaptor =
- ArgumentCaptor.forClass(SessionHandle.class);
-
- rangingManager.openSession(ATTRIBUTION_SOURCE, PARAMS, EXECUTOR, callback1);
- verify(adapter, times(1)).openRanging(
- eq(ATTRIBUTION_SOURCE), sessionHandleCaptor.capture(), any(), any());
- SessionHandle sessionHandle1 = sessionHandleCaptor.getValue();
-
- rangingManager.openSession(ATTRIBUTION_SOURCE, PARAMS, EXECUTOR, callback2);
- verify(adapter, times(2)).openRanging(
- eq(ATTRIBUTION_SOURCE), sessionHandleCaptor.capture(), any(), any());
- SessionHandle sessionHandle2 = sessionHandleCaptor.getValue();
-
- rangingManager.onRangingClosed(sessionHandle1, REASON, PARAMS);
- verify(callback1, times(1)).onClosed(anyInt(), any());
- verify(callback2, times(0)).onClosed(anyInt(), any());
-
- rangingManager.onRangingClosed(sessionHandle2, REASON, PARAMS);
- verify(callback1, times(1)).onClosed(anyInt(), any());
- verify(callback2, times(1)).onClosed(anyInt(), any());
- }
-
- @Test
- public void testOnRangingReport_MultipleSessionsRegistered() throws RemoteException {
- IUwbAdapter adapter = mock(IUwbAdapter.class);
- RangingSession.Callback callback1 = mock(RangingSession.Callback.class);
- RangingSession.Callback callback2 = mock(RangingSession.Callback.class);
-
- ArgumentCaptor<SessionHandle> sessionHandleCaptor =
- ArgumentCaptor.forClass(SessionHandle.class);
-
- RangingManager rangingManager = new RangingManager(adapter);
- rangingManager.openSession(ATTRIBUTION_SOURCE, PARAMS, EXECUTOR, callback1);
- verify(adapter, times(1)).openRanging(
- eq(ATTRIBUTION_SOURCE), sessionHandleCaptor.capture(), any(), any());
- SessionHandle sessionHandle1 = sessionHandleCaptor.getValue();
-
- rangingManager.onRangingStarted(sessionHandle1, PARAMS);
- rangingManager.openSession(ATTRIBUTION_SOURCE, PARAMS, EXECUTOR, callback2);
- verify(adapter, times(2)).openRanging(
- eq(ATTRIBUTION_SOURCE), sessionHandleCaptor.capture(), any(), any());
- SessionHandle sessionHandle2 = sessionHandleCaptor.getValue();
- rangingManager.onRangingStarted(sessionHandle2, PARAMS);
-
- rangingManager.onRangingResult(sessionHandle1, UwbTestUtils.getRangingReports(1));
- verify(callback1, times(1)).onReportReceived(any());
- verify(callback2, times(0)).onReportReceived(any());
-
- rangingManager.onRangingResult(sessionHandle2, UwbTestUtils.getRangingReports(1));
- verify(callback1, times(1)).onReportReceived(any());
- verify(callback2, times(1)).onReportReceived(any());
- }
-
- @Test
- public void testReasons() throws RemoteException {
- runReason(RangingChangeReason.LOCAL_API,
- RangingSession.Callback.REASON_LOCAL_REQUEST);
-
- runReason(RangingChangeReason.MAX_SESSIONS_REACHED,
- RangingSession.Callback.REASON_MAX_SESSIONS_REACHED);
-
- runReason(RangingChangeReason.PROTOCOL_SPECIFIC,
- RangingSession.Callback.REASON_PROTOCOL_SPECIFIC_ERROR);
-
- runReason(RangingChangeReason.REMOTE_REQUEST,
- RangingSession.Callback.REASON_REMOTE_REQUEST);
-
- runReason(RangingChangeReason.SYSTEM_POLICY,
- RangingSession.Callback.REASON_SYSTEM_POLICY);
-
- runReason(RangingChangeReason.BAD_PARAMETERS,
- RangingSession.Callback.REASON_BAD_PARAMETERS);
-
- runReason(RangingChangeReason.UNKNOWN,
- RangingSession.Callback.REASON_UNKNOWN);
- }
-
- private void runReason(@RangingChangeReason int reasonIn,
- @RangingSession.Callback.Reason int reasonOut) throws RemoteException {
- IUwbAdapter adapter = mock(IUwbAdapter.class);
- RangingManager rangingManager = new RangingManager(adapter);
- RangingSession.Callback callback = mock(RangingSession.Callback.class);
-
- ArgumentCaptor<SessionHandle> sessionHandleCaptor =
- ArgumentCaptor.forClass(SessionHandle.class);
-
- rangingManager.openSession(ATTRIBUTION_SOURCE, PARAMS, EXECUTOR, callback);
- verify(adapter, times(1)).openRanging(
- eq(ATTRIBUTION_SOURCE), sessionHandleCaptor.capture(), any(), any());
- SessionHandle handle = sessionHandleCaptor.getValue();
-
- rangingManager.onRangingOpenFailed(handle, reasonIn, PARAMS);
- verify(callback, times(1)).onOpenFailed(eq(reasonOut), eq(PARAMS));
-
- // Open a new session
- rangingManager.openSession(ATTRIBUTION_SOURCE, PARAMS, EXECUTOR, callback);
- verify(adapter, times(2)).openRanging(
- eq(ATTRIBUTION_SOURCE), sessionHandleCaptor.capture(), any(), any());
- handle = sessionHandleCaptor.getValue();
- rangingManager.onRangingOpened(handle);
-
- rangingManager.onRangingStartFailed(handle, reasonIn, PARAMS);
- verify(callback, times(1)).onStartFailed(eq(reasonOut), eq(PARAMS));
-
- rangingManager.onRangingReconfigureFailed(handle, reasonIn, PARAMS);
- verify(callback, times(1)).onReconfigureFailed(eq(reasonOut), eq(PARAMS));
-
- rangingManager.onRangingStopFailed(handle, reasonIn, PARAMS);
- verify(callback, times(1)).onStopFailed(eq(reasonOut), eq(PARAMS));
-
- rangingManager.onRangingClosed(handle, reasonIn, PARAMS);
- verify(callback, times(1)).onClosed(eq(reasonOut), eq(PARAMS));
- }
-}
diff --git a/core/tests/uwbtests/src/android/uwb/UwbTestUtils.java b/core/tests/uwbtests/src/android/uwb/UwbTestUtils.java
deleted file mode 100644
index 75c6924..0000000
--- a/core/tests/uwbtests/src/android/uwb/UwbTestUtils.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright 2020 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.uwb;
-
-import android.os.SystemClock;
-
-import java.util.concurrent.Executor;
-
-public class UwbTestUtils {
- private UwbTestUtils() {}
-
- public static AngleMeasurement getAngleMeasurement() {
- return new AngleMeasurement(
- getDoubleInRange(-Math.PI, Math.PI),
- getDoubleInRange(0, Math.PI),
- getDoubleInRange(0, 1));
- }
-
- public static AngleOfArrivalMeasurement getAngleOfArrivalMeasurement() {
- return new AngleOfArrivalMeasurement.Builder(getAngleMeasurement())
- .setAltitude(getAngleMeasurement())
- .build();
- }
-
- public static DistanceMeasurement getDistanceMeasurement() {
- return new DistanceMeasurement.Builder()
- .setMeters(getDoubleInRange(0, 100))
- .setErrorMeters(getDoubleInRange(0, 10))
- .setConfidenceLevel(getDoubleInRange(0, 1))
- .build();
- }
-
- public static RangingMeasurement getRangingMeasurement() {
- return getRangingMeasurement(getUwbAddress(false));
- }
-
- public static RangingMeasurement getRangingMeasurement(UwbAddress address) {
- return new RangingMeasurement.Builder()
- .setDistanceMeasurement(getDistanceMeasurement())
- .setAngleOfArrivalMeasurement(getAngleOfArrivalMeasurement())
- .setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos())
- .setRemoteDeviceAddress(address != null ? address : getUwbAddress(false))
- .setStatus(RangingMeasurement.RANGING_STATUS_SUCCESS)
- .build();
- }
-
- public static RangingReport getRangingReports(int numMeasurements) {
- RangingReport.Builder builder = new RangingReport.Builder();
- for (int i = 0; i < numMeasurements; i++) {
- builder.addMeasurement(getRangingMeasurement());
- }
- return builder.build();
- }
-
- private static double getDoubleInRange(double min, double max) {
- return min + (max - min) * Math.random();
- }
-
- public static UwbAddress getUwbAddress(boolean isShortAddress) {
- byte[] addressBytes = new byte[isShortAddress ? UwbAddress.SHORT_ADDRESS_BYTE_LENGTH :
- UwbAddress.EXTENDED_ADDRESS_BYTE_LENGTH];
- for (int i = 0; i < addressBytes.length; i++) {
- addressBytes[i] = (byte) getDoubleInRange(1, 255);
- }
- return UwbAddress.fromBytes(addressBytes);
- }
-
- public static Executor getExecutor() {
- return new Executor() {
- @Override
- public void execute(Runnable command) {
- command.run();
- }
- };
- }
-}