blob: c1ddc9a6430c3666de0fbc1e6cf884d9beb31d3a [file] [log] [blame]
/*
* 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.IUwbRangingCallbacks;
import android.uwb.SessionHandle;
import android.uwb.UwbAddress;
import android.uwb.IUwbVendorUciCallback;
/**
* @hide
* TODO(b/211025367): Remove all the duplicate javadocs here.
*/
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);
/*
* 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
*
* @param callbacks callback to unregister
*/
void unregisterAdapterStateCallbacks(in IUwbAdapterStateCallbacks callbacks);
/**
* 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(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(in String chipId);
/**
* 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
* @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 String chipId);
/**
* 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);
/**
* 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);
/**
* 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.
*/
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
}