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.telephony;
18
19import android.os.Parcel;
20import android.os.Parcelable;
21import android.telephony.DisconnectCause;
22import android.telephony.PreciseDisconnectCause;
23
24/**
25 * Contains precise call state and call fail causes generated by the
26 * framework and the RIL.
27 *
28 * The following call information is included in returned PreciseCallState:
29 *
30 * <ul>
31 *   <li>Ringing call state.
32 *   <li>Foreground call state.
33 *   <li>Background call state.
34 *   <li>Disconnect cause; generated by the framework.
35 *   <li>Precise disconnect cause; generated by the RIL.
36 * </ul>
37 *
38 * @hide
39 */
40public class PreciseCallState implements Parcelable {
41
42    /** Call state is not valid (Not received a call state). */
43    public static final int PRECISE_CALL_STATE_NOT_VALID =      -1;
44    /** Call state: No activity. */
45    public static final int PRECISE_CALL_STATE_IDLE =           0;
46    /** Call state: Active. */
47    public static final int PRECISE_CALL_STATE_ACTIVE =         1;
48    /** Call state: On hold. */
49    public static final int PRECISE_CALL_STATE_HOLDING =        2;
50    /** Call state: Dialing. */
51    public static final int PRECISE_CALL_STATE_DIALING =        3;
52    /** Call state: Alerting. */
53    public static final int PRECISE_CALL_STATE_ALERTING =       4;
54    /** Call state: Incoming. */
55    public static final int PRECISE_CALL_STATE_INCOMING =       5;
56    /** Call state: Waiting. */
57    public static final int PRECISE_CALL_STATE_WAITING =        6;
58    /** Call state: Disconnected. */
59    public static final int PRECISE_CALL_STATE_DISCONNECTED =   7;
60    /** Call state: Disconnecting. */
61    public static final int PRECISE_CALL_STATE_DISCONNECTING =  8;
62
63    private int mRingingCallState = PRECISE_CALL_STATE_NOT_VALID;
64    private int mForegroundCallState = PRECISE_CALL_STATE_NOT_VALID;
65    private int mBackgroundCallState = PRECISE_CALL_STATE_NOT_VALID;
66    private int mDisconnectCause = DisconnectCause.NOT_VALID;
67    private int mPreciseDisconnectCause = PreciseDisconnectCause.NOT_VALID;
68
69    /**
70     * Constructor
71     *
72     * @hide
73     */
74    public PreciseCallState(int ringingCall, int foregroundCall, int backgroundCall,
75            int disconnectCause, int preciseDisconnectCause) {
76        mRingingCallState = ringingCall;
77        mForegroundCallState = foregroundCall;
78        mBackgroundCallState = backgroundCall;
79        mDisconnectCause = disconnectCause;
80        mPreciseDisconnectCause = preciseDisconnectCause;
81    }
82
83    /**
84     * Empty Constructor
85     *
86     * @hide
87     */
88    public PreciseCallState() {
89    }
90
91    /**
92     * Construct a PreciseCallState object from the given parcel.
93     */
94    private PreciseCallState(Parcel in) {
95        mRingingCallState = in.readInt();
96        mForegroundCallState = in.readInt();
97        mBackgroundCallState = in.readInt();
98        mDisconnectCause = in.readInt();
99        mPreciseDisconnectCause = in.readInt();
100    }
101
102    /**
103     * Get precise ringing call state
104     *
105     * @see PreciseCallState#PRECISE_CALL_STATE_NOT_VALID
106     * @see PreciseCallState#PRECISE_CALL_STATE_IDLE
107     * @see PreciseCallState#PRECISE_CALL_STATE_ACTIVE
108     * @see PreciseCallState#PRECISE_CALL_STATE_HOLDING
109     * @see PreciseCallState#PRECISE_CALL_STATE_DIALING
110     * @see PreciseCallState#PRECISE_CALL_STATE_ALERTING
111     * @see PreciseCallState#PRECISE_CALL_STATE_INCOMING
112     * @see PreciseCallState#PRECISE_CALL_STATE_WAITING
113     * @see PreciseCallState#PRECISE_CALL_STATE_DISCONNECTED
114     * @see PreciseCallState#PRECISE_CALL_STATE_DISCONNECTING
115     */
116    public int getRingingCallState() {
117        return mRingingCallState;
118    }
119
120    /**
121     * Get precise foreground call state
122     *
123     * @see PreciseCallState#PRECISE_CALL_STATE_NOT_VALID
124     * @see PreciseCallState#PRECISE_CALL_STATE_IDLE
125     * @see PreciseCallState#PRECISE_CALL_STATE_ACTIVE
126     * @see PreciseCallState#PRECISE_CALL_STATE_HOLDING
127     * @see PreciseCallState#PRECISE_CALL_STATE_DIALING
128     * @see PreciseCallState#PRECISE_CALL_STATE_ALERTING
129     * @see PreciseCallState#PRECISE_CALL_STATE_INCOMING
130     * @see PreciseCallState#PRECISE_CALL_STATE_WAITING
131     * @see PreciseCallState#PRECISE_CALL_STATE_DISCONNECTED
132     * @see PreciseCallState#PRECISE_CALL_STATE_DISCONNECTING
133     */
134    public int getForegroundCallState() {
135        return mForegroundCallState;
136    }
137
138    /**
139     * Get precise background call state
140     *
141     * @see PreciseCallState#PRECISE_CALL_STATE_NOT_VALID
142     * @see PreciseCallState#PRECISE_CALL_STATE_IDLE
143     * @see PreciseCallState#PRECISE_CALL_STATE_ACTIVE
144     * @see PreciseCallState#PRECISE_CALL_STATE_HOLDING
145     * @see PreciseCallState#PRECISE_CALL_STATE_DIALING
146     * @see PreciseCallState#PRECISE_CALL_STATE_ALERTING
147     * @see PreciseCallState#PRECISE_CALL_STATE_INCOMING
148     * @see PreciseCallState#PRECISE_CALL_STATE_WAITING
149     * @see PreciseCallState#PRECISE_CALL_STATE_DISCONNECTED
150     * @see PreciseCallState#PRECISE_CALL_STATE_DISCONNECTING
151     */
152    public int getBackgroundCallState() {
153        return mBackgroundCallState;
154    }
155
156    /**
157     * Get disconnect cause generated by the framework
158     *
159     * @see DisconnectCause#NOT_VALID
160     * @see DisconnectCause#NOT_DISCONNECTED
161     * @see DisconnectCause#INCOMING_MISSED
162     * @see DisconnectCause#NORMAL
163     * @see DisconnectCause#LOCAL
164     * @see DisconnectCause#BUSY
165     * @see DisconnectCause#CONGESTION
166     * @see DisconnectCause#MMI
167     * @see DisconnectCause#INVALID_NUMBER
168     * @see DisconnectCause#NUMBER_UNREACHABLE
169     * @see DisconnectCause#SERVER_UNREACHABLE
170     * @see DisconnectCause#INVALID_CREDENTIALS
171     * @see DisconnectCause#OUT_OF_NETWORK
172     * @see DisconnectCause#SERVER_ERROR
173     * @see DisconnectCause#TIMED_OUT
174     * @see DisconnectCause#LOST_SIGNAL
175     * @see DisconnectCause#LIMIT_EXCEEDED
176     * @see DisconnectCause#INCOMING_REJECTED
177     * @see DisconnectCause#POWER_OFF
178     * @see DisconnectCause#OUT_OF_SERVICE
179     * @see DisconnectCause#ICC_ERROR
180     * @see DisconnectCause#CALL_BARRED
181     * @see DisconnectCause#FDN_BLOCKED
182     * @see DisconnectCause#CS_RESTRICTED
183     * @see DisconnectCause#CS_RESTRICTED_NORMAL
184     * @see DisconnectCause#CS_RESTRICTED_EMERGENCY
185     * @see DisconnectCause#UNOBTAINABLE_NUMBER
186     * @see DisconnectCause#CDMA_LOCKED_UNTIL_POWER_CYCLE
187     * @see DisconnectCause#CDMA_DROP
188     * @see DisconnectCause#CDMA_INTERCEPT
189     * @see DisconnectCause#CDMA_REORDER
190     * @see DisconnectCause#CDMA_SO_REJECT
191     * @see DisconnectCause#CDMA_RETRY_ORDER
192     * @see DisconnectCause#CDMA_ACCESS_FAILURE
193     * @see DisconnectCause#CDMA_PREEMPTED
194     * @see DisconnectCause#CDMA_NOT_EMERGENCY
195     * @see DisconnectCause#CDMA_ACCESS_BLOCKED
196     * @see DisconnectCause#ERROR_UNSPECIFIED
197     */
198    public int getDisconnectCause() {
199        return mDisconnectCause;
200    }
201
202    /**
203     * Get disconnect cause generated by the RIL
204     *
205     * @see PreciseDisconnectCause#NOT_VALID
206     * @see PreciseDisconnectCause#NO_DISCONNECT_CAUSE_AVAILABLE
207     * @see PreciseDisconnectCause#UNOBTAINABLE_NUMBER
208     * @see PreciseDisconnectCause#NORMAL
209     * @see PreciseDisconnectCause#BUSY
210     * @see PreciseDisconnectCause#NUMBER_CHANGED
211     * @see PreciseDisconnectCause#STATUS_ENQUIRY
212     * @see PreciseDisconnectCause#NORMAL_UNSPECIFIED
213     * @see PreciseDisconnectCause#NO_CIRCUIT_AVAIL
214     * @see PreciseDisconnectCause#TEMPORARY_FAILURE
215     * @see PreciseDisconnectCause#SWITCHING_CONGESTION
216     * @see PreciseDisconnectCause#CHANNEL_NOT_AVAIL
217     * @see PreciseDisconnectCause#QOS_NOT_AVAIL
218     * @see PreciseDisconnectCause#BEARER_NOT_AVAIL
219     * @see PreciseDisconnectCause#ACM_LIMIT_EXCEEDED
220     * @see PreciseDisconnectCause#CALL_BARRED
221     * @see PreciseDisconnectCause#FDN_BLOCKED
222     * @see PreciseDisconnectCause#IMSI_UNKNOWN_IN_VLR
223     * @see PreciseDisconnectCause#IMEI_NOT_ACCEPTED
224     * @see PreciseDisconnectCause#CDMA_LOCKED_UNTIL_POWER_CYCLE
225     * @see PreciseDisconnectCause#CDMA_DROP
226     * @see PreciseDisconnectCause#CDMA_INTERCEPT
227     * @see PreciseDisconnectCause#CDMA_REORDER
228     * @see PreciseDisconnectCause#CDMA_SO_REJECT
229     * @see PreciseDisconnectCause#CDMA_RETRY_ORDER
230     * @see PreciseDisconnectCause#CDMA_ACCESS_FAILURE
231     * @see PreciseDisconnectCause#CDMA_PREEMPTED
232     * @see PreciseDisconnectCause#CDMA_NOT_EMERGENCY
233     * @see PreciseDisconnectCause#CDMA_ACCESS_BLOCKED
234     * @see PreciseDisconnectCause#ERROR_UNSPECIFIED
235     */
236    public int getPreciseDisconnectCause() {
237        return mPreciseDisconnectCause;
238    }
239
240    @Override
241    public int describeContents() {
242        return 0;
243    }
244
245    @Override
246    public void writeToParcel(Parcel out, int flags) {
247        out.writeInt(mRingingCallState);
248        out.writeInt(mForegroundCallState);
249        out.writeInt(mBackgroundCallState);
250        out.writeInt(mDisconnectCause);
251        out.writeInt(mPreciseDisconnectCause);
252    }
253
254    public static final Parcelable.Creator<PreciseCallState> CREATOR
255            = new Parcelable.Creator<PreciseCallState>() {
256
257        public PreciseCallState createFromParcel(Parcel in) {
258            return new PreciseCallState(in);
259        }
260
261        public PreciseCallState[] newArray(int size) {
262            return new PreciseCallState[size];
263        }
264    };
265
266    @Override
267    public int hashCode() {
268        final int prime = 31;
269        int result = 1;
270        result = prime * result + mRingingCallState;
271        result = prime * result + mForegroundCallState;
272        result = prime * result + mBackgroundCallState;
273        result = prime * result + mDisconnectCause;
274        result = prime * result + mPreciseDisconnectCause;
275        return result;
276    }
277
278    @Override
279    public boolean equals(Object obj) {
280        if (this == obj) {
281            return true;
282        }
283        if (obj == null) {
284            return false;
285        }
286        if (getClass() != obj.getClass()) {
287            return false;
288        }
289        PreciseCallState other = (PreciseCallState) obj;
290        return (mRingingCallState != other.mRingingCallState &&
291            mForegroundCallState != other.mForegroundCallState &&
292            mBackgroundCallState != other.mBackgroundCallState &&
293            mDisconnectCause != other.mDisconnectCause &&
294            mPreciseDisconnectCause != other.mPreciseDisconnectCause);
295    }
296
297    @Override
298    public String toString() {
299        StringBuffer sb = new StringBuffer();
300
301        sb.append("Ringing call state: " + mRingingCallState);
302        sb.append(", Foreground call state: " + mForegroundCallState);
303        sb.append(", Background call state: " + mBackgroundCallState);
304        sb.append(", Disconnect cause: " + mDisconnectCause);
305        sb.append(", Precise disconnect cause: " + mPreciseDisconnectCause);
306
307        return sb.toString();
308    }
309}
310