uwb(service): Remove stack redundancies (2/2)
1. Rename IUwbAdapter2 -> IUwbAdapter
2. Rename IUwbRangingCallbacks2 -> IUwbRangingCallbacks
3. Move ranging callback permission check to
UwbSessionNotificationManager.
4. Remove all state from UwbServiceImpl.
Bug: b/196225233
Test: Manual testing.
Change-Id: Ie2ae471147d08096a3fe1fb0ea915ab39c838528
diff --git a/framework/java/android/uwb/AdapterStateListener.java b/framework/java/android/uwb/AdapterStateListener.java
index 22bb765..7e82cc6 100644
--- a/framework/java/android/uwb/AdapterStateListener.java
+++ b/framework/java/android/uwb/AdapterStateListener.java
@@ -34,7 +34,7 @@
public class AdapterStateListener extends IUwbAdapterStateCallbacks.Stub {
private static final String TAG = "Uwb.StateListener";
- private final IUwbAdapter2 mAdapter;
+ private final IUwbAdapter mAdapter;
private boolean mIsRegistered = false;
private final Map<AdapterStateCallback, Executor> mCallbackMap = new HashMap<>();
@@ -44,7 +44,7 @@
@State
private int mAdapterState = AdapterStateCallback.STATE_DISABLED;
- public AdapterStateListener(@NonNull IUwbAdapter2 adapter) {
+ public AdapterStateListener(@NonNull IUwbAdapter adapter) {
mAdapter = adapter;
}
diff --git a/framework/java/android/uwb/IUwbAdapter.aidl b/framework/java/android/uwb/IUwbAdapter.aidl
index bb0abb0..c1ddc9a 100644
--- a/framework/java/android/uwb/IUwbAdapter.aidl
+++ b/framework/java/android/uwb/IUwbAdapter.aidl
@@ -19,12 +19,15 @@
import android.content.AttributionSource;
import android.os.PersistableBundle;
import android.uwb.IUwbAdapterStateCallbacks;
+import android.uwb.IUwbAdfProvisionStateCallbacks;
import android.uwb.IUwbRangingCallbacks;
import android.uwb.SessionHandle;
+import android.uwb.UwbAddress;
+import android.uwb.IUwbVendorUciCallback;
/**
* @hide
- * TODO(b/196225233): Remove this when qorvo stack is integrated.
+ * TODO(b/211025367): Remove all the duplicate javadocs here.
*/
interface IUwbAdapter {
/*
@@ -38,7 +41,26 @@
*/
void registerAdapterStateCallbacks(in IUwbAdapterStateCallbacks adapterStateCallbacks);
- /*
+ /*
+ * Register the callbacks used to notify the framework of events and data
+ *
+ * The provided callback's IUwbUciVendorCallback#onVendorNotificationReceived
+ * function must be called immediately following vendorNotification received
+ *
+ * @param callbacks callback to provide Notification data updates to the framework
+ */
+ void registerVendorExtensionCallback(in IUwbVendorUciCallback callbacks);
+
+ /*
+ * 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 unregisterVendorExtensionCallback(in IUwbVendorUciCallback callbacks);
+
+ /*
* Unregister the callbacks used to notify the framework of events and data
*
* Calling this function with an unregistered callback is a no-op
@@ -50,16 +72,20 @@
/**
* Get the accuracy of the ranging timestamps
*
+ * @param chipId identifier of UWB chip for multi-HAL devices
+ *
* @return accuracy of the ranging timestamps in nanoseconds
*/
- long getTimestampResolutionNanos();
+ long getTimestampResolutionNanos(in String chipId);
/**
* Provides the capabilities and features of the device
*
+ * @param chipId identifier of UWB chip for multi-HAL devices
+ *
* @return specification specific capabilities and features of the device
*/
- PersistableBundle getSpecificationInfo();
+ PersistableBundle getSpecificationInfo(in String chipId);
/**
* Request to open a new ranging session
@@ -83,11 +109,13 @@
* @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
+ * @param chipId identifier of UWB chip for multi-HAL devices
*/
void openRanging(in AttributionSource attributionSource,
in SessionHandle sessionHandle,
in IUwbRangingCallbacks rangingCallbacks,
- in PersistableBundle parameters);
+ in PersistableBundle parameters,
+ in String chipId);
/**
* Request to start ranging
@@ -149,30 +177,170 @@
*/
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);
+ /**
+ * Add a new controlee to an ongoing session.
+ * <p>This call may be made when the session is open.
+ *
+ * <p>On successfully adding a new controlee to the session
+ * {@link RangingSession.Callback#onControleeAdded(PersistableBundle)} is invoked.
+ *
+ * <p>On failure to add a new controlee to the session,
+ * {@link RangingSession.Callback#onControleeAddFailed(int, PersistableBundle)}is invoked.
+ *
+ * @param sessionHandle the session handle to close ranging for
+ * @param params the parameters for the new controlee.
+ */
+ void addControlee(in SessionHandle sessionHandle, in PersistableBundle params);
- /**
- * 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();
+ /**
+ * Remove an existing controlee from an ongoing session.
+ * <p>This call may be made when the session is open.
+ *
+ * <p>On successfully removing an existing controlee from the session
+ * {@link RangingSession.Callback#onControleeRemoved(PersistableBundle)} is invoked.
+ *
+ * <p>On failure to remove an existing controlee from the session,
+ * {@link RangingSession.Callback#onControleeRemoveFailed(int, PersistableBundle)}is invoked.
+ *
+ * @param sessionHandle the session handle to close ranging for
+ * @param params the parameters for the existing controlee.
+ */
+ void removeControlee(in SessionHandle sessionHandle, in PersistableBundle params);
+
+ /**
+ * Suspends an ongoing ranging session.
+ *
+ * <p>A session that has been pauseed may be resumed by calling
+ * {@link RangingSession#resume(PersistableBundle)} without the need to open a new session.
+ *
+ * <p>Suspending a {@link RangingSession} is useful when the lower layers should skip a few
+ * ranging rounds for a session without stopping it.
+ *
+ * <p>If the {@link RangingSession} is no longer needed, use {@link RangingSession#stop()} or
+ * {@link RangingSession#close()} to completely close the session.
+ *
+ * <p>On successfully pauseing the session,
+ * {@link RangingSession.Callback#onPaused(PersistableBundle)} is invoked.
+ *
+ * <p>On failure to pause the session,
+ * {@link RangingSession.Callback#onPauseFailed(int, PersistableBundle)} is invoked.
+ *
+ * @param sessionHandle the session handle to close ranging for
+ * @param params protocol specific parameters for pauseing the session.
+ */
+ void pause(in SessionHandle sessionHandle, in PersistableBundle params);
+
+ /**
+ * Resumes a pauseed ranging session.
+ *
+ * <p>A session that has been previously pauseed using
+ * {@link RangingSession#pause(PersistableBundle)} can be resumed by calling
+ * {@link RangingSession#resume(PersistableBundle)}.
+ *
+ * <p>On successfully resuming the session,
+ * {@link RangingSession.Callback#onResumed(PersistableBundle)} is invoked.
+ *
+ * <p>On failure to pause the session,
+ * {@link RangingSession.Callback#onResumeFailed(int, PersistableBundle)} is invoked.
+ *
+ * @param sessionHandle the session handle to close ranging for
+ * @param params protocol specific parameters the resuming the session.
+ */
+ void resume(in SessionHandle sessionHandle, in PersistableBundle params);
+
+ /**
+ * Send data to a remote device which is part of this ongoing session.
+ * The data is sent by piggybacking the provided data over RRM (initiator -> responder) or
+ * RIM (responder -> initiator).
+ * <p>This is only functional on a FIRA 2.0 compliant device.
+ *
+ * <p>On successfully sending the data,
+ * {@link RangingSession.Callback#onDataSent(UwbAddress, PersistableBundle)} is invoked.
+ *
+ * <p>On failure to send the data,
+ * {@link RangingSession.Callback#onDataSendFailed(UwbAddress, int, PersistableBundle)} is
+ * invoked.
+ *
+ * @param sessionHandle the session handle to close ranging for
+ * @param remoteDeviceAddress remote device's address.
+ * @param params protocol specific parameters the sending the data.
+ * @param data Raw data to be sent.
+ */
+ void sendData(in SessionHandle sessionHandle, in UwbAddress remoteDeviceAddress,
+ in PersistableBundle params, in byte[] data);
+
+ /**
+ * 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();
+
+ /**
+ * Returns a list of UWB chip infos in a {@link PersistableBundle}.
+ *
+ * Callers can invoke methods on a specific UWB chip by passing its {@code chipId} to the
+ * method, which can be determined by calling:
+ * <pre>
+ * List<PersistableBundle> chipInfos = getChipInfos();
+ * for (PersistableBundle chipInfo : chipInfos) {
+ * String chipId = ChipInfoParams.fromBundle(chipInfo).getChipId();
+ * }
+ * </pre>
+ *
+ * @return list of {@link PersistableBundle} containing info about UWB chips for a multi-HAL
+ * system, or a list of info for a single chip for a single HAL system.
+ */
+ List<PersistableBundle> getChipInfos();
+
+ List<String> getChipIds();
+
+ /**
+ * Returns the default UWB chip identifier.
+ *
+ * If callers do not pass a specific {@code chipId} to UWB methods, then the method will be
+ * invoked on the default chip, which is determined at system initialization from a configuration
+ * file.
+ *
+ * @return default UWB chip identifier for a multi-HAL system, or the identifier of the only UWB
+ * chip in a single HAL system.
+ */
+ String getDefaultChipId();
+
+ PersistableBundle addServiceProfile(in PersistableBundle parameters);
+
+ int removeServiceProfile(in PersistableBundle parameters);
+
+ PersistableBundle getAllServiceProfiles();
+
+ PersistableBundle getAdfProvisioningAuthorities(in PersistableBundle parameters);
+
+ PersistableBundle getAdfCertificateAndInfo(in PersistableBundle parameters);
+
+ void provisionProfileAdfByScript(in PersistableBundle serviceProfileBundle,
+ in IUwbAdfProvisionStateCallbacks callback);
+
+ int removeProfileAdf(in PersistableBundle serviceProfileBundle);
+
+ int sendVendorUciMessage(int gid, int oid, in byte[] payload);
/**
* The maximum allowed time to open a ranging session.
diff --git a/framework/java/android/uwb/IUwbAdapter2.aidl b/framework/java/android/uwb/IUwbAdapter2.aidl
deleted file mode 100644
index edf3e5c..0000000
--- a/framework/java/android/uwb/IUwbAdapter2.aidl
+++ /dev/null
@@ -1,148 +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.IUwbAdfProvisionStateCallbacks;
-import android.uwb.IUwbRangingCallbacks2;
-import android.uwb.SessionHandle;
-import android.uwb.UwbAddress;
-import android.uwb.IUwbVendorUciCallback;
-
-/**
- * @hide
- * TODO(b/196225233): Rename this to IUwbAdapter when qorvo stack is integrated.
- * Temporary AIDL interface name for the interface between UwbManager & UwbService.
- * The existing IUwbAdapter interface is kept behind for providing backwards
- * compatibility with the old UWB architecture.
- */
-interface IUwbAdapter2 {
- void registerAdapterStateCallbacks(in IUwbAdapterStateCallbacks adapterStateCallbacks);
-
- void unregisterAdapterStateCallbacks(in IUwbAdapterStateCallbacks callbacks);
-
- /*
- * Register the callbacks used to notify the framework of events and data
- *
- * The provided callback's IUwbUciVendorCallback#onVendorNotificationReceived
- * function must be called immediately following vendorNotification received
- *
- * @param callbacks callback to provide Notification data updates to the framework
- */
- void registerVendorExtensionCallback(in IUwbVendorUciCallback callbacks);
-
- /*
- * 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 unregisterVendorExtensionCallback(in IUwbVendorUciCallback callbacks);
-
-
- long getTimestampResolutionNanos(in String chipId);
-
- PersistableBundle getSpecificationInfo(in String chipId);
-
- void openRanging(in AttributionSource attributionSource,
- in SessionHandle sessionHandle,
- in IUwbRangingCallbacks2 rangingCallbacks,
- in PersistableBundle parameters,
- in String chipId);
-
- void startRanging(in SessionHandle sessionHandle,
- in PersistableBundle parameters);
-
- void reconfigureRanging(in SessionHandle sessionHandle,
- in PersistableBundle parameters);
-
- void stopRanging(in SessionHandle sessionHandle);
-
- void closeRanging(in SessionHandle sessionHandle);
-
- void addControlee(in SessionHandle sessionHandle, in PersistableBundle params);
-
- void removeControlee(in SessionHandle sessionHandle, in PersistableBundle params);
-
- void pause(in SessionHandle sessionHandle, in PersistableBundle params);
-
- void resume(in SessionHandle sessionHandle, in PersistableBundle params);
-
- void sendData(in SessionHandle sessionHandle, in UwbAddress remoteDeviceAddress,
- in PersistableBundle params, in byte[] data);
-
- void setEnabled(boolean enabled);
-
- int getAdapterState();
-
- /**
- * Returns a list of UWB chip infos in a {@link PersistableBundle}.
- *
- * Callers can invoke methods on a specific UWB chip by passing its {@code chipId} to the
- * method, which can be determined by calling:
- * <pre>
- * List<PersistableBundle> chipInfos = getChipInfos();
- * for (PersistableBundle chipInfo : chipInfos) {
- * String chipId = ChipInfoParams.fromBundle(chipInfo).getChipId();
- * }
- * </pre>
- *
- * @return list of {@link PersistableBundle} containing info about UWB chips for a multi-HAL
- * system, or a list of info for a single chip for a single HAL system.
- */
- List<PersistableBundle> getChipInfos();
-
- List<String> getChipIds();
-
- String getDefaultChipId();
-
- PersistableBundle addServiceProfile(in PersistableBundle parameters);
-
- int removeServiceProfile(in PersistableBundle parameters);
-
- PersistableBundle getAllServiceProfiles();
-
- PersistableBundle getAdfProvisioningAuthorities(in PersistableBundle parameters);
-
- PersistableBundle getAdfCertificateAndInfo(in PersistableBundle parameters);
-
- void provisionProfileAdfByScript(in PersistableBundle serviceProfileBundle,
- in IUwbAdfProvisionStateCallbacks callback);
-
- int removeProfileAdf(in PersistableBundle serviceProfileBundle);
-
- int sendVendorUciMessage(int gid, int oid, in byte[] payload);
-
- /**
- * 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/framework/java/android/uwb/IUwbRangingCallbacks.aidl b/framework/java/android/uwb/IUwbRangingCallbacks.aidl
index 4ac67aa..a961718 100644
--- a/framework/java/android/uwb/IUwbRangingCallbacks.aidl
+++ b/framework/java/android/uwb/IUwbRangingCallbacks.aidl
@@ -20,10 +20,11 @@
import android.uwb.RangingChangeReason;
import android.uwb.RangingReport;
import android.uwb.SessionHandle;
+import android.uwb.UwbAddress;
/**
* @hide
- * TODO(b/196225233): Remove this when qorvo stack is integrated.
+ * TODO(b/211025367): Remove all the duplicate javadocs here.
*/
oneway interface IUwbRangingCallbacks {
/**
@@ -134,4 +135,127 @@
* @param result the ranging report
*/
void onRangingResult(in SessionHandle sessionHandle, in RangingReport result);
+
+ /**
+ * Invoked when a new controlee is added to an ongoing one-to many session.
+ *
+ * @param sessionHandle the session the callback is being invoked for
+ * @param parameters protocol specific parameters for the new controlee.
+ */
+ void onControleeAdded(in SessionHandle sessionHandle, in PersistableBundle parameters);
+
+ /**
+ * Invoked when a new controlee is added to an ongoing one-to many session.
+ *
+ * @param sessionHandle the session the callback is being invoked for
+ * @param reason reason for the controlee add failure.
+ * @param parameters protocol specific parameters related to the failure.
+ */
+ void onControleeAddFailed(in SessionHandle sessionHandle,
+ RangingChangeReason reason, in PersistableBundle parameters);
+
+ /**
+ * Invoked when an existing controlee is removed from an ongoing one-to many session.
+ *
+ * @param sessionHandle the session the callback is being invoked for
+ * @param parameters protocol specific parameters for the existing controlee.
+ */
+ void onControleeRemoved(in SessionHandle sessionHandle, in PersistableBundle parameters);
+
+ /**
+ * Invoked when a new controlee is added to an ongoing one-to many session.
+ *
+ * @param sessionHandle the session the callback is being invoked for
+ * @param reason reason for the controlee remove failure.
+ * @param parameters protocol specific parameters related to the failure.
+ */
+ void onControleeRemoveFailed(in SessionHandle sessionHandle,
+ RangingChangeReason reason, in PersistableBundle parameters);
+
+ /**
+ * Invoked when an ongoing session is successfully suspended.
+ *
+ * @param sessionHandle the session the callback is being invoked for
+ * @param parameters protocol specific parameters sent for suspension.
+ */
+ void onRangingPaused(in SessionHandle sessionHandle, in PersistableBundle parameters);
+
+ /**
+ * Invoked when an ongoing session suspension fails.
+ *
+ * @param sessionHandle the session the callback is being invoked for
+ * @param reason reason for the suspension failure.
+ * @param parameters protocol specific parameters for suspension failure.
+ */
+ void onRangingPauseFailed(in SessionHandle sessionHandle,
+ RangingChangeReason reason, in PersistableBundle parameters);
+
+ /**
+ * Invoked when a suspended session is successfully resumed.
+ *
+ * @param parameters protocol specific parameters sent for suspension.
+ */
+ void onRangingResumed(in SessionHandle sessionHandle, in PersistableBundle parameters);
+
+ /**
+ * Invoked when a suspended session resumption fails.
+ *
+ * @param sessionHandle the session the callback is being invoked for
+ * @param reason reason for the resumption failure.
+ * @param parameters protocol specific parameters for resumption failure.
+ */
+ void onRangingResumeFailed(in SessionHandle sessionHandle,
+ RangingChangeReason reason, in PersistableBundle parameters);
+
+ /**
+ * Invoked when data is successfully sent via {@link RangingSession#sendData(UwbAddress,
+ * PersistableBundle, byte[])}.
+ *
+ * @param sessionHandle the session the callback is being invoked for
+ * @param remoteDeviceAddress remote device's address.
+ * @param parameters protocol specific parameters sent for suspension.
+ */
+ void onDataSent(in SessionHandle sessionHandle, in UwbAddress remoteDeviceAddress,
+ in PersistableBundle parameters);
+
+ /**
+ * Invoked when data send to a remote device via {@link RangingSession#sendData(UwbAddress,
+ * PersistableBundle, byte[])} fails.
+ *
+ * @param sessionHandle the session the callback is being invoked for
+ * @param remoteDeviceAddress remote device's address.
+ * @param reason reason for the resumption failure.
+ * @param parameters protocol specific parameters for resumption failure.
+ */
+ void onDataSendFailed(in SessionHandle sessionHandle, in UwbAddress remoteDeviceAddress,
+ RangingChangeReason reason, in PersistableBundle parameters);
+
+ /**
+ * Invoked when data is received successfully from a remote device.
+ * The data is received piggybacked over RRM (initiator -> responder) or
+ * RIM (responder -> initiator).
+ * <p> This is only functional on a FIRA 2.0 compliant device.
+ *
+ * @param sessionHandle the session the callback is being invoked for
+ * @param remoteDeviceAddress remote device's address.
+ * @param data Raw data received.
+ * @param parameters protocol specific parameters for the received data.
+ */
+ void onDataReceived(in SessionHandle sessionHandle, in UwbAddress remoteDeviceAddress,
+ in PersistableBundle parameters, in byte[] data);
+
+ /**
+ * Invoked when data receive from a remote device fails.
+ *
+ * @param sessionHandle the session the callback is being invoked for
+ * @param remoteDeviceAddress remote device's address.
+ * @param reason reason for the resumption failure.
+ * @param parameters protocol specific parameters for resumption failure.
+ */
+ void onDataReceiveFailed(in SessionHandle sessionHandle, in UwbAddress remoteDeviceAddress,
+ RangingChangeReason reason, in PersistableBundle parameters);
+
+ void onServiceDiscovered(in SessionHandle sessionHandle, in PersistableBundle parameters);
+
+ void onServiceConnected(in SessionHandle sessionHandle, in PersistableBundle parameters);
}
diff --git a/framework/java/android/uwb/IUwbRangingCallbacks2.aidl b/framework/java/android/uwb/IUwbRangingCallbacks2.aidl
deleted file mode 100644
index a1b1eea..0000000
--- a/framework/java/android/uwb/IUwbRangingCallbacks2.aidl
+++ /dev/null
@@ -1,102 +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;
-import android.uwb.UwbAddress;
-
-/**
- * @hide
- * TODO(b/196225233): Rename this to IUwbRangingCallbacks when qorvo stack is integrated.
- * Temporary AIDL interface name for the interface between UwbManager & UwbService.
- * The existing IUwbAdapter interface is kept behind for providing backwards
- * compatibility with the old UWB architecture.
- */
-oneway interface IUwbRangingCallbacks2 {
- void onRangingOpened(in SessionHandle sessionHandle);
-
- void onRangingOpenFailed(in SessionHandle sessionHandle,
- RangingChangeReason reason,
- in PersistableBundle parameters);
-
- void onRangingStarted(in SessionHandle sessionHandle,
- in PersistableBundle parameters);
-
- void onRangingStartFailed(in SessionHandle sessionHandle,
- RangingChangeReason reason,
- in PersistableBundle parameters);
-
- void onRangingReconfigured(in SessionHandle sessionHandle,
- in PersistableBundle parameters);
-
- void onRangingReconfigureFailed(in SessionHandle sessionHandle,
- RangingChangeReason reason,
- in PersistableBundle parameters);
-
- void onRangingStopped(in SessionHandle sessionHandle,
- RangingChangeReason reason,
- in PersistableBundle parameters);
-
- void onRangingStopFailed(in SessionHandle sessionHandle,
- RangingChangeReason reason,
- in PersistableBundle parameters);
-
- void onRangingClosed(in SessionHandle sessionHandle,
- RangingChangeReason reason,
- in PersistableBundle parameters);
-
- void onRangingResult(in SessionHandle sessionHandle, in RangingReport result);
-
- void onControleeAdded(in SessionHandle sessionHandle, in PersistableBundle parameters);
-
- void onControleeAddFailed(in SessionHandle sessionHandle,
- RangingChangeReason reason, in PersistableBundle parameters);
-
- void onControleeRemoved(in SessionHandle sessionHandle, in PersistableBundle parameters);
-
- void onControleeRemoveFailed(in SessionHandle sessionHandle,
- RangingChangeReason reason, in PersistableBundle parameters);
-
- void onRangingPaused(in SessionHandle sessionHandle, in PersistableBundle parameters);
-
- void onRangingPauseFailed(in SessionHandle sessionHandle,
- RangingChangeReason reason, in PersistableBundle parameters);
-
- void onRangingResumed(in SessionHandle sessionHandle, in PersistableBundle parameters);
-
- void onRangingResumeFailed(in SessionHandle sessionHandle,
- RangingChangeReason reason, in PersistableBundle parameters);
-
- void onDataSent(in SessionHandle sessionHandle, in UwbAddress remoteDeviceAddress,
- in PersistableBundle parameters);
-
- void onDataSendFailed(in SessionHandle sessionHandle, in UwbAddress remoteDeviceAddress,
- RangingChangeReason reason, in PersistableBundle parameters);
-
- void onDataReceived(in SessionHandle sessionHandle, in UwbAddress remoteDeviceAddress,
- in PersistableBundle parameters, in byte[] data);
-
- void onDataReceiveFailed(in SessionHandle sessionHandle, in UwbAddress remoteDeviceAddress,
- RangingChangeReason reason, in PersistableBundle parameters);
-
- void onServiceDiscovered(in SessionHandle sessionHandle, in PersistableBundle parameters);
-
- void onServiceConnected(in SessionHandle sessionHandle, in PersistableBundle parameters);
-}
diff --git a/framework/java/android/uwb/RangingManager.java b/framework/java/android/uwb/RangingManager.java
index b2a699d..df3b4c2 100644
--- a/framework/java/android/uwb/RangingManager.java
+++ b/framework/java/android/uwb/RangingManager.java
@@ -31,14 +31,14 @@
/**
* @hide
*/
-public class RangingManager extends android.uwb.IUwbRangingCallbacks2.Stub {
+public class RangingManager extends android.uwb.IUwbRangingCallbacks.Stub {
private static final String TAG = "Uwb.RangingManager";
- private final IUwbAdapter2 mAdapter;
+ private final IUwbAdapter mAdapter;
private final Hashtable<SessionHandle, RangingSession> mRangingSessionTable = new Hashtable<>();
private int mNextSessionId = 1;
- public RangingManager(IUwbAdapter2 adapter) {
+ public RangingManager(IUwbAdapter adapter) {
mAdapter = adapter;
}
diff --git a/framework/java/android/uwb/RangingSession.java b/framework/java/android/uwb/RangingSession.java
index 656069c..7cf007c 100644
--- a/framework/java/android/uwb/RangingSession.java
+++ b/framework/java/android/uwb/RangingSession.java
@@ -49,7 +49,7 @@
public final class RangingSession implements AutoCloseable {
private static final String TAG = "Uwb.RangingSession";
private final SessionHandle mSessionHandle;
- private final IUwbAdapter2 mAdapter;
+ private final IUwbAdapter mAdapter;
private final Executor mExecutor;
private final Callback mCallback;
private final String mChipId;
@@ -422,7 +422,7 @@
/**
* @hide
*/
- public RangingSession(Executor executor, Callback callback, IUwbAdapter2 adapter,
+ public RangingSession(Executor executor, Callback callback, IUwbAdapter adapter,
SessionHandle sessionHandle) {
this(executor, callback, adapter, sessionHandle, /* chipId= */ null);
}
@@ -430,7 +430,7 @@
/**
* @hide
*/
- public RangingSession(Executor executor, Callback callback, IUwbAdapter2 adapter,
+ public RangingSession(Executor executor, Callback callback, IUwbAdapter adapter,
SessionHandle sessionHandle, String chipId) {
mState = State.INIT;
mExecutor = executor;
diff --git a/framework/java/android/uwb/UwbFrameworkInitializer.java b/framework/java/android/uwb/UwbFrameworkInitializer.java
index 09d6bc3..f498034 100644
--- a/framework/java/android/uwb/UwbFrameworkInitializer.java
+++ b/framework/java/android/uwb/UwbFrameworkInitializer.java
@@ -40,7 +40,7 @@
Context.UWB_SERVICE,
UwbManager.class,
(context, serviceBinder) -> {
- IUwbAdapter2 adapter = IUwbAdapter2.Stub.asInterface(serviceBinder);
+ IUwbAdapter adapter = IUwbAdapter.Stub.asInterface(serviceBinder);
return new UwbManager(context, adapter);
}
);
diff --git a/framework/java/android/uwb/UwbManager.java b/framework/java/android/uwb/UwbManager.java
index ac77dd9..fee2dbb 100644
--- a/framework/java/android/uwb/UwbManager.java
+++ b/framework/java/android/uwb/UwbManager.java
@@ -61,7 +61,7 @@
private static final String TAG = "UwbManager";
private final Context mContext;
- private final IUwbAdapter2 mUwbAdapter;
+ private final IUwbAdapter mUwbAdapter;
private final AdapterStateListener mAdapterStateListener;
private final RangingManager mRangingManager;
private final UwbVendorUciCallbackListener mUwbVendorUciCallbackListener;
@@ -317,10 +317,10 @@
* 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.IUwbAdapter2}
+ * @param adapter an instance of an {@link android.uwb.IUwbAdapter}
* @hide
*/
- public UwbManager(@NonNull Context ctx, @NonNull IUwbAdapter2 adapter) {
+ public UwbManager(@NonNull Context ctx, @NonNull IUwbAdapter adapter) {
mContext = ctx;
mUwbAdapter = adapter;
mAdapterStateListener = new AdapterStateListener(adapter);
diff --git a/framework/java/android/uwb/UwbVendorUciCallbackListener.java b/framework/java/android/uwb/UwbVendorUciCallbackListener.java
index f07bf67..3b1f699 100644
--- a/framework/java/android/uwb/UwbVendorUciCallbackListener.java
+++ b/framework/java/android/uwb/UwbVendorUciCallbackListener.java
@@ -30,11 +30,11 @@
*/
public final class UwbVendorUciCallbackListener extends IUwbVendorUciCallback.Stub{
private static final String TAG = "Uwb.UwbVendorUciCallbacks";
- private final IUwbAdapter2 mAdapter;
+ private final IUwbAdapter mAdapter;
private boolean mIsRegistered = false;
private final Map<UwbVendorUciCallback, Executor> mCallbackMap = new HashMap<>();
- public UwbVendorUciCallbackListener(@NonNull IUwbAdapter2 adapter) {
+ public UwbVendorUciCallbackListener(@NonNull IUwbAdapter adapter) {
mAdapter = adapter;
}
diff --git a/framework/tests/src/android/uwb/AdapterStateListenerTest.java b/framework/tests/src/android/uwb/AdapterStateListenerTest.java
index 9a7ad3c..4cad535 100644
--- a/framework/tests/src/android/uwb/AdapterStateListenerTest.java
+++ b/framework/tests/src/android/uwb/AdapterStateListenerTest.java
@@ -46,7 +46,7 @@
@RunWith(AndroidJUnit4.class)
public class AdapterStateListenerTest {
- IUwbAdapter2 mUwbAdapter = mock(IUwbAdapter2.class);
+ IUwbAdapter mUwbAdapter = mock(IUwbAdapter.class);
Answer mRegisterSuccessAnswer = new Answer() {
public Object answer(InvocationOnMock invocation) {
diff --git a/framework/tests/src/android/uwb/RangingManagerTest.java b/framework/tests/src/android/uwb/RangingManagerTest.java
index bf63913..466f85d 100644
--- a/framework/tests/src/android/uwb/RangingManagerTest.java
+++ b/framework/tests/src/android/uwb/RangingManagerTest.java
@@ -62,7 +62,7 @@
@Test
public void testOpenSession_OpenRangingInvoked() throws RemoteException {
- IUwbAdapter2 adapter = mock(IUwbAdapter2.class);
+ IUwbAdapter adapter = mock(IUwbAdapter.class);
RangingManager rangingManager = new RangingManager(adapter);
RangingSession.Callback callback = mock(RangingSession.Callback.class);
rangingManager.openSession(
@@ -73,7 +73,7 @@
@Test
public void testOpenSession_validChipId_OpenRangingInvoked() throws RemoteException {
- IUwbAdapter2 adapter = mock(IUwbAdapter2.class);
+ IUwbAdapter adapter = mock(IUwbAdapter.class);
when(adapter.getChipIds()).thenReturn(List.of(VALID_CHIP_ID));
RangingManager rangingManager = new RangingManager(adapter);
RangingSession.Callback callback = mock(RangingSession.Callback.class);
@@ -84,7 +84,7 @@
@Test
public void testOpenSession_validChipId_RuntimeException() throws RemoteException {
- IUwbAdapter2 adapter = mock(IUwbAdapter2.class);
+ IUwbAdapter adapter = mock(IUwbAdapter.class);
doThrow(new RemoteException())
.when(adapter)
.openRanging(eq(ATTRIBUTION_SOURCE), any(), any(), any(), eq(VALID_CHIP_ID));
@@ -101,7 +101,7 @@
@Test
public void testOpenSession_invalidChipId_IllegalArgumentException() throws RemoteException {
String invalidChipId = "invalidChipId";
- IUwbAdapter2 adapter = mock(IUwbAdapter2.class);
+ IUwbAdapter adapter = mock(IUwbAdapter.class);
Mockito.when(adapter.getChipIds()).thenReturn(List.of(VALID_CHIP_ID));
RangingManager rangingManager = new RangingManager(adapter);
RangingSession.Callback callback = mock(RangingSession.Callback.class);
@@ -116,7 +116,7 @@
@Test
public void testOnRangingOpened_InvalidSessionHandle() throws RemoteException {
- IUwbAdapter2 adapter = mock(IUwbAdapter2.class);
+ IUwbAdapter adapter = mock(IUwbAdapter.class);
RangingManager rangingManager = new RangingManager(adapter);
RangingSession.Callback callback = mock(RangingSession.Callback.class);
@@ -126,7 +126,7 @@
@Test
public void testOnRangingOpened_MultipleSessionsRegistered() throws RemoteException {
- IUwbAdapter2 adapter = mock(IUwbAdapter2.class);
+ IUwbAdapter adapter = mock(IUwbAdapter.class);
RangingSession.Callback callback1 = mock(RangingSession.Callback.class);
RangingSession.Callback callback2 = mock(RangingSession.Callback.class);
ArgumentCaptor<SessionHandle> sessionHandleCaptor =
@@ -166,7 +166,7 @@
@Test
public void testCorrectCallbackInvoked() throws RemoteException {
- IUwbAdapter2 adapter = mock(IUwbAdapter2.class);
+ IUwbAdapter adapter = mock(IUwbAdapter.class);
RangingManager rangingManager = new RangingManager(adapter);
RangingSession.Callback callback = mock(RangingSession.Callback.class);
@@ -257,7 +257,7 @@
@Test
public void testNoCallbackInvoked_sessionClosed() throws RemoteException {
- IUwbAdapter2 adapter = mock(IUwbAdapter2.class);
+ IUwbAdapter adapter = mock(IUwbAdapter.class);
RangingManager rangingManager = new RangingManager(adapter);
RangingSession.Callback callback = mock(RangingSession.Callback.class);
@@ -350,7 +350,7 @@
@Test
public void testOnRangingClosed_MultipleSessionsRegistered() throws RemoteException {
- IUwbAdapter2 adapter = mock(IUwbAdapter2.class);
+ 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);
@@ -393,7 +393,7 @@
@Test
public void testOnRangingReport_MultipleSessionsRegistered() throws RemoteException {
- IUwbAdapter2 adapter = mock(IUwbAdapter2.class);
+ IUwbAdapter adapter = mock(IUwbAdapter.class);
RangingSession.Callback callback1 = mock(RangingSession.Callback.class);
RangingSession.Callback callback2 = mock(RangingSession.Callback.class);
@@ -460,7 +460,7 @@
private void runReason(
@RangingChangeReason int reasonIn, @RangingSession.Callback.Reason int reasonOut)
throws RemoteException {
- IUwbAdapter2 adapter = mock(IUwbAdapter2.class);
+ IUwbAdapter adapter = mock(IUwbAdapter.class);
RangingManager rangingManager = new RangingManager(adapter);
RangingSession.Callback callback = mock(RangingSession.Callback.class);
diff --git a/framework/tests/src/android/uwb/UwbManagerTest.java b/framework/tests/src/android/uwb/UwbManagerTest.java
index 7d82233..38fccca 100644
--- a/framework/tests/src/android/uwb/UwbManagerTest.java
+++ b/framework/tests/src/android/uwb/UwbManagerTest.java
@@ -56,7 +56,7 @@
public class UwbManagerTest {
@Mock private Context mContext;
- @Mock private IUwbAdapter2 mIUwbAdapter;
+ @Mock private IUwbAdapter mIUwbAdapter;
@Mock private AdapterStateCallback mAdapterStateCallback;
@Mock private AdapterStateCallback mAdapterStateCallback2;
@Mock private UwbVendorUciCallback mUwbVendorUciCallback;
diff --git a/framework/tests/src/android/uwb/UwbVendorUciCallbackListenerTest.java b/framework/tests/src/android/uwb/UwbVendorUciCallbackListenerTest.java
index 0eb1b5d..e94f025 100644
--- a/framework/tests/src/android/uwb/UwbVendorUciCallbackListenerTest.java
+++ b/framework/tests/src/android/uwb/UwbVendorUciCallbackListenerTest.java
@@ -50,7 +50,7 @@
@RunWith(AndroidJUnit4.class)
public class UwbVendorUciCallbackListenerTest {
- @Mock private IUwbAdapter2 mIUwbAdapter;
+ @Mock private IUwbAdapter mIUwbAdapter;
@Mock private UwbVendorUciCallback mUwbVendorUciCallback;
@Mock private UwbVendorUciCallback mUwbVendorUciCallback2;
diff --git a/service/java/com/android/server/uwb/UwbClientSessionHandle.java b/service/java/com/android/server/uwb/UwbClientSessionHandle.java
deleted file mode 100644
index 82b9852..0000000
--- a/service/java/com/android/server/uwb/UwbClientSessionHandle.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.uwb;
-
-import android.annotation.NonNull;
-import android.content.AttributionSource;
-import android.uwb.SessionHandle;
-
-import java.util.Objects;
-
-/**
- * Container for storing unique session info.
- */
-public class UwbClientSessionHandle {
- private final SessionHandle mSessionHandle;
- private final AttributionSource mAttributionSource;
-
-
- public UwbClientSessionHandle(@NonNull SessionHandle sessionHandle,
- @NonNull AttributionSource attributionSource) {
- mSessionHandle = sessionHandle;
- mAttributionSource = attributionSource;
- }
-
- @Override
- public java.lang.String toString() {
- return "UwbClientSessionHandle{"
- + "mSessionHandle=" + mSessionHandle
- + ", mAttributionSource=" + mAttributionSource
- + '}';
- }
-
- @Override
- public boolean equals(Object object) {
- if (this == object) return true;
- if (!(object instanceof UwbClientSessionHandle)) return false;
- UwbClientSessionHandle that = (UwbClientSessionHandle) object;
- return Objects.equals(mSessionHandle, that.mSessionHandle)
- && Objects.equals(mAttributionSource, that.mAttributionSource);
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(mSessionHandle, mAttributionSource);
- }
-
- @NonNull
- public SessionHandle getSessionHandle() {
- return mSessionHandle;
- }
-
- @NonNull
- public AttributionSource getAttributionSource() {
- return mAttributionSource;
- }
-}
diff --git a/service/java/com/android/server/uwb/UwbServiceCore.java b/service/java/com/android/server/uwb/UwbServiceCore.java
index 6ed6810..9c7c307 100644
--- a/service/java/com/android/server/uwb/UwbServiceCore.java
+++ b/service/java/com/android/server/uwb/UwbServiceCore.java
@@ -280,13 +280,13 @@
FiraOpenSessionParams firaOpenSessionParams = FiraOpenSessionParams.fromBundle(
params);
sessionId = firaOpenSessionParams.getSessionId();
- mSessionManager.initSession(sessionHandle, sessionId,
+ mSessionManager.initSession(attributionSource, sessionHandle, sessionId,
firaOpenSessionParams.getProtocolName(),
firaOpenSessionParams, rangingCallbacks);
} else if (CccParams.isCorrectProtocol(params)) {
CccOpenRangingParams cccOpenRangingParams = CccOpenRangingParams.fromBundle(params);
sessionId = cccOpenRangingParams.getSessionId();
- mSessionManager.initSession(sessionHandle, sessionId,
+ mSessionManager.initSession(attributionSource, sessionHandle, sessionId,
cccOpenRangingParams.getProtocolName(),
cccOpenRangingParams, rangingCallbacks);
} else {
diff --git a/service/java/com/android/server/uwb/UwbServiceImpl.java b/service/java/com/android/server/uwb/UwbServiceImpl.java
index b668666..2e13460 100644
--- a/service/java/com/android/server/uwb/UwbServiceImpl.java
+++ b/service/java/com/android/server/uwb/UwbServiceImpl.java
@@ -25,195 +25,37 @@
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Binder;
-import android.os.IBinder;
import android.os.ParcelFileDescriptor;
import android.os.PersistableBundle;
import android.os.RemoteException;
import android.provider.Settings;
-import android.util.ArrayMap;
import android.util.Log;
-import android.uwb.IUwbAdapter2;
+import android.uwb.IUwbAdapter;
import android.uwb.IUwbAdapterStateCallbacks;
import android.uwb.IUwbAdfProvisionStateCallbacks;
import android.uwb.IUwbRangingCallbacks;
-import android.uwb.IUwbRangingCallbacks2;
import android.uwb.IUwbVendorUciCallback;
-import android.uwb.RangingReport;
import android.uwb.SessionHandle;
import android.uwb.UwbAddress;
-import com.android.internal.annotations.GuardedBy;
-
import com.google.uwb.support.multichip.ChipInfoParams;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
-import java.util.Map;
/**
- * Implementation of {@link android.uwb.IUwbAdapter2} binder service.
+ * Implementation of {@link android.uwb.IUwbAdapter} binder service.
*/
-public class UwbServiceImpl extends IUwbAdapter2.Stub {
+public class UwbServiceImpl extends IUwbAdapter.Stub {
private static final String TAG = "UwbServiceImpl";
private final Context mContext;
private final UwbInjector mUwbInjector;
private final UwbSettingsStore mUwbSettingsStore;
-
- /**
- * Map for storing the callbacks wrapper for each session.
- */
- @GuardedBy("mCallbacksMap")
- private final Map<UwbClientSessionHandle, UwbRangingCallbacksWrapper> mCallbacksMap =
- new ArrayMap<>();
-
private final UwbServiceCore mUwbServiceCore;
- /**
- * Wrapper for callback registered with vendor service. This wrapper is needed for performing
- * permission check before sending the callback to the external app.
- *
- * Access to these callbacks are synchronized.
- */
- private class UwbRangingCallbacksWrapper extends IUwbRangingCallbacks.Stub
- implements IBinder.DeathRecipient {
- private final UwbClientSessionHandle mUwbClientSessionHandle;
- private final IUwbRangingCallbacks2 mExternalCb;
- private boolean mIsValid;
-
- UwbRangingCallbacksWrapper(@NonNull UwbClientSessionHandle uwbSessionInfo,
- @NonNull IUwbRangingCallbacks2 externalCb) {
- mUwbClientSessionHandle = uwbSessionInfo;
- mExternalCb = externalCb;
- mIsValid = true;
-
- // Link to death for external callback.
- linkToDeath();
- }
-
- private void linkToDeath() {
- IBinder binder = mExternalCb.asBinder();
- try {
- binder.linkToDeath(this, 0);
- } catch (RemoteException e) {
- Log.e(TAG, "Unable to link to client death event.", e);
- }
- }
-
- private void removeClientAndUnlinkToDeath() {
- // Remove from the map.
- synchronized (mCallbacksMap) {
- mCallbacksMap.remove(mUwbClientSessionHandle);
- }
- IBinder binder = mExternalCb.asBinder();
- binder.unlinkToDeath(this, 0);
- mIsValid = false;
- }
-
-
- @Override
- public synchronized void onRangingOpened(SessionHandle sessionHandle)
- throws RemoteException {
- if (!mIsValid) return;
- mExternalCb.onRangingOpened(sessionHandle);
- }
-
- @Override
- public synchronized void onRangingOpenFailed(SessionHandle sessionHandle,
- int reason, PersistableBundle parameters) throws RemoteException {
- if (!mIsValid) return;
- mExternalCb.onRangingOpenFailed(sessionHandle, reason, parameters);
- }
-
- @Override
- public synchronized void onRangingStarted(SessionHandle sessionHandle,
- PersistableBundle parameters)
- throws RemoteException {
- if (!mIsValid) return;
- mExternalCb.onRangingStarted(sessionHandle, parameters);
- }
-
- @Override
- public synchronized void onRangingStartFailed(SessionHandle sessionHandle,
- int reason, PersistableBundle parameters) throws RemoteException {
- if (!mIsValid) return;
- mExternalCb.onRangingStartFailed(sessionHandle, reason, parameters);
- }
-
- @Override
- public synchronized void onRangingReconfigured(SessionHandle sessionHandle,
- PersistableBundle parameters)
- throws RemoteException {
- if (!mIsValid) return;
- mExternalCb.onRangingReconfigured(sessionHandle, parameters);
- }
-
- @Override
- public synchronized void onRangingReconfigureFailed(SessionHandle sessionHandle,
- int reason, PersistableBundle parameters) throws RemoteException {
- if (!mIsValid) return;
- mExternalCb.onRangingReconfigureFailed(sessionHandle, reason, parameters);
- }
-
- @Override
- public synchronized void onRangingStopped(SessionHandle sessionHandle, int reason,
- PersistableBundle parameters)
- throws RemoteException {
- if (!mIsValid) return;
- mExternalCb.onRangingStopped(sessionHandle, reason, parameters);
- }
-
- @Override
- public synchronized void onRangingStopFailed(SessionHandle sessionHandle, int reason,
- PersistableBundle parameters) throws RemoteException {
- if (!mIsValid) return;
- mExternalCb.onRangingStopFailed(sessionHandle, reason, parameters);
- }
-
- @Override
- public synchronized void onRangingClosed(SessionHandle sessionHandle, int reason,
- PersistableBundle parameters) throws RemoteException {
- if (!mIsValid) return;
- mExternalCb.onRangingClosed(sessionHandle, reason, parameters);
- removeClientAndUnlinkToDeath();
- }
-
- @Override
- public synchronized void onRangingResult(SessionHandle sessionHandle,
- RangingReport rangingReport)
- throws RemoteException {
- if (!mIsValid) return;
- final long ident = Binder.clearCallingIdentity();
- try {
- boolean permissionGranted = mUwbInjector.checkUwbRangingPermissionForDataDelivery(
- mUwbClientSessionHandle.getAttributionSource(), "uwb ranging result");
- if (!permissionGranted) {
- Log.e(TAG, "Not delivering ranging result because of permission denial"
- + mUwbClientSessionHandle.getSessionHandle());
- return;
- }
- } finally {
- Binder.restoreCallingIdentity(ident);
- }
- mExternalCb.onRangingResult(sessionHandle, rangingReport);
- }
-
- @Override
- public synchronized void binderDied() {
- if (!mIsValid) return;
- Log.i(TAG, "Client died: ending session: "
- + mUwbClientSessionHandle.getSessionHandle());
- try {
- removeClientAndUnlinkToDeath();
- stopRanging(mUwbClientSessionHandle.getSessionHandle());
- closeRanging(mUwbClientSessionHandle.getSessionHandle());
- } catch (RemoteException e) {
- Log.e(TAG, "Remote exception while handling client death", e);
- }
- }
- }
UwbServiceImpl(@NonNull Context context, @NonNull UwbInjector uwbInjector) {
mContext = context;
@@ -305,22 +147,13 @@
@Override
public void openRanging(AttributionSource attributionSource,
SessionHandle sessionHandle,
- IUwbRangingCallbacks2 rangingCallbacks,
+ IUwbRangingCallbacks rangingCallbacks,
PersistableBundle parameters,
String chipId) throws RemoteException {
enforceUwbPrivilegedPermission();
mUwbInjector.enforceUwbRangingPermissionForPreflight(attributionSource);
-
- final UwbClientSessionHandle uwbSessionInfo =
- new UwbClientSessionHandle(sessionHandle, attributionSource);
- UwbRangingCallbacksWrapper wrapperCb =
- new UwbRangingCallbacksWrapper(uwbSessionInfo, rangingCallbacks);
- synchronized (mCallbacksMap) {
- mCallbacksMap.put(uwbSessionInfo, wrapperCb);
- }
- mUwbServiceCore
- .openRanging(attributionSource, sessionHandle, wrapperCb, parameters);
+ mUwbServiceCore.openRanging(attributionSource, sessionHandle, rangingCallbacks, parameters);
}
@Override
diff --git a/service/java/com/android/server/uwb/UwbSessionManager.java b/service/java/com/android/server/uwb/UwbSessionManager.java
index 799cb51..c621e28 100644
--- a/service/java/com/android/server/uwb/UwbSessionManager.java
+++ b/service/java/com/android/server/uwb/UwbSessionManager.java
@@ -18,6 +18,7 @@
import static com.android.server.uwb.data.UwbUciConstants.REASON_STATE_CHANGE_WITH_SESSION_MANAGEMENT_COMMANDS;
import android.annotation.Nullable;
+import android.content.AttributionSource;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
@@ -26,7 +27,7 @@
import android.os.RemoteException;
import android.util.Log;
import android.util.Pair;
-import android.uwb.IUwbAdapter2;
+import android.uwb.IUwbAdapter;
import android.uwb.IUwbRangingCallbacks;
import android.uwb.RangingChangeReason;
import android.uwb.SessionHandle;
@@ -174,12 +175,13 @@
uwbSession.getParams());
}
- public synchronized void initSession(SessionHandle sessionHandle, int sessionId,
+ public synchronized void initSession(AttributionSource attributionSource,
+ SessionHandle sessionHandle, int sessionId,
String protocolName, Params params, IUwbRangingCallbacks rangingCallbacks)
throws RemoteException {
Log.i(TAG, "initSession() : Enter - sessionId : " + sessionId);
- UwbSession uwbSession = createUwbSession(sessionHandle, sessionId, protocolName, params,
- rangingCallbacks);
+ UwbSession uwbSession = createUwbSession(attributionSource, sessionHandle, sessionId,
+ protocolName, params, rangingCallbacks);
if (isExistedSession(sessionId)) {
Log.i(TAG, "Duplicated sessionId");
rangingCallbacks.onRangingOpenFailed(sessionHandle, RangingChangeReason.UNKNOWN,
@@ -224,9 +226,11 @@
// TODO: use UwbInjector.
@VisibleForTesting
- UwbSession createUwbSession(SessionHandle sessionHandle, int sessionId, String protocolName,
- Params params, IUwbRangingCallbacks iUwbRangingCallbacks) {
- return new UwbSession(sessionHandle, sessionId, protocolName, params, iUwbRangingCallbacks);
+ UwbSession createUwbSession(AttributionSource attributionSource, SessionHandle sessionHandle,
+ int sessionId, String protocolName, Params params,
+ IUwbRangingCallbacks iUwbRangingCallbacks) {
+ return new UwbSession(attributionSource, sessionHandle, sessionId, protocolName, params,
+ iUwbRangingCallbacks);
}
public synchronized void deInitSession(SessionHandle sessionHandle) {
@@ -511,7 +515,7 @@
int status = UwbUciConstants.STATUS_CODE_FAILED;
try {
status = initSessionTask.get(
- IUwbAdapter2.RANGING_SESSION_OPEN_THRESHOLD_MS, TimeUnit.MILLISECONDS);
+ IUwbAdapter.RANGING_SESSION_OPEN_THRESHOLD_MS, TimeUnit.MILLISECONDS);
} catch (TimeoutException e) {
executor.shutdownNow();
Log.i(TAG, "Failed to initialize session - status : TIMEOUT");
@@ -591,7 +595,7 @@
int status = UwbUciConstants.STATUS_CODE_FAILED;
try {
status = startRangingTask.get(
- IUwbAdapter2.RANGING_SESSION_START_THRESHOLD_MS, TimeUnit.MILLISECONDS);
+ IUwbAdapter.RANGING_SESSION_START_THRESHOLD_MS, TimeUnit.MILLISECONDS);
} catch (TimeoutException e) {
Log.i(TAG, "Failed to Start Ranging - status : TIMEOUT");
executor.shutdownNow();
@@ -635,7 +639,7 @@
int status = UwbUciConstants.STATUS_CODE_FAILED;
try {
status = stopRangingTask.get(
- IUwbAdapter2.RANGING_SESSION_START_THRESHOLD_MS, TimeUnit.MILLISECONDS);
+ IUwbAdapter.RANGING_SESSION_START_THRESHOLD_MS, TimeUnit.MILLISECONDS);
} catch (TimeoutException e) {
Log.i(TAG, "Failed to Stop Ranging - status : TIMEOUT");
executor.shutdownNow();
@@ -728,7 +732,7 @@
int status = UwbUciConstants.STATUS_CODE_FAILED;
try {
status = cmdTask.get(
- IUwbAdapter2.RANGING_SESSION_OPEN_THRESHOLD_MS, TimeUnit.MILLISECONDS);
+ IUwbAdapter.RANGING_SESSION_OPEN_THRESHOLD_MS, TimeUnit.MILLISECONDS);
} catch (TimeoutException e) {
Log.i(TAG, "Failed to Reconfigure - status : TIMEOUT");
executor.shutdownNow();
@@ -766,7 +770,7 @@
int status = UwbUciConstants.STATUS_CODE_FAILED;
try {
status = closeTask.get(
- IUwbAdapter2.RANGING_SESSION_CLOSE_THRESHOLD_MS, TimeUnit.MILLISECONDS);
+ IUwbAdapter.RANGING_SESSION_CLOSE_THRESHOLD_MS, TimeUnit.MILLISECONDS);
} catch (TimeoutException e) {
Log.i(TAG, "Failed to Stop Ranging - status : TIMEOUT");
executor.shutdownNow();
@@ -783,6 +787,7 @@
}
public class UwbSession implements IBinder.DeathRecipient {
+ private final AttributionSource mAttributionSource;
private final SessionHandle mSessionHandle;
private final int mSessionId;
private final IUwbRangingCallbacks mIUwbRangingCallbacks;
@@ -795,8 +800,9 @@
private UwbMulticastListUpdateStatus mMulticastListUpdateStatus;
private final int mProfileType;
- UwbSession(SessionHandle sessionHandle, int sessionId, String protocolName,
- Params params, IUwbRangingCallbacks iUwbRangingCallbacks) {
+ UwbSession(AttributionSource attributionSource, SessionHandle sessionHandle, int sessionId,
+ String protocolName, Params params, IUwbRangingCallbacks iUwbRangingCallbacks) {
+ this.mAttributionSource = attributionSource;
this.mSessionHandle = sessionHandle;
this.mSessionId = sessionId;
this.mProtocolName = protocolName;
@@ -809,6 +815,10 @@
this.mProfileType = convertProtolNameToProfileType(protocolName);
}
+ public AttributionSource getAttributionSource() {
+ return this.mAttributionSource;
+ }
+
public int getSessionId() {
return this.mSessionId;
}
@@ -895,6 +905,7 @@
synchronized (UwbSessionManager.this) {
int status = mNativeUwbManager.deInitSession(getSessionId());
+ mUwbMetrics.logRangingCloseEvent(this, status);
if (status == UwbUciConstants.STATUS_CODE_OK) {
removeSession(this);
Log.i(TAG, "binderDied : Session count currently is " + getSessionCount());
diff --git a/service/java/com/android/server/uwb/UwbSessionNotificationManager.java b/service/java/com/android/server/uwb/UwbSessionNotificationManager.java
index bc2fa4b..35547a4 100644
--- a/service/java/com/android/server/uwb/UwbSessionNotificationManager.java
+++ b/service/java/com/android/server/uwb/UwbSessionNotificationManager.java
@@ -55,6 +55,13 @@
public void onRangingResult(UwbSession uwbSession, UwbRangingData rangingData) {
SessionHandle sessionHandle = uwbSession.getSessionHandle();
IUwbRangingCallbacks uwbRangingCallbacks = uwbSession.getIUwbRangingCallbacks();
+ boolean permissionGranted = mUwbInjector.checkUwbRangingPermissionForDataDelivery(
+ uwbSession.getAttributionSource(), "uwb ranging result");
+ if (!permissionGranted) {
+ Log.e(TAG, "Not delivering ranging result because of permission denial"
+ + sessionHandle);
+ return;
+ }
try {
uwbRangingCallbacks.onRangingResult(
sessionHandle,
diff --git a/service/java/com/android/server/uwb/UwbShellCommand.java b/service/java/com/android/server/uwb/UwbShellCommand.java
index 6ecd569..3124d57 100644
--- a/service/java/com/android/server/uwb/UwbShellCommand.java
+++ b/service/java/com/android/server/uwb/UwbShellCommand.java
@@ -56,7 +56,7 @@
import android.os.RemoteException;
import android.util.ArrayMap;
import android.util.Pair;
-import android.uwb.IUwbRangingCallbacks2;
+import android.uwb.IUwbRangingCallbacks;
import android.uwb.RangingReport;
import android.uwb.SessionHandle;
import android.uwb.UwbAddress;
@@ -183,7 +183,7 @@
}
}
- private static final class UwbRangingCallbacks extends IUwbRangingCallbacks2.Stub {
+ private static final class UwbRangingCallbacks extends IUwbRangingCallbacks.Stub {
private final SessionInfo mSessionInfo;
private final PrintWriter mPw;
private final CompletableFuture mRangingOpenedFuture;
diff --git a/service/tests/src/com/android/server/uwb/UwbServiceCoreTest.java b/service/tests/src/com/android/server/uwb/UwbServiceCoreTest.java
index 8753348..e259305 100644
--- a/service/tests/src/com/android/server/uwb/UwbServiceCoreTest.java
+++ b/service/tests/src/com/android/server/uwb/UwbServiceCoreTest.java
@@ -323,12 +323,13 @@
SessionHandle sessionHandle = mock(SessionHandle.class);
IUwbRangingCallbacks cb = mock(IUwbRangingCallbacks.class);
+ AttributionSource attributionSource = mock(AttributionSource.class);
FiraOpenSessionParams params = TEST_FIRA_OPEN_SESSION_PARAMS.build();
mUwbServiceCore.openRanging(
- mock(AttributionSource.class), sessionHandle, cb,
- params.toBundle());
+ attributionSource, sessionHandle, cb, params.toBundle());
verify(mUwbSessionManager).initSession(
+ eq(attributionSource),
eq(sessionHandle), eq(params.getSessionId()), eq(FiraParams.PROTOCOL_NAME),
argThat(p -> ((FiraOpenSessionParams) p).getSessionId() == params.getSessionId()),
eq(cb));
@@ -342,11 +343,12 @@
SessionHandle sessionHandle = mock(SessionHandle.class);
IUwbRangingCallbacks cb = mock(IUwbRangingCallbacks.class);
CccOpenRangingParams params = TEST_CCC_OPEN_RANGING_PARAMS.build();
+ AttributionSource attributionSource = mock(AttributionSource.class);
mUwbServiceCore.openRanging(
- mock(AttributionSource.class), sessionHandle, cb,
- params.toBundle());
+ attributionSource, sessionHandle, cb, params.toBundle());
verify(mUwbSessionManager).initSession(
+ eq(attributionSource),
eq(sessionHandle), eq(params.getSessionId()), eq(CccParams.PROTOCOL_NAME),
argThat(p -> ((CccOpenRangingParams) p).getSessionId() == params.getSessionId()),
eq(cb));
diff --git a/service/tests/src/com/android/server/uwb/UwbServiceImplTest.java b/service/tests/src/com/android/server/uwb/UwbServiceImplTest.java
index 62b25de..1d0e412 100644
--- a/service/tests/src/com/android/server/uwb/UwbServiceImplTest.java
+++ b/service/tests/src/com/android/server/uwb/UwbServiceImplTest.java
@@ -28,17 +28,12 @@
import static org.junit.Assert.assertThrows;
import static org.junit.Assert.fail;
import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.clearInvocations;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;
import android.content.AttributionSource;
@@ -53,10 +48,7 @@
import android.uwb.IUwbAdapterStateCallbacks;
import android.uwb.IUwbAdfProvisionStateCallbacks;
import android.uwb.IUwbRangingCallbacks;
-import android.uwb.IUwbRangingCallbacks2;
import android.uwb.IUwbVendorUciCallback;
-import android.uwb.RangingReport;
-import android.uwb.RangingSession;
import android.uwb.SessionHandle;
import android.uwb.UwbAddress;
@@ -85,18 +77,14 @@
@Presubmit
public class UwbServiceImplTest {
private static final int UID = 343453;
- private static final int UID_2 = 343453;
private static final String PACKAGE_NAME = "com.uwb.test";
private static final String DEFAULT_CHIP_ID = "defaultChipId";
private static final ChipInfoParams DEFAULT_CHIP_INFO_PARAMS =
ChipInfoParams.createBuilder().setChipId(DEFAULT_CHIP_ID).build();
private static final AttributionSource ATTRIBUTION_SOURCE =
new AttributionSource.Builder(UID).setPackageName(PACKAGE_NAME).build();
- private static final AttributionSource ATTRIBUTION_SOURCE_2 =
- new AttributionSource.Builder(UID_2).setPackageName(PACKAGE_NAME).build();
@Mock private UwbServiceCore mUwbServiceCore;
- @Mock private IBinder mUwbServiceCoreBinder;
@Mock private Context mContext;
@Mock private UwbInjector mUwbInjector;
@Mock private UwbSettingsStore mUwbSettingsStore;
@@ -113,7 +101,6 @@
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
- when(mUwbInjector.checkUwbRangingPermissionForDataDelivery(any(), any())).thenReturn(true);
when(mUwbInjector.getUwbSettingsStore()).thenReturn(mUwbSettingsStore);
when(mUwbSettingsStore.get(SETTINGS_TOGGLE_STATE)).thenReturn(true);
when(mUwbMultichipData.getChipInfos()).thenReturn(List.of(DEFAULT_CHIP_INFO_PARAMS));
@@ -201,7 +188,7 @@
@Test
public void testOpenRanging() throws Exception {
final SessionHandle sessionHandle = new SessionHandle(5);
- final IUwbRangingCallbacks2 cb = mock(IUwbRangingCallbacks2.class);
+ final IUwbRangingCallbacks cb = mock(IUwbRangingCallbacks.class);
final PersistableBundle parameters = new PersistableBundle();
final IBinder cbBinder = mock(IBinder.class);
when(cb.asBinder()).thenReturn(cbBinder);
@@ -255,145 +242,6 @@
}
@Test
- public void testRangingCallbacks() throws Exception {
- final SessionHandle sessionHandle = new SessionHandle(5);
- final IUwbRangingCallbacks2 cb = mock(IUwbRangingCallbacks2.class);
- final PersistableBundle parameters = new PersistableBundle();
- final IBinder cbBinder = mock(IBinder.class);
- when(cb.asBinder()).thenReturn(cbBinder);
-
- mUwbServiceImpl.openRanging(
- ATTRIBUTION_SOURCE, sessionHandle, cb, parameters, /* chipId= */ null);
-
- verify(mUwbServiceCore).openRanging(
- eq(ATTRIBUTION_SOURCE), eq(sessionHandle), mRangingCbCaptor.capture(),
- eq(parameters));
- assertThat(mRangingCbCaptor.getValue()).isNotNull();
-
- // Invoke vendor service callbacks and ensure that the corresponding app callback is
- // invoked.
- mRangingCbCaptor.getValue().onRangingOpened(sessionHandle);
- verify(cb).onRangingOpened(sessionHandle);
-
- mRangingCbCaptor.getValue().onRangingOpenFailed(
- sessionHandle, RangingSession.Callback.REASON_GENERIC_ERROR, parameters);
- verify(cb).onRangingOpenFailed(
- sessionHandle, RangingSession.Callback.REASON_GENERIC_ERROR, parameters);
-
- mRangingCbCaptor.getValue().onRangingStarted(sessionHandle, parameters);
- verify(cb).onRangingStarted(sessionHandle, parameters);
-
- mRangingCbCaptor.getValue().onRangingStartFailed(
- sessionHandle, RangingSession.Callback.REASON_GENERIC_ERROR, parameters);
- verify(cb).onRangingStartFailed(
- sessionHandle, RangingSession.Callback.REASON_GENERIC_ERROR, parameters);
-
- mRangingCbCaptor.getValue().onRangingReconfigured(sessionHandle, parameters);
- verify(cb).onRangingReconfigured(sessionHandle, parameters);
-
- mRangingCbCaptor.getValue().onRangingReconfigureFailed(
- sessionHandle, RangingSession.Callback.REASON_GENERIC_ERROR, parameters);
- verify(cb).onRangingReconfigureFailed(
- sessionHandle, RangingSession.Callback.REASON_GENERIC_ERROR, parameters);
-
- mRangingCbCaptor.getValue().onRangingStopped(
- sessionHandle, RangingSession.Callback.REASON_GENERIC_ERROR, parameters);
- verify(cb).onRangingStopped(
- sessionHandle, RangingSession.Callback.REASON_GENERIC_ERROR, parameters);
-
- mRangingCbCaptor.getValue().onRangingStopFailed(
- sessionHandle, RangingSession.Callback.REASON_GENERIC_ERROR, parameters);
- verify(cb).onRangingStopFailed(
- sessionHandle, RangingSession.Callback.REASON_GENERIC_ERROR, parameters);
-
- final RangingReport rangingReport = new RangingReport.Builder().build();
- mRangingCbCaptor.getValue().onRangingResult(sessionHandle, rangingReport);
- verify(cb).onRangingResult(sessionHandle, rangingReport);
-
- mRangingCbCaptor.getValue().onRangingClosed(
- sessionHandle, RangingSession.Callback.REASON_GENERIC_ERROR, parameters);
- verify(cb).onRangingClosed(
- sessionHandle, RangingSession.Callback.REASON_GENERIC_ERROR, parameters);
- }
-
- @Test
- public void testRangingCallbacksFromDifferentUidWithSameSessionHandle() throws Exception {
- final SessionHandle sessionHandle = new SessionHandle(5);
- final IUwbRangingCallbacks2 cb1 = mock(IUwbRangingCallbacks2.class);
- final IUwbRangingCallbacks2 cb2 = mock(IUwbRangingCallbacks2.class);
- final PersistableBundle parameters = new PersistableBundle();
- final IBinder cbBinder1 = mock(IBinder.class);
- final IBinder cbBinder2 = mock(IBinder.class);
- when(cb1.asBinder()).thenReturn(cbBinder1);
- when(cb2.asBinder()).thenReturn(cbBinder2);
-
- mUwbServiceImpl.openRanging(
- ATTRIBUTION_SOURCE, sessionHandle, cb1, parameters, /* chipId= */ null);
-
- verify(mUwbServiceCore).openRanging(
- eq(ATTRIBUTION_SOURCE), eq(sessionHandle), mRangingCbCaptor.capture(),
- eq(parameters));
- assertThat(mRangingCbCaptor.getValue()).isNotNull();
- verify(cb1).asBinder();
- verify(cbBinder1).linkToDeath(any(), anyInt());
-
- mUwbServiceImpl.openRanging(
- ATTRIBUTION_SOURCE_2, sessionHandle, cb2, parameters, /* chipId= */ null);
-
- verify(mUwbServiceCore, times(2)).openRanging(
- eq(ATTRIBUTION_SOURCE_2), eq(sessionHandle), mRangingCbCaptor2.capture(),
- eq(parameters));
- assertThat(mRangingCbCaptor2.getValue()).isNotNull();
- verify(cb2).asBinder();
- verify(cbBinder2).linkToDeath(any(), anyInt());
-
- // Invoke vendor service callbacks and ensure that the corresponding app callback is
- // invoked.
- mRangingCbCaptor.getValue().onRangingOpened(sessionHandle);
- verify(cb1).onRangingOpened(sessionHandle);
- verifyZeroInteractions(cb2);
-
- mRangingCbCaptor2.getValue().onRangingOpened(sessionHandle);
- verify(cb2).onRangingOpened(sessionHandle);
- verifyNoMoreInteractions(cb1);
- }
-
- @Test
- public void testHandleClientDeath() throws Exception {
- final SessionHandle sessionHandle = new SessionHandle(5);
- final IUwbRangingCallbacks2 cb = mock(IUwbRangingCallbacks2.class);
- final PersistableBundle parameters = new PersistableBundle();
- final IBinder cbBinder = mock(IBinder.class);
- when(cb.asBinder()).thenReturn(cbBinder);
-
- mUwbServiceImpl.openRanging(
- ATTRIBUTION_SOURCE, sessionHandle, cb, parameters, /* chipId= */ null);
-
- verify(mUwbServiceCore).openRanging(
- eq(ATTRIBUTION_SOURCE), eq(sessionHandle), mRangingCbCaptor.capture(),
- eq(parameters));
- assertThat(mRangingCbCaptor.getValue()).isNotNull();
-
- verify(cbBinder).linkToDeath(mClientDeathCaptor.capture(), anyInt());
- assertThat(mClientDeathCaptor.getValue()).isNotNull();
-
- clearInvocations(cb);
-
- // Invoke cb, ensure it reaches the client.
- mRangingCbCaptor.getValue().onRangingOpened(sessionHandle);
- verify(cb).onRangingOpened(sessionHandle);
-
- // Trigger client death and ensure the session is stopped.
- mClientDeathCaptor.getValue().binderDied();
- verify(mUwbServiceCore).stopRanging(sessionHandle);
- verify(mUwbServiceCore).closeRanging(sessionHandle);
-
- // Invoke cb, it should be ignored.
- mRangingCbCaptor.getValue().onRangingStarted(sessionHandle, parameters);
- verify(cb, never()).onRangingStarted(any(), any());
- }
-
- @Test
public void testThrowSecurityExceptionWhenCalledWithoutUwbPrivilegedPermission()
throws Exception {
doThrow(new SecurityException()).when(mContext).enforceCallingOrSelfPermission(
@@ -423,7 +271,7 @@
any());
final SessionHandle sessionHandle = new SessionHandle(5);
- final IUwbRangingCallbacks2 cb = mock(IUwbRangingCallbacks2.class);
+ final IUwbRangingCallbacks cb = mock(IUwbRangingCallbacks.class);
final PersistableBundle parameters = new PersistableBundle();
final IBinder cbBinder = mock(IBinder.class);
when(cb.asBinder()).thenReturn(cbBinder);
@@ -435,30 +283,6 @@
}
@Test
- public void testOnRangingResultCallbackNotSentWithoutUwbRangingPermission() throws Exception {
- final SessionHandle sessionHandle = new SessionHandle(5);
- final IUwbRangingCallbacks2 cb = mock(IUwbRangingCallbacks2.class);
- final PersistableBundle parameters = new PersistableBundle();
- final IBinder cbBinder = mock(IBinder.class);
- when(cb.asBinder()).thenReturn(cbBinder);
-
- mUwbServiceImpl.openRanging(
- ATTRIBUTION_SOURCE, sessionHandle, cb, parameters, /* chipId= */ null);
-
- verify(mUwbServiceCore).openRanging(
- eq(ATTRIBUTION_SOURCE), eq(sessionHandle), mRangingCbCaptor.capture(),
- eq(parameters));
- assertThat(mRangingCbCaptor.getValue()).isNotNull();
-
- when(mUwbInjector.checkUwbRangingPermissionForDataDelivery(any(), any())).thenReturn(false);
-
- // Ensure the ranging cb is not delivered to the client.
- final RangingReport rangingReport = new RangingReport.Builder().build();
- mRangingCbCaptor.getValue().onRangingResult(sessionHandle, rangingReport);
- verify(cb, never()).onRangingResult(sessionHandle, rangingReport);
- }
-
- @Test
public void testToggleStatePersistenceToSharedPrefs() throws Exception {
mUwbServiceImpl.setEnabled(true);
verify(mUwbSettingsStore).put(SETTINGS_TOGGLE_STATE, true);
diff --git a/service/tests/src/com/android/server/uwb/UwbSessionManagerTest.java b/service/tests/src/com/android/server/uwb/UwbSessionManagerTest.java
index a16a28b..3bbad4d 100644
--- a/service/tests/src/com/android/server/uwb/UwbSessionManagerTest.java
+++ b/service/tests/src/com/android/server/uwb/UwbSessionManagerTest.java
@@ -34,6 +34,7 @@
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.content.AttributionSource;
import android.os.IBinder;
import android.os.PersistableBundle;
import android.os.RemoteException;
@@ -79,6 +80,10 @@
public class UwbSessionManagerTest {
private static final int TEST_SESSION_ID = 100;
private static final int MAX_SESSION_NUM = 8;
+ 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();
@Mock
private UwbConfigurationManager mUwbConfigurationManager;
@@ -205,8 +210,8 @@
IUwbRangingCallbacks mockRangingCallbacks = mock(IUwbRangingCallbacks.class);
doReturn(true).when(mUwbSessionManager).isExistedSession(anyInt());
- mUwbSessionManager.initSession(mock(SessionHandle.class), TEST_SESSION_ID, "any",
- mock(Params.class), mockRangingCallbacks);
+ mUwbSessionManager.initSession(ATTRIBUTION_SOURCE, mock(SessionHandle.class),
+ TEST_SESSION_ID, "any", mock(Params.class), mockRangingCallbacks);
verify(mockRangingCallbacks).onRangingOpenFailed(any(), anyInt(), any());
assertThat(mTestLooper.nextMessage()).isNull();
@@ -218,8 +223,8 @@
doReturn(false).when(mUwbSessionManager).isExistedSession(anyInt());
IUwbRangingCallbacks mockRangingCallbacks = mock(IUwbRangingCallbacks.class);
- mUwbSessionManager.initSession(mock(SessionHandle.class), TEST_SESSION_ID, "any",
- mock(Params.class), mockRangingCallbacks);
+ mUwbSessionManager.initSession(ATTRIBUTION_SOURCE, mock(SessionHandle.class),
+ TEST_SESSION_ID, "any", mock(Params.class), mockRangingCallbacks);
verify(mockRangingCallbacks).onRangingOpenFailed(any(), anyInt(), any());
assertThat(mTestLooper.nextMessage()).isNull();
@@ -234,15 +239,16 @@
Params mockParams = mock(FiraParams.class);
IBinder mockBinder = mock(IBinder.class);
UwbSession uwbSession = spy(
- mUwbSessionManager.new UwbSession(mockSessionHandle, TEST_SESSION_ID,
- FiraParams.PROTOCOL_NAME, mockParams, mockRangingCallbacks));
+ mUwbSessionManager.new UwbSession(ATTRIBUTION_SOURCE, mockSessionHandle,
+ TEST_SESSION_ID, FiraParams.PROTOCOL_NAME, mockParams,
+ mockRangingCallbacks));
doReturn(mockBinder).when(uwbSession).getBinder();
- doReturn(uwbSession).when(mUwbSessionManager).createUwbSession(any(), anyInt(),
+ doReturn(uwbSession).when(mUwbSessionManager).createUwbSession(any(), any(), anyInt(),
anyString(), any(), any());
doThrow(new RemoteException()).when(mockBinder).linkToDeath(any(), anyInt());
- mUwbSessionManager.initSession(mockSessionHandle, TEST_SESSION_ID, FiraParams.PROTOCOL_NAME,
- mockParams, mockRangingCallbacks);
+ mUwbSessionManager.initSession(ATTRIBUTION_SOURCE, mockSessionHandle, TEST_SESSION_ID,
+ FiraParams.PROTOCOL_NAME, mockParams, mockRangingCallbacks);
verify(uwbSession).binderDied();
verify(mockRangingCallbacks).onRangingOpenFailed(any(), anyInt(), any());
@@ -260,14 +266,15 @@
Params mockParams = mock(FiraParams.class);
IBinder mockBinder = mock(IBinder.class);
UwbSession uwbSession = spy(
- mUwbSessionManager.new UwbSession(mockSessionHandle, TEST_SESSION_ID,
- FiraParams.PROTOCOL_NAME, mockParams, mockRangingCallbacks));
+ mUwbSessionManager.new UwbSession(ATTRIBUTION_SOURCE, mockSessionHandle,
+ TEST_SESSION_ID, FiraParams.PROTOCOL_NAME, mockParams,
+ mockRangingCallbacks));
doReturn(mockBinder).when(uwbSession).getBinder();
- doReturn(uwbSession).when(mUwbSessionManager).createUwbSession(any(), anyInt(),
+ doReturn(uwbSession).when(mUwbSessionManager).createUwbSession(any(), any(), anyInt(),
anyString(), any(), any());
- mUwbSessionManager.initSession(mockSessionHandle, TEST_SESSION_ID, FiraParams.PROTOCOL_NAME,
- mockParams, mockRangingCallbacks);
+ mUwbSessionManager.initSession(ATTRIBUTION_SOURCE, mockSessionHandle, TEST_SESSION_ID,
+ FiraParams.PROTOCOL_NAME, mockParams, mockRangingCallbacks);
verify(uwbSession, never()).binderDied();
verify(mockRangingCallbacks, never()).onRangingOpenFailed(any(), anyInt(), any());
@@ -617,10 +624,10 @@
.build();
IBinder mockBinder = mock(IBinder.class);
UwbSession uwbSession = spy(
- mUwbSessionManager.new UwbSession(mockSessionHandle, TEST_SESSION_ID,
- FiraParams.PROTOCOL_NAME, params, mockRangingCallbacks));
+ mUwbSessionManager.new UwbSession(ATTRIBUTION_SOURCE, mockSessionHandle,
+ TEST_SESSION_ID, FiraParams.PROTOCOL_NAME, params, mockRangingCallbacks));
doReturn(mockBinder).when(uwbSession).getBinder();
- doReturn(uwbSession).when(mUwbSessionManager).createUwbSession(any(), anyInt(),
+ doReturn(uwbSession).when(mUwbSessionManager).createUwbSession(any(), any(), anyInt(),
anyString(), any(), any());
doReturn(mock(WaitObj.class)).when(uwbSession).getWaitObj();
@@ -652,10 +659,10 @@
.build();
IBinder mockBinder = mock(IBinder.class);
UwbSession uwbSession = spy(
- mUwbSessionManager.new UwbSession(mockSessionHandle, TEST_SESSION_ID,
- CccParams.PROTOCOL_NAME, params, mockRangingCallbacks));
+ mUwbSessionManager.new UwbSession(ATTRIBUTION_SOURCE, mockSessionHandle,
+ TEST_SESSION_ID, CccParams.PROTOCOL_NAME, params, mockRangingCallbacks));
doReturn(mockBinder).when(uwbSession).getBinder();
- doReturn(uwbSession).when(mUwbSessionManager).createUwbSession(any(), anyInt(),
+ doReturn(uwbSession).when(mUwbSessionManager).createUwbSession(any(), any(), anyInt(),
anyString(), any(), any());
doReturn(mock(WaitObj.class)).when(uwbSession).getWaitObj();
@@ -674,7 +681,7 @@
.thenReturn(UwbUciConstants.STATUS_CODE_OK);
- mUwbSessionManager.initSession(uwbSession.getSessionHandle(),
+ mUwbSessionManager.initSession(ATTRIBUTION_SOURCE, uwbSession.getSessionHandle(),
TEST_SESSION_ID, FiraParams.PROTOCOL_NAME,
uwbSession.getParams(), uwbSession.getIUwbRangingCallbacks());
mTestLooper.dispatchAll();
@@ -698,7 +705,7 @@
.thenReturn(UwbUciConstants.STATUS_CODE_OK);
- mUwbSessionManager.initSession(uwbSession.getSessionHandle(),
+ mUwbSessionManager.initSession(ATTRIBUTION_SOURCE, uwbSession.getSessionHandle(),
TEST_SESSION_ID, FiraParams.PROTOCOL_NAME,
uwbSession.getParams(), uwbSession.getIUwbRangingCallbacks());
mTestLooper.dispatchAll();
@@ -722,7 +729,7 @@
.thenReturn(UwbUciConstants.STATUS_CODE_OK);
- mUwbSessionManager.initSession(uwbSession.getSessionHandle(),
+ mUwbSessionManager.initSession(ATTRIBUTION_SOURCE, uwbSession.getSessionHandle(),
TEST_SESSION_ID, FiraParams.PROTOCOL_NAME,
uwbSession.getParams(), uwbSession.getIUwbRangingCallbacks());
mTestLooper.dispatchAll();
@@ -746,7 +753,7 @@
.thenReturn(UwbUciConstants.STATUS_CODE_FAILED);
- mUwbSessionManager.initSession(uwbSession.getSessionHandle(),
+ mUwbSessionManager.initSession(ATTRIBUTION_SOURCE, uwbSession.getSessionHandle(),
TEST_SESSION_ID, FiraParams.PROTOCOL_NAME,
uwbSession.getParams(), uwbSession.getIUwbRangingCallbacks());
mTestLooper.dispatchAll();
@@ -770,7 +777,7 @@
.thenReturn(UwbUciConstants.STATUS_CODE_FAILED);
- mUwbSessionManager.initSession(uwbSession.getSessionHandle(),
+ mUwbSessionManager.initSession(ATTRIBUTION_SOURCE, uwbSession.getSessionHandle(),
TEST_SESSION_ID, FiraParams.PROTOCOL_NAME,
uwbSession.getParams(), uwbSession.getIUwbRangingCallbacks());
mTestLooper.dispatchAll();
@@ -794,7 +801,7 @@
.thenReturn(UwbUciConstants.STATUS_CODE_FAILED);
- mUwbSessionManager.initSession(uwbSession.getSessionHandle(),
+ mUwbSessionManager.initSession(ATTRIBUTION_SOURCE, uwbSession.getSessionHandle(),
TEST_SESSION_ID, FiraParams.PROTOCOL_NAME,
uwbSession.getParams(), uwbSession.getIUwbRangingCallbacks());
mTestLooper.dispatchAll();
@@ -809,7 +816,7 @@
private UwbSession prepareExistingUwbSession() throws Exception {
UwbSession uwbSession = setUpUwbSessionForExecution();
- mUwbSessionManager.initSession(uwbSession.getSessionHandle(),
+ mUwbSessionManager.initSession(ATTRIBUTION_SOURCE, uwbSession.getSessionHandle(),
TEST_SESSION_ID, FiraParams.PROTOCOL_NAME,
uwbSession.getParams(), uwbSession.getIUwbRangingCallbacks());
mTestLooper.nextMessage(); // remove the OPEN_RANGING msg;
@@ -821,7 +828,7 @@
private UwbSession prepareExistingCccUwbSession() throws Exception {
UwbSession uwbSession = setUpCccUwbSessionForExecution();
- mUwbSessionManager.initSession(uwbSession.getSessionHandle(),
+ mUwbSessionManager.initSession(ATTRIBUTION_SOURCE, uwbSession.getSessionHandle(),
TEST_SESSION_ID, CccParams.PROTOCOL_NAME,
uwbSession.getParams(), uwbSession.getIUwbRangingCallbacks());
mTestLooper.nextMessage(); // remove the OPEN_RANGING msg;
@@ -1230,4 +1237,18 @@
eq(uwbSession), eq(UwbUciConstants.STATUS_CODE_FAILED));
assertThat(mUwbSessionManager.getSessionCount()).isEqualTo(0);
}
+
+
+ @Test
+ public void testHandleClientDeath() throws Exception {
+ UwbSession uwbSession = prepareExistingUwbSession();
+ when(mNativeUwbManager.deInitSession(TEST_SESSION_ID))
+ .thenReturn((byte) UwbUciConstants.STATUS_CODE_FAILED);
+
+ uwbSession.binderDied();
+
+ verify(mUwbMetrics).logRangingCloseEvent(
+ eq(uwbSession), eq(UwbUciConstants.STATUS_CODE_FAILED));
+ assertThat(mUwbSessionManager.getSessionCount()).isEqualTo(0);
+ }
}
diff --git a/service/tests/src/com/android/server/uwb/UwbSessionNotificationManagerTest.java b/service/tests/src/com/android/server/uwb/UwbSessionNotificationManagerTest.java
index a934477..6705948 100644
--- a/service/tests/src/com/android/server/uwb/UwbSessionNotificationManagerTest.java
+++ b/service/tests/src/com/android/server/uwb/UwbSessionNotificationManagerTest.java
@@ -23,10 +23,12 @@
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.validateMockitoUsage;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.content.AttributionSource;
import android.platform.test.annotations.Presubmit;
import android.test.suitebuilder.annotation.SmallTest;
import android.util.Pair;
@@ -83,6 +85,10 @@
private static final int TEST_AOA_DEST_ELEVATION_FOM = 90;
private static final int TEST_SLOT_IDX = 10;
private static final long TEST_ELAPSED_NANOS = 100L;
+ 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();
@Mock private UwbInjector mUwbInjector;
@Mock private UwbSessionManager.UwbSession mUwbSession;
@@ -95,14 +101,15 @@
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
-
when(mUwbSession.getSessionHandle()).thenReturn(mSessionHandle);
when(mUwbSession.getIUwbRangingCallbacks()).thenReturn(mIUwbRangingCallbacks);
when(mUwbSession.getProtocolName()).thenReturn(FiraParams.PROTOCOL_NAME);
when(mUwbSession.getParams()).thenReturn(mFiraParams);
+ when(mUwbSession.getAttributionSource()).thenReturn(ATTRIBUTION_SOURCE);
when(mFiraParams.getAoaResultRequest()).thenReturn(
FiraParams.AOA_RESULT_REQUEST_MODE_REQ_AOA_RESULTS);
when(mFiraParams.hasResultReportPhase()).thenReturn(false);
+ when(mUwbInjector.checkUwbRangingPermissionForDataDelivery(any(), any())).thenReturn(true);
when(mUwbInjector.getElapsedSinceBootNanos()).thenReturn(TEST_ELAPSED_NANOS);
mUwbSessionNotificationManager = new UwbSessionNotificationManager(mUwbInjector);
}
@@ -116,6 +123,18 @@
}
@Test
+ public void testOnRangingResultWithoutUwbRangingPermission() throws Exception {
+ Pair<UwbRangingData, RangingReport> testRangingDataAndRangingReport =
+ generateRangingDataAndRangingReport(true, true, false, false);
+ when(mUwbInjector.checkUwbRangingPermissionForDataDelivery(eq(ATTRIBUTION_SOURCE), any()))
+ .thenReturn(false);
+ mUwbSessionNotificationManager.onRangingResult(
+ mUwbSession, testRangingDataAndRangingReport.first);
+
+ verify(mIUwbRangingCallbacks, never()).onRangingResult(any(), any());
+ }
+
+ @Test
public void testOnRangingResultWithAoa() throws Exception {
Pair<UwbRangingData, RangingReport> testRangingDataAndRangingReport =
generateRangingDataAndRangingReport(true, true, false, false);
diff --git a/service/tests/src/com/android/server/uwb/UwbShellCommandTest.java b/service/tests/src/com/android/server/uwb/UwbShellCommandTest.java
index 2de85e3..b8d1c3b 100644
--- a/service/tests/src/com/android/server/uwb/UwbShellCommandTest.java
+++ b/service/tests/src/com/android/server/uwb/UwbShellCommandTest.java
@@ -39,7 +39,7 @@
import android.os.PersistableBundle;
import android.os.Process;
import android.util.Pair;
-import android.uwb.IUwbRangingCallbacks2;
+import android.uwb.IUwbRangingCallbacks;
import android.uwb.RangingMeasurement;
import android.uwb.RangingReport;
import android.uwb.SessionHandle;
@@ -171,15 +171,15 @@
}
private static class MutableCb {
- @Nullable public IUwbRangingCallbacks2 cb;
+ @Nullable public IUwbRangingCallbacks cb;
}
- private Pair<IUwbRangingCallbacks2, SessionHandle> triggerAndVerifyRangingStart(
+ private Pair<IUwbRangingCallbacks, SessionHandle> triggerAndVerifyRangingStart(
String[] rangingStartCmd, @NonNull Params openRangingParams) throws Exception {
return triggerAndVerifyRangingStart(rangingStartCmd, openRangingParams, null);
}
- private Pair<IUwbRangingCallbacks2, SessionHandle> triggerAndVerifyRangingStart(
+ private Pair<IUwbRangingCallbacks, SessionHandle> triggerAndVerifyRangingStart(
String[] rangingStartCmd, @NonNull Params openRangingParams, @Nullable Params
startRangingParams) throws Exception {
final MutableCb cbCaptor = new MutableCb();
@@ -222,7 +222,7 @@
}
private void triggerAndVerifyRangingStop(
- String[] rangingStopCmd, IUwbRangingCallbacks2 cb, SessionHandle sessionHandle)
+ String[] rangingStopCmd, IUwbRangingCallbacks cb, SessionHandle sessionHandle)
throws Exception {
doAnswer(invocation -> {
cb.onRangingStopped(sessionHandle, REASON_LOCAL_REQUEST, new PersistableBundle());
@@ -280,7 +280,7 @@
@Test
public void testRangingReportFiraRanging() throws Exception {
- Pair<IUwbRangingCallbacks2, SessionHandle> cbAndSessionHandle =
+ Pair<IUwbRangingCallbacks, SessionHandle> cbAndSessionHandle =
triggerAndVerifyRangingStart(
new String[]{"start-fira-ranging-session"},
DEFAULT_FIRA_OPEN_SESSION_PARAMS.build());
@@ -295,7 +295,7 @@
@Test
public void testRangingReportAllFiraRanging() throws Exception {
- Pair<IUwbRangingCallbacks2, SessionHandle> cbAndSessionHandle =
+ Pair<IUwbRangingCallbacks, SessionHandle> cbAndSessionHandle =
triggerAndVerifyRangingStart(
new String[]{"start-fira-ranging-session"},
DEFAULT_FIRA_OPEN_SESSION_PARAMS.build());
@@ -309,7 +309,7 @@
@Test
public void testStopFiraRanging() throws Exception {
- Pair<IUwbRangingCallbacks2, SessionHandle> cbAndSessionHandle =
+ Pair<IUwbRangingCallbacks, SessionHandle> cbAndSessionHandle =
triggerAndVerifyRangingStart(
new String[]{"start-fira-ranging-session"},
DEFAULT_FIRA_OPEN_SESSION_PARAMS.build());
@@ -343,7 +343,7 @@
@Test
public void testStopCccRanging() throws Exception {
CccOpenRangingParams openSessionParams = DEFAULT_CCC_OPEN_RANGING_PARAMS.build();
- Pair<IUwbRangingCallbacks2, SessionHandle> cbAndSessionHandle =
+ Pair<IUwbRangingCallbacks, SessionHandle> cbAndSessionHandle =
triggerAndVerifyRangingStart(
new String[]{"start-ccc-ranging-session"},
openSessionParams,
@@ -357,7 +357,7 @@
@Test
public void testStopAllRanging() throws Exception {
CccOpenRangingParams openSessionParams = DEFAULT_CCC_OPEN_RANGING_PARAMS.build();
- Pair<IUwbRangingCallbacks2, SessionHandle> cbAndSessionHandle =
+ Pair<IUwbRangingCallbacks, SessionHandle> cbAndSessionHandle =
triggerAndVerifyRangingStart(
new String[]{"start-ccc-ranging-session"},
openSessionParams,