| Junho | edf3d82 | 2022-11-24 09:26:37 +0000 | [diff] [blame] | 1 | /* | 
|  | 2 | * Copyright (C) 2022 The Android Open Source Project | 
|  | 3 | * | 
|  | 4 | * Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | 5 | * you may not use this file except in compliance with the License. | 
|  | 6 | * You may obtain a copy of the License at | 
|  | 7 | * | 
|  | 8 | *      http://www.apache.org/licenses/LICENSE-2.0 | 
|  | 9 | * | 
|  | 10 | * Unless required by applicable law or agreed to in writing, software | 
|  | 11 | * distributed under the License is distributed on an "AS IS" BASIS, | 
|  | 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | 13 | * See the License for the specific language governing permissions and | 
|  | 14 | * limitations under the License. | 
|  | 15 | */ | 
|  | 16 |  | 
|  | 17 | package android.telecom; | 
|  | 18 |  | 
|  | 19 | import android.annotation.IntDef; | 
|  | 20 | import android.annotation.NonNull; | 
|  | 21 | import android.os.Parcel; | 
|  | 22 | import android.os.ParcelUuid; | 
|  | 23 | import android.os.Parcelable; | 
|  | 24 | import android.text.TextUtils; | 
|  | 25 |  | 
|  | 26 | import java.lang.annotation.Retention; | 
|  | 27 | import java.lang.annotation.RetentionPolicy; | 
|  | 28 | import java.util.Objects; | 
|  | 29 | import java.util.UUID; | 
|  | 30 |  | 
|  | 31 | /** | 
|  | 32 | * Encapsulates the endpoint where call media can flow | 
|  | 33 | */ | 
|  | 34 | public final class CallEndpoint implements Parcelable { | 
|  | 35 | /** @hide */ | 
|  | 36 | public static final int ENDPOINT_OPERATION_SUCCESS = 0; | 
|  | 37 | /** @hide */ | 
|  | 38 | public static final int ENDPOINT_OPERATION_FAILED = 1; | 
|  | 39 |  | 
|  | 40 | /** @hide */ | 
|  | 41 | @Retention(RetentionPolicy.SOURCE) | 
|  | 42 | @IntDef({TYPE_UNKNOWN, TYPE_EARPIECE, TYPE_BLUETOOTH, TYPE_WIRED_HEADSET, TYPE_SPEAKER, | 
|  | 43 | TYPE_STREAMING}) | 
|  | 44 | public @interface EndpointType {} | 
|  | 45 |  | 
|  | 46 | /** Indicates that the type of endpoint through which call media flows is unknown type. */ | 
|  | 47 | public static final int TYPE_UNKNOWN       = -1; | 
|  | 48 |  | 
|  | 49 | /** Indicates that the type of endpoint through which call media flows is an earpiece. */ | 
|  | 50 | public static final int TYPE_EARPIECE      = 1; | 
|  | 51 |  | 
|  | 52 | /** Indicates that the type of endpoint through which call media flows is a Bluetooth. */ | 
|  | 53 | public static final int TYPE_BLUETOOTH     = 2; | 
|  | 54 |  | 
|  | 55 | /** Indicates that the type of endpoint through which call media flows is a wired headset. */ | 
|  | 56 | public static final int TYPE_WIRED_HEADSET = 3; | 
|  | 57 |  | 
|  | 58 | /** Indicates that the type of endpoint through which call media flows is a speakerphone. */ | 
|  | 59 | public static final int TYPE_SPEAKER       = 4; | 
|  | 60 |  | 
|  | 61 | /** Indicates that the type of endpoint through which call media flows is an external. */ | 
|  | 62 | public static final int TYPE_STREAMING     = 5; | 
|  | 63 |  | 
|  | 64 | private final CharSequence mName; | 
|  | 65 | private final int mType; | 
|  | 66 | private final ParcelUuid mIdentifier; | 
|  | 67 |  | 
|  | 68 | /** | 
|  | 69 | * Constructor for a {@link CallEndpoint} object. | 
|  | 70 | * | 
|  | 71 | * @param name Human-readable name associated with the endpoint | 
|  | 72 | * @param type The type of endpoint through which call media being routed | 
|  | 73 | * Allowed values: | 
|  | 74 | * {@link #TYPE_EARPIECE} | 
|  | 75 | * {@link #TYPE_BLUETOOTH} | 
|  | 76 | * {@link #TYPE_WIRED_HEADSET} | 
|  | 77 | * {@link #TYPE_SPEAKER} | 
|  | 78 | * {@link #TYPE_STREAMING} | 
|  | 79 | * {@link #TYPE_UNKNOWN} | 
|  | 80 | * @param id A unique identifier for this endpoint on the device | 
|  | 81 | */ | 
|  | 82 | public CallEndpoint(@NonNull CharSequence name, @EndpointType int type, | 
|  | 83 | @NonNull ParcelUuid id) { | 
|  | 84 | this.mName = name; | 
|  | 85 | this.mType = type; | 
|  | 86 | this.mIdentifier = id; | 
|  | 87 | } | 
|  | 88 |  | 
|  | 89 | /** @hide */ | 
|  | 90 | public CallEndpoint(@NonNull CharSequence name, @EndpointType int type) { | 
|  | 91 | this(name, type, new ParcelUuid(UUID.randomUUID())); | 
|  | 92 | } | 
|  | 93 |  | 
|  | 94 | /** @hide */ | 
|  | 95 | public CallEndpoint(CallEndpoint endpoint) { | 
|  | 96 | mName = endpoint.getEndpointName(); | 
|  | 97 | mType = endpoint.getEndpointType(); | 
|  | 98 | mIdentifier = endpoint.getIdentifier(); | 
|  | 99 | } | 
|  | 100 |  | 
|  | 101 | /** | 
|  | 102 | * {@inheritDoc} | 
|  | 103 | */ | 
|  | 104 | @Override | 
|  | 105 | public boolean equals(Object obj) { | 
|  | 106 | if (obj == null) { | 
|  | 107 | return false; | 
|  | 108 | } | 
|  | 109 | if (!(obj instanceof CallEndpoint)) { | 
|  | 110 | return false; | 
|  | 111 | } | 
|  | 112 | CallEndpoint endpoint = (CallEndpoint) obj; | 
|  | 113 | return getEndpointName().toString().contentEquals(endpoint.getEndpointName()) | 
|  | 114 | && getEndpointType() == endpoint.getEndpointType() | 
|  | 115 | && getIdentifier().equals(endpoint.getIdentifier()); | 
|  | 116 | } | 
|  | 117 |  | 
|  | 118 | /** | 
|  | 119 | * {@inheritDoc} | 
|  | 120 | */ | 
|  | 121 | @Override | 
|  | 122 | public int hashCode() { | 
|  | 123 | return Objects.hash(mName, mType, mIdentifier); | 
|  | 124 | } | 
|  | 125 |  | 
|  | 126 | /** | 
|  | 127 | * {@inheritDoc} | 
|  | 128 | */ | 
|  | 129 | @Override | 
|  | 130 | public String toString() { | 
|  | 131 | return TextUtils.formatSimple("[CallEndpoint Name: %s, Type: %s, Identifier: %s]", | 
|  | 132 | mName.toString(), endpointTypeToString(mType), mIdentifier.toString()); | 
|  | 133 | } | 
|  | 134 |  | 
|  | 135 | /** | 
|  | 136 | * @return Human-readable name associated with the endpoint | 
|  | 137 | */ | 
|  | 138 | @NonNull | 
|  | 139 | public CharSequence getEndpointName() { | 
|  | 140 | return mName; | 
|  | 141 | } | 
|  | 142 |  | 
|  | 143 | /** | 
|  | 144 | * @return The type of endpoint through which call media being routed | 
|  | 145 | */ | 
|  | 146 | @EndpointType | 
|  | 147 | public int getEndpointType() { | 
|  | 148 | return mType; | 
|  | 149 | } | 
|  | 150 |  | 
|  | 151 | /** | 
|  | 152 | * @return A unique identifier for this endpoint on the device | 
|  | 153 | */ | 
|  | 154 | @NonNull | 
|  | 155 | public ParcelUuid getIdentifier() { | 
|  | 156 | return mIdentifier; | 
|  | 157 | } | 
|  | 158 |  | 
|  | 159 | /** | 
|  | 160 | * Converts the provided endpoint type into a human-readable string representation. | 
|  | 161 | * | 
|  | 162 | * @param endpointType to convert into a string. | 
|  | 163 | * @return String representation of the provided endpoint type. | 
|  | 164 | * @hide | 
|  | 165 | */ | 
|  | 166 | @NonNull | 
|  | 167 | public static String endpointTypeToString(int endpointType) { | 
|  | 168 | switch (endpointType) { | 
|  | 169 | case TYPE_EARPIECE: | 
|  | 170 | return "EARPIECE"; | 
|  | 171 | case TYPE_BLUETOOTH: | 
|  | 172 | return "BLUETOOTH"; | 
|  | 173 | case TYPE_WIRED_HEADSET: | 
|  | 174 | return "WIRED_HEADSET"; | 
|  | 175 | case TYPE_SPEAKER: | 
|  | 176 | return "SPEAKER"; | 
|  | 177 | case TYPE_STREAMING: | 
|  | 178 | return "EXTERNAL"; | 
|  | 179 | default: | 
|  | 180 | return "UNKNOWN (" + endpointType + ")"; | 
|  | 181 | } | 
|  | 182 | } | 
|  | 183 |  | 
|  | 184 | /** | 
|  | 185 | * Responsible for creating CallEndpoint objects for deserialized Parcels. | 
|  | 186 | */ | 
|  | 187 | public static final @android.annotation.NonNull Parcelable.Creator<CallEndpoint> CREATOR = | 
|  | 188 | new Parcelable.Creator<CallEndpoint>() { | 
|  | 189 |  | 
|  | 190 | @Override | 
|  | 191 | public CallEndpoint createFromParcel(Parcel source) { | 
|  | 192 | CharSequence name = source.readCharSequence(); | 
|  | 193 | int type = source.readInt(); | 
|  | 194 | ParcelUuid id = ParcelUuid.CREATOR.createFromParcel(source); | 
|  | 195 |  | 
|  | 196 | return new CallEndpoint(name, type, id); | 
|  | 197 | } | 
|  | 198 |  | 
|  | 199 | @Override | 
|  | 200 | public CallEndpoint[] newArray(int size) { | 
|  | 201 | return new CallEndpoint[size]; | 
|  | 202 | } | 
|  | 203 | }; | 
|  | 204 |  | 
|  | 205 | /** | 
|  | 206 | * {@inheritDoc} | 
|  | 207 | */ | 
|  | 208 | @Override | 
|  | 209 | public int describeContents() { | 
|  | 210 | return 0; | 
|  | 211 | } | 
|  | 212 |  | 
|  | 213 | /** | 
|  | 214 | * {@inheritDoc} | 
|  | 215 | */ | 
|  | 216 | @Override | 
|  | 217 | public void writeToParcel(@NonNull Parcel destination, int flags) { | 
|  | 218 | destination.writeCharSequence(mName); | 
|  | 219 | destination.writeInt(mType); | 
|  | 220 | mIdentifier.writeToParcel(destination, flags); | 
|  | 221 | } | 
|  | 222 | } |