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