/* * Copyright 2021 HIMSA II K/S - www.himsa.com. * Represented by EHIMA - www.ehima.com * * 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.bluetooth; import android.annotation.IntDef; import android.annotation.NonNull; import android.os.Parcel; import android.os.ParcelUuid; import android.os.Parcelable; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.Objects; import java.util.UUID; /** * Representation of Call * * @hide */ public final class BluetoothLeCall implements Parcelable { /** @hide */ @IntDef( prefix = "STATE_", value = { STATE_INCOMING, STATE_DIALING, STATE_ALERTING, STATE_ACTIVE, STATE_LOCALLY_HELD, STATE_REMOTELY_HELD, STATE_LOCALLY_AND_REMOTELY_HELD }) @Retention(RetentionPolicy.SOURCE) public @interface State {} /** * A remote party is calling (incoming call). * * @hide */ public static final int STATE_INCOMING = 0x00; /** * The process to call the remote party has started but the remote party is not being alerted * (outgoing call). * * @hide */ public static final int STATE_DIALING = 0x01; /** * A remote party is being alerted (outgoing call). * * @hide */ public static final int STATE_ALERTING = 0x02; /** * The call is in an active conversation. * * @hide */ public static final int STATE_ACTIVE = 0x03; /** * The call is connected but held locally. “Locally Held” implies that either the server or the * client can affect the state. * * @hide */ public static final int STATE_LOCALLY_HELD = 0x04; /** * The call is connected but held remotely. “Remotely Held” means that the state is controlled * by the remote party of a call. * * @hide */ public static final int STATE_REMOTELY_HELD = 0x05; /** * The call is connected but held both locally and remotely. * * @hide */ public static final int STATE_LOCALLY_AND_REMOTELY_HELD = 0x06; /** * Whether the call direction is outgoing. * * @hide */ public static final int FLAG_OUTGOING_CALL = 0x00000001; /** * Whether the call URI and Friendly Name are withheld by server. * * @hide */ public static final int FLAG_WITHHELD_BY_SERVER = 0x00000002; /** * Whether the call URI and Friendly Name are withheld by network. * * @hide */ public static final int FLAG_WITHHELD_BY_NETWORK = 0x00000004; /** Unique UUID that identifies this call */ private UUID mUuid; /** Remote Caller URI */ private String mUri; /** Caller friendly name */ private String mFriendlyName; /** Call state */ private @State int mState; /** Call flags */ private int mCallFlags; /** @hide */ public BluetoothLeCall(@NonNull BluetoothLeCall that) { mUuid = new UUID( that.getUuid().getMostSignificantBits(), that.getUuid().getLeastSignificantBits()); mUri = that.mUri; mFriendlyName = that.mFriendlyName; mState = that.mState; mCallFlags = that.mCallFlags; } /** @hide */ public BluetoothLeCall( @NonNull UUID uuid, @NonNull String uri, @NonNull String friendlyName, @State int state, int callFlags) { mUuid = uuid; mUri = uri; mFriendlyName = friendlyName; mState = state; mCallFlags = callFlags; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; BluetoothLeCall that = (BluetoothLeCall) o; return mUuid.equals(that.mUuid) && mUri.equals(that.mUri) && mFriendlyName.equals(that.mFriendlyName) && mState == that.mState && mCallFlags == that.mCallFlags; } @Override public int hashCode() { return Objects.hash(mUuid, mUri, mFriendlyName, mState, mCallFlags); } /** * Returns a string representation of this BluetoothLeCall. * *

Currently this is the UUID. * * @return string representation of this BluetoothLeCall */ @Override public String toString() { return mUuid.toString(); } @Override public int describeContents() { return 0; } @Override public void writeToParcel(@NonNull Parcel out, int flags) { out.writeParcelable(new ParcelUuid(mUuid), 0); out.writeString(mUri); out.writeString(mFriendlyName); out.writeInt(mState); out.writeInt(mCallFlags); } public static final @NonNull Creator CREATOR = new Creator<>() { public BluetoothLeCall createFromParcel(Parcel in) { return new BluetoothLeCall(in); } public BluetoothLeCall[] newArray(int size) { return new BluetoothLeCall[size]; } }; private BluetoothLeCall(Parcel in) { mUuid = ((ParcelUuid) in.readParcelable(null)).getUuid(); mUri = in.readString(); mFriendlyName = in.readString(); mState = in.readInt(); mCallFlags = in.readInt(); } /** * Returns an UUID of this BluetoothLeCall. * *

An UUID is unique identifier of a BluetoothLeCall. * * @return UUID of this BluetoothLeCall * @hide */ public @NonNull UUID getUuid() { return mUuid; } /** * Returns a URI of the remote party of this BluetoothLeCall. * * @return string representation of this BluetoothLeCall * @hide */ public @NonNull String getUri() { return mUri; } /** * Returns a friendly name of the call. * * @return friendly name representation of this BluetoothLeCall * @hide */ public @NonNull String getFriendlyName() { return mFriendlyName; } /** * Returns the call state. * * @return the state of this BluetoothLeCall * @hide */ public @State int getState() { return mState; } /** * Returns the call flags. * * @return call flags * @hide */ public int getCallFlags() { return mCallFlags; } /** * Whether the call direction is incoming. * * @return true if incoming call, false otherwise * @hide */ public boolean isIncomingCall() { return (mCallFlags & FLAG_OUTGOING_CALL) == 0; } }