/* * Copyright (C) 2022 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.nearby; import android.annotation.IntDef; import android.annotation.IntRange; import android.annotation.NonNull; import android.annotation.SystemApi; import android.os.Parcel; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.List; /** * Represents a {@link BroadcastRequest}. * * @hide */ @SystemApi public abstract class BroadcastRequest { /** An unknown nearby broadcast request type. */ public static final int BROADCAST_TYPE_UNKNOWN = -1; /** Broadcast type for advertising using nearby presence protocol. */ public static final int BROADCAST_TYPE_NEARBY_PRESENCE = 3; /** @hide **/ // Currently, only Nearby Presence broadcast is supported, in the future // broadcasting using other nearby specifications will be added. @Retention(RetentionPolicy.SOURCE) @IntDef({BROADCAST_TYPE_UNKNOWN, BROADCAST_TYPE_NEARBY_PRESENCE}) public @interface BroadcastType { } /** * Tx Power when the value is not set in the broadcast. */ public static final int UNKNOWN_TX_POWER = -127; /** * An unknown version of presence broadcast request. */ public static final int PRESENCE_VERSION_UNKNOWN = -1; /** * A legacy presence version that is only suitable for legacy (31 bytes) BLE advertisements. * This exists to support legacy presence version, and not recommended for use. */ public static final int PRESENCE_VERSION_V0 = 0; /** * V1 of Nearby Presence Protocol. This version supports both legacy (31 bytes) BLE * advertisements, and extended BLE advertisements. */ public static final int PRESENCE_VERSION_V1 = 1; /** @hide **/ @Retention(RetentionPolicy.SOURCE) @IntDef({PRESENCE_VERSION_UNKNOWN, PRESENCE_VERSION_V0, PRESENCE_VERSION_V1}) public @interface BroadcastVersion { } /** * Broadcast the request using the Bluetooth Low Energy (BLE) medium. */ public static final int MEDIUM_BLE = 1; /** * The medium where the broadcast request should be sent. * * @hide */ @IntDef({MEDIUM_BLE}) @Retention(RetentionPolicy.SOURCE) public @interface Medium {} /** * Creates a {@link BroadcastRequest} from parcel. * * @hide */ @NonNull public static BroadcastRequest createFromParcel(Parcel in) { int type = in.readInt(); switch (type) { case BroadcastRequest.BROADCAST_TYPE_NEARBY_PRESENCE: return PresenceBroadcastRequest.createFromParcelBody(in); default: throw new IllegalStateException( "Unexpected broadcast type (value " + type + ") in parcel."); } } private final @BroadcastType int mType; private final @BroadcastVersion int mVersion; private final int mTxPower; private final @Medium List mMediums; BroadcastRequest(@BroadcastType int type, @BroadcastVersion int version, int txPower, @Medium List mediums) { this.mType = type; this.mVersion = version; this.mTxPower = txPower; this.mMediums = mediums; } BroadcastRequest(@BroadcastType int type, Parcel in) { mType = type; mVersion = in.readInt(); mTxPower = in.readInt(); mMediums = new ArrayList<>(); in.readList(mMediums, Integer.class.getClassLoader(), Integer.class); } /** * Returns the type of the broadcast. */ public @BroadcastType int getType() { return mType; } /** * Returns the version of the broadcast. */ public @BroadcastVersion int getVersion() { return mVersion; } /** * Returns the calibrated TX power when this request is broadcast. */ @IntRange(from = -127, to = 126) public int getTxPower() { return mTxPower; } /** * Returns the list of broadcast mediums. A medium represents the channel on which the broadcast * request is sent. */ @NonNull @Medium public List getMediums() { return mMediums; } /** * Writes the BroadcastRequest to the parcel. * * @hide */ public void writeToParcel(@NonNull Parcel dest, int flags) { dest.writeInt(mType); dest.writeInt(mVersion); dest.writeInt(mTxPower); dest.writeList(mMediums); } }