Home | History | Annotate | Download | only in bluetooth
      1 /*
      2  * Copyright (C) 2014 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.bluetooth;
     18 
     19 import android.annotation.UnsupportedAppUsage;
     20 import android.os.Parcel;
     21 import android.os.Parcelable;
     22 import android.os.SystemClock;
     23 
     24 import java.util.UUID;
     25 
     26 /**
     27  * This class represents a single call, its state and properties.
     28  * It implements {@link Parcelable} for inter-process message passing.
     29  *
     30  * @hide
     31  */
     32 public final class BluetoothHeadsetClientCall implements Parcelable {
     33 
     34     /* Call state */
     35     /**
     36      * Call is active.
     37      */
     38     public static final int CALL_STATE_ACTIVE = 0;
     39     /**
     40      * Call is in held state.
     41      */
     42     public static final int CALL_STATE_HELD = 1;
     43     /**
     44      * Outgoing call that is being dialed right now.
     45      */
     46     public static final int CALL_STATE_DIALING = 2;
     47     /**
     48      * Outgoing call that remote party has already been alerted about.
     49      */
     50     public static final int CALL_STATE_ALERTING = 3;
     51     /**
     52      * Incoming call that can be accepted or rejected.
     53      */
     54     public static final int CALL_STATE_INCOMING = 4;
     55     /**
     56      * Waiting call state when there is already an active call.
     57      */
     58     public static final int CALL_STATE_WAITING = 5;
     59     /**
     60      * Call that has been held by response and hold
     61      * (see Bluetooth specification for further references).
     62      */
     63     public static final int CALL_STATE_HELD_BY_RESPONSE_AND_HOLD = 6;
     64     /**
     65      * Call that has been already terminated and should not be referenced as a valid call.
     66      */
     67     public static final int CALL_STATE_TERMINATED = 7;
     68 
     69     private final BluetoothDevice mDevice;
     70     private final int mId;
     71     private int mState;
     72     private String mNumber;
     73     private boolean mMultiParty;
     74     private final boolean mOutgoing;
     75     private final UUID mUUID;
     76     private final long mCreationElapsedMilli;
     77     private final boolean mInBandRing;
     78 
     79     /**
     80      * Creates BluetoothHeadsetClientCall instance.
     81      */
     82     public BluetoothHeadsetClientCall(BluetoothDevice device, int id, int state, String number,
     83             boolean multiParty, boolean outgoing, boolean inBandRing) {
     84         this(device, id, UUID.randomUUID(), state, number, multiParty, outgoing, inBandRing);
     85     }
     86 
     87     public BluetoothHeadsetClientCall(BluetoothDevice device, int id, UUID uuid, int state,
     88             String number, boolean multiParty, boolean outgoing, boolean inBandRing) {
     89         mDevice = device;
     90         mId = id;
     91         mUUID = uuid;
     92         mState = state;
     93         mNumber = number != null ? number : "";
     94         mMultiParty = multiParty;
     95         mOutgoing = outgoing;
     96         mInBandRing = inBandRing;
     97         mCreationElapsedMilli = SystemClock.elapsedRealtime();
     98     }
     99 
    100     /**
    101      * Sets call's state.
    102      *
    103      * <p>Note: This is an internal function and shouldn't be exposed</p>
    104      *
    105      * @param state new call state.
    106      */
    107     public void setState(int state) {
    108         mState = state;
    109     }
    110 
    111     /**
    112      * Sets call's number.
    113      *
    114      * <p>Note: This is an internal function and shouldn't be exposed</p>
    115      *
    116      * @param number String representing phone number.
    117      */
    118     public void setNumber(String number) {
    119         mNumber = number;
    120     }
    121 
    122     /**
    123      * Sets this call as multi party call.
    124      *
    125      * <p>Note: This is an internal function and shouldn't be exposed</p>
    126      *
    127      * @param multiParty if <code>true</code> sets this call as a part of multi party conference.
    128      */
    129     public void setMultiParty(boolean multiParty) {
    130         mMultiParty = multiParty;
    131     }
    132 
    133     /**
    134      * Gets call's device.
    135      *
    136      * @return call device.
    137      */
    138     public BluetoothDevice getDevice() {
    139         return mDevice;
    140     }
    141 
    142     /**
    143      * Gets call's Id.
    144      *
    145      * @return call id.
    146      */
    147     @UnsupportedAppUsage
    148     public int getId() {
    149         return mId;
    150     }
    151 
    152     /**
    153      * Gets call's UUID.
    154      *
    155      * @return call uuid
    156      * @hide
    157      */
    158     public UUID getUUID() {
    159         return mUUID;
    160     }
    161 
    162     /**
    163      * Gets call's current state.
    164      *
    165      * @return state of this particular phone call.
    166      */
    167     @UnsupportedAppUsage
    168     public int getState() {
    169         return mState;
    170     }
    171 
    172     /**
    173      * Gets call's number.
    174      *
    175      * @return string representing phone number.
    176      */
    177     @UnsupportedAppUsage
    178     public String getNumber() {
    179         return mNumber;
    180     }
    181 
    182     /**
    183      * Gets call's creation time in millis since epoch.
    184      *
    185      * @return long representing the creation time.
    186      */
    187     public long getCreationElapsedMilli() {
    188         return mCreationElapsedMilli;
    189     }
    190 
    191     /**
    192      * Checks if call is an active call in a conference mode (aka multi party).
    193      *
    194      * @return <code>true</code> if call is a multi party call, <code>false</code> otherwise.
    195      */
    196     @UnsupportedAppUsage
    197     public boolean isMultiParty() {
    198         return mMultiParty;
    199     }
    200 
    201     /**
    202      * Checks if this call is an outgoing call.
    203      *
    204      * @return <code>true</code> if its outgoing call, <code>false</code> otherwise.
    205      */
    206     @UnsupportedAppUsage
    207     public boolean isOutgoing() {
    208         return mOutgoing;
    209     }
    210 
    211     /**
    212      * Checks if the ringtone will be generated by the connected phone
    213      *
    214      * @return <code>true</code> if in band ring is enabled, <code>false</code> otherwise.
    215      */
    216     public boolean isInBandRing() {
    217         return mInBandRing;
    218     }
    219 
    220 
    221     @Override
    222     public String toString() {
    223         return toString(false);
    224     }
    225 
    226     /**
    227      * Generate a log string for this call
    228      * @param loggable whether device address should be logged
    229      * @return log string
    230      */
    231     public String toString(boolean loggable) {
    232         StringBuilder builder = new StringBuilder("BluetoothHeadsetClientCall{mDevice: ");
    233         builder.append(loggable ? mDevice : mDevice.hashCode());
    234         builder.append(", mId: ");
    235         builder.append(mId);
    236         builder.append(", mUUID: ");
    237         builder.append(mUUID);
    238         builder.append(", mState: ");
    239         switch (mState) {
    240             case CALL_STATE_ACTIVE:
    241                 builder.append("ACTIVE");
    242                 break;
    243             case CALL_STATE_HELD:
    244                 builder.append("HELD");
    245                 break;
    246             case CALL_STATE_DIALING:
    247                 builder.append("DIALING");
    248                 break;
    249             case CALL_STATE_ALERTING:
    250                 builder.append("ALERTING");
    251                 break;
    252             case CALL_STATE_INCOMING:
    253                 builder.append("INCOMING");
    254                 break;
    255             case CALL_STATE_WAITING:
    256                 builder.append("WAITING");
    257                 break;
    258             case CALL_STATE_HELD_BY_RESPONSE_AND_HOLD:
    259                 builder.append("HELD_BY_RESPONSE_AND_HOLD");
    260                 break;
    261             case CALL_STATE_TERMINATED:
    262                 builder.append("TERMINATED");
    263                 break;
    264             default:
    265                 builder.append(mState);
    266                 break;
    267         }
    268         builder.append(", mNumber: ");
    269         builder.append(loggable ? mNumber : mNumber.hashCode());
    270         builder.append(", mMultiParty: ");
    271         builder.append(mMultiParty);
    272         builder.append(", mOutgoing: ");
    273         builder.append(mOutgoing);
    274         builder.append(", mInBandRing: ");
    275         builder.append(mInBandRing);
    276         builder.append("}");
    277         return builder.toString();
    278     }
    279 
    280     /**
    281      * {@link Parcelable.Creator} interface implementation.
    282      */
    283     public static final @android.annotation.NonNull Parcelable.Creator<BluetoothHeadsetClientCall> CREATOR =
    284             new Parcelable.Creator<BluetoothHeadsetClientCall>() {
    285                 @Override
    286                 public BluetoothHeadsetClientCall createFromParcel(Parcel in) {
    287                     return new BluetoothHeadsetClientCall((BluetoothDevice) in.readParcelable(null),
    288                             in.readInt(), UUID.fromString(in.readString()), in.readInt(),
    289                             in.readString(), in.readInt() == 1, in.readInt() == 1,
    290                             in.readInt() == 1);
    291                 }
    292 
    293                 @Override
    294                 public BluetoothHeadsetClientCall[] newArray(int size) {
    295                     return new BluetoothHeadsetClientCall[size];
    296                 }
    297             };
    298 
    299     @Override
    300     public void writeToParcel(Parcel out, int flags) {
    301         out.writeParcelable(mDevice, 0);
    302         out.writeInt(mId);
    303         out.writeString(mUUID.toString());
    304         out.writeInt(mState);
    305         out.writeString(mNumber);
    306         out.writeInt(mMultiParty ? 1 : 0);
    307         out.writeInt(mOutgoing ? 1 : 0);
    308         out.writeInt(mInBandRing ? 1 : 0);
    309     }
    310 
    311     @Override
    312     public int describeContents() {
    313         return 0;
    314     }
    315 }
    316