1f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon/*
2f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon * Copyright (C) 2013 The Android Open Source Project
3f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon *
4f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon * Licensed under the Apache License, Version 2.0 (the "License");
5f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon * you may not use this file except in compliance with the License.
6f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon * You may obtain a copy of the License at
7f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon *
8f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon *      http://www.apache.org/licenses/LICENSE-2.0
9f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon *
10f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon * Unless required by applicable law or agreed to in writing, software
11f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon * distributed under the License is distributed on an "AS IS" BASIS,
12f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon * See the License for the specific language governing permissions and
14f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon * limitations under the License.
15f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon */
16f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon
17f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordonpackage com.android.services.telephony.common;
18f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon
196c6b27265806a053193b8ccbc57f66b1feb8e5abChiao Chengimport android.os.Parcel;
206c6b27265806a053193b8ccbc57f66b1feb8e5abChiao Chengimport android.os.Parcelable;
216c6b27265806a053193b8ccbc57f66b1feb8e5abChiao Cheng
226c6b27265806a053193b8ccbc57f66b1feb8e5abChiao Chengimport com.android.internal.telephony.PhoneConstants;
234ad64cd167e942b1dd132106750f4c221e3bf1a9Santos Cordonimport com.google.android.collect.Sets;
246c6b27265806a053193b8ccbc57f66b1feb8e5abChiao Chengimport com.google.common.base.Objects;
25593ab38970a84a60ac39edba4306647c8b66436dSantos Cordonimport com.google.common.collect.ImmutableMap;
264ad64cd167e942b1dd132106750f4c221e3bf1a9Santos Cordonimport com.google.common.collect.ImmutableSortedSet;
274ad64cd167e942b1dd132106750f4c221e3bf1a9Santos Cordonimport com.google.common.primitives.Ints;
28593ab38970a84a60ac39edba4306647c8b66436dSantos Cordon
29593ab38970a84a60ac39edba4306647c8b66436dSantos Cordonimport java.util.Map;
304ad64cd167e942b1dd132106750f4c221e3bf1a9Santos Cordonimport java.util.SortedSet;
316c6b27265806a053193b8ccbc57f66b1feb8e5abChiao Chengimport java.util.TreeSet;
32c8f32e7cd96a678961865750d5c7ce75feb5a1e6Yorke Lee
33f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon/**
34f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon * Class object used across CallHandlerService APIs.
35f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon * Describes a single call and its state.
36f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon */
376c6b27265806a053193b8ccbc57f66b1feb8e5abChiao Chengpublic final class Call implements Parcelable {
38f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon
39f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon    public static final int INVALID_CALL_ID = -1;
404ad64cd167e942b1dd132106750f4c221e3bf1a9Santos Cordon    public static final int MAX_CONFERENCED_CALLS = 5;
41f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon
42a3d0514c3480db25a813d8841c39e965f2925180Santos Cordon    /* Defines different states of this call */
43a3d0514c3480db25a813d8841c39e965f2925180Santos Cordon    public static class State {
44a3d0514c3480db25a813d8841c39e965f2925180Santos Cordon        public static final int INVALID = 0;
458b3538a19c78d13a4f775714d48177ba3f275a7aSantos Cordon        public static final int IDLE = 1;           /* The call is idle.  Nothing active */
468b3538a19c78d13a4f775714d48177ba3f275a7aSantos Cordon        public static final int ACTIVE = 2;         /* There is an active call */
478b3538a19c78d13a4f775714d48177ba3f275a7aSantos Cordon        public static final int INCOMING = 3;       /* A normal incoming phone call */
488b3538a19c78d13a4f775714d48177ba3f275a7aSantos Cordon        public static final int CALL_WAITING = 4;   /* Incoming call while another is active */
498b3538a19c78d13a4f775714d48177ba3f275a7aSantos Cordon        public static final int DIALING = 5;        /* An outgoing call during dial phase */
50ce02f3a2f1bb13c7d0c4db523e6b4408ce2a8446Santos Cordon        public static final int REDIALING = 6;      /* Subsequent dialing attempt after a failure */
51ce02f3a2f1bb13c7d0c4db523e6b4408ce2a8446Santos Cordon        public static final int ONHOLD = 7;         /* An active phone call placed on hold */
52ce02f3a2f1bb13c7d0c4db523e6b4408ce2a8446Santos Cordon        public static final int DISCONNECTING = 8;  /* A call is being ended. */
53ce02f3a2f1bb13c7d0c4db523e6b4408ce2a8446Santos Cordon        public static final int DISCONNECTED = 9;   /* State after a call disconnects */
54ce02f3a2f1bb13c7d0c4db523e6b4408ce2a8446Santos Cordon        public static final int CONFERENCED = 10;   /* Call part of a conference call */
5569a691914e9b013a7ff52c129d8466c152ed7239Santos Cordon
5669a691914e9b013a7ff52c129d8466c152ed7239Santos Cordon        public static boolean isConnected(int state) {
5769a691914e9b013a7ff52c129d8466c152ed7239Santos Cordon            switch(state) {
5869a691914e9b013a7ff52c129d8466c152ed7239Santos Cordon                case ACTIVE:
5969a691914e9b013a7ff52c129d8466c152ed7239Santos Cordon                case INCOMING:
6069a691914e9b013a7ff52c129d8466c152ed7239Santos Cordon                case CALL_WAITING:
6169a691914e9b013a7ff52c129d8466c152ed7239Santos Cordon                case DIALING:
62ce02f3a2f1bb13c7d0c4db523e6b4408ce2a8446Santos Cordon                case REDIALING:
6369a691914e9b013a7ff52c129d8466c152ed7239Santos Cordon                case ONHOLD:
6469a691914e9b013a7ff52c129d8466c152ed7239Santos Cordon                case CONFERENCED:
6569a691914e9b013a7ff52c129d8466c152ed7239Santos Cordon                    return true;
6669a691914e9b013a7ff52c129d8466c152ed7239Santos Cordon                default:
6769a691914e9b013a7ff52c129d8466c152ed7239Santos Cordon            }
6869a691914e9b013a7ff52c129d8466c152ed7239Santos Cordon            return false;
6969a691914e9b013a7ff52c129d8466c152ed7239Santos Cordon        }
70ce02f3a2f1bb13c7d0c4db523e6b4408ce2a8446Santos Cordon
71ce02f3a2f1bb13c7d0c4db523e6b4408ce2a8446Santos Cordon        public static boolean isDialing(int state) {
72ce02f3a2f1bb13c7d0c4db523e6b4408ce2a8446Santos Cordon            return state == DIALING || state == REDIALING;
73ce02f3a2f1bb13c7d0c4db523e6b4408ce2a8446Santos Cordon        }
748b3538a19c78d13a4f775714d48177ba3f275a7aSantos Cordon    }
75a3d0514c3480db25a813d8841c39e965f2925180Santos Cordon
768b3538a19c78d13a4f775714d48177ba3f275a7aSantos Cordon    /**
778b3538a19c78d13a4f775714d48177ba3f275a7aSantos Cordon     * Defines a set of capabilities that a call can have as a bit mask.
78eead6ec450160d3c96be2ec77a48401ac67171aaSantos Cordon     * TODO: Should some of these be capabilities of the Phone instead of the call?
79ce02f3a2f1bb13c7d0c4db523e6b4408ce2a8446Santos Cordon     * TODO: This is starting to be a mix of capabilities and call properties.  Capabilities
80ce02f3a2f1bb13c7d0c4db523e6b4408ce2a8446Santos Cordon     *       and properties should be separated.
818b3538a19c78d13a4f775714d48177ba3f275a7aSantos Cordon     */
828b3538a19c78d13a4f775714d48177ba3f275a7aSantos Cordon    public static class Capabilities {
83ad1ed6d23c4a999a41bb73b8243009e32f96d7dfSantos Cordon        public static final int HOLD               = 0x00000001; /* has ability to hold the call */
84ad1ed6d23c4a999a41bb73b8243009e32f96d7dfSantos Cordon        public static final int SUPPORT_HOLD       = 0x00000002; /* can show the hold button */
85ad1ed6d23c4a999a41bb73b8243009e32f96d7dfSantos Cordon        public static final int MERGE_CALLS        = 0x00000004; /* has ability to merge calls */
86ad1ed6d23c4a999a41bb73b8243009e32f96d7dfSantos Cordon        public static final int SWAP_CALLS         = 0x00000008; /* swap with a background call */
87ad1ed6d23c4a999a41bb73b8243009e32f96d7dfSantos Cordon        public static final int ADD_CALL           = 0x00000010; /* add another call to this one */
88ad1ed6d23c4a999a41bb73b8243009e32f96d7dfSantos Cordon        public static final int RESPOND_VIA_TEXT   = 0x00000020; /* has respond via text option */
89ad1ed6d23c4a999a41bb73b8243009e32f96d7dfSantos Cordon        public static final int MUTE               = 0x00000040; /* can mute the call */
90ad1ed6d23c4a999a41bb73b8243009e32f96d7dfSantos Cordon        public static final int GENERIC_CONFERENCE = 0x00000080; /* Generic conference mode */
91e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon
92af2fd0ad9669ce110dfcf13bb7bf996e8a387a91Christine Chen        public static final int ALL = HOLD | SUPPORT_HOLD | MERGE_CALLS | SWAP_CALLS | ADD_CALL
93ad1ed6d23c4a999a41bb73b8243009e32f96d7dfSantos Cordon                | RESPOND_VIA_TEXT | MUTE | GENERIC_CONFERENCE;
94e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon    }
95e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon
96e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon    /**
97e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon     * Copy of states found in Connection object since Connection object is not available to the UI
98e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon     * code.
99e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon     * TODO: Consider cutting this down to only the types used by the UI.
100e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon     * TODO: Consider adding a CUSTOM cause type and a customDisconnect member variable to
101e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon     *       the Call object.  This would allow OEMs to extend the cause list without
102e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon     *       needing to alter our implementation.
103e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon     */
104e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon    public enum DisconnectCause {
105e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon        NOT_DISCONNECTED,               /* has not yet disconnected */
106e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon        INCOMING_MISSED,                /* an incoming call that was missed and never answered */
107e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon        NORMAL,                         /* normal; remote */
108e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon        LOCAL,                          /* normal; local hangup */
109e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon        BUSY,                           /* outgoing call to busy line */
110e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon        CONGESTION,                     /* outgoing call to congested network */
111e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon        MMI,                            /* not presently used; dial() returns null */
112e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon        INVALID_NUMBER,                 /* invalid dial string */
113e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon        NUMBER_UNREACHABLE,             /* cannot reach the peer */
114e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon        SERVER_UNREACHABLE,             /* cannot reach the server */
115e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon        INVALID_CREDENTIALS,            /* invalid credentials */
116e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon        OUT_OF_NETWORK,                 /* calling from out of network is not allowed */
117e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon        SERVER_ERROR,                   /* server error */
118e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon        TIMED_OUT,                      /* client timed out */
119e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon        LOST_SIGNAL,
120e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon        LIMIT_EXCEEDED,                 /* eg GSM ACM limit exceeded */
121e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon        INCOMING_REJECTED,              /* an incoming call that was rejected */
122e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon        POWER_OFF,                      /* radio is turned off explicitly */
123e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon        OUT_OF_SERVICE,                 /* out of service */
124e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon        ICC_ERROR,                      /* No ICC, ICC locked, or other ICC error */
125e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon        CALL_BARRED,                    /* call was blocked by call barring */
126e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon        FDN_BLOCKED,                    /* call was blocked by fixed dial number */
127e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon        CS_RESTRICTED,                  /* call was blocked by restricted all voice access */
128e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon        CS_RESTRICTED_NORMAL,           /* call was blocked by restricted normal voice access */
129e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon        CS_RESTRICTED_EMERGENCY,        /* call was blocked by restricted emergency voice access */
130e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon        UNOBTAINABLE_NUMBER,            /* Unassigned number (3GPP TS 24.008 table 10.5.123) */
131e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon        CDMA_LOCKED_UNTIL_POWER_CYCLE,  /* MS is locked until next power cycle */
132e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon        CDMA_DROP,
133e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon        CDMA_INTERCEPT,                 /* INTERCEPT order received, MS state idle entered */
134e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon        CDMA_REORDER,                   /* MS has been redirected, call is cancelled */
135e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon        CDMA_SO_REJECT,                 /* service option rejection */
136e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon        CDMA_RETRY_ORDER,               /* requested service is rejected, retry delay is set */
137e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon        CDMA_ACCESS_FAILURE,
138e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon        CDMA_PREEMPTED,
139e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon        CDMA_NOT_EMERGENCY,              /* not an emergency call */
140e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon        CDMA_ACCESS_BLOCKED,            /* Access Blocked by CDMA network */
141e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon        ERROR_UNSPECIFIED,
142e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon
143e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon        UNKNOWN                         /* Disconnect cause doesn't map to any above */
144a3d0514c3480db25a813d8841c39e965f2925180Santos Cordon    }
145a3d0514c3480db25a813d8841c39e965f2925180Santos Cordon
146593ab38970a84a60ac39edba4306647c8b66436dSantos Cordon    private static final Map<Integer, String> STATE_MAP = ImmutableMap.<Integer, String>builder()
147593ab38970a84a60ac39edba4306647c8b66436dSantos Cordon            .put(Call.State.ACTIVE, "ACTIVE")
148593ab38970a84a60ac39edba4306647c8b66436dSantos Cordon            .put(Call.State.CALL_WAITING, "CALL_WAITING")
149593ab38970a84a60ac39edba4306647c8b66436dSantos Cordon            .put(Call.State.DIALING, "DIALING")
150ce02f3a2f1bb13c7d0c4db523e6b4408ce2a8446Santos Cordon            .put(Call.State.REDIALING, "REDIALING")
151593ab38970a84a60ac39edba4306647c8b66436dSantos Cordon            .put(Call.State.IDLE, "IDLE")
152593ab38970a84a60ac39edba4306647c8b66436dSantos Cordon            .put(Call.State.INCOMING, "INCOMING")
153593ab38970a84a60ac39edba4306647c8b66436dSantos Cordon            .put(Call.State.ONHOLD, "ONHOLD")
154593ab38970a84a60ac39edba4306647c8b66436dSantos Cordon            .put(Call.State.INVALID, "INVALID")
1553e0f0414daa2266dc51b77198fe433797f7d610aChristine Chen            .put(Call.State.DISCONNECTING, "DISCONNECTING")
156e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon            .put(Call.State.DISCONNECTED, "DISCONNECTED")
1574ad64cd167e942b1dd132106750f4c221e3bf1a9Santos Cordon            .put(Call.State.CONFERENCED, "CONFERENCED")
158593ab38970a84a60ac39edba4306647c8b66436dSantos Cordon            .build();
159593ab38970a84a60ac39edba4306647c8b66436dSantos Cordon
160c8f32e7cd96a678961865750d5c7ce75feb5a1e6Yorke Lee    // Number presentation type for caller id display
161c8f32e7cd96a678961865750d5c7ce75feb5a1e6Yorke Lee    // normal
162c8f32e7cd96a678961865750d5c7ce75feb5a1e6Yorke Lee    public static int PRESENTATION_ALLOWED = PhoneConstants.PRESENTATION_ALLOWED;
163c8f32e7cd96a678961865750d5c7ce75feb5a1e6Yorke Lee    // block by user
164c8f32e7cd96a678961865750d5c7ce75feb5a1e6Yorke Lee    public static int PRESENTATION_RESTRICTED = PhoneConstants.PRESENTATION_RESTRICTED;
165c8f32e7cd96a678961865750d5c7ce75feb5a1e6Yorke Lee    // no specified or unknown by network
166c8f32e7cd96a678961865750d5c7ce75feb5a1e6Yorke Lee    public static int PRESENTATION_UNKNOWN = PhoneConstants.PRESENTATION_UNKNOWN;
167c8f32e7cd96a678961865750d5c7ce75feb5a1e6Yorke Lee    // show pay phone info
168c8f32e7cd96a678961865750d5c7ce75feb5a1e6Yorke Lee    public static int PRESENTATION_PAYPHONE = PhoneConstants.PRESENTATION_PAYPHONE;
169c8f32e7cd96a678961865750d5c7ce75feb5a1e6Yorke Lee
170bbe8ecf9f2f8733f6e0a7c8e88082bd98dea8b98Santos Cordon    // Unique identifier for the call
1716c6b27265806a053193b8ccbc57f66b1feb8e5abChiao Cheng    private int mCallId;
172bbe8ecf9f2f8733f6e0a7c8e88082bd98dea8b98Santos Cordon
1736c6b27265806a053193b8ccbc57f66b1feb8e5abChiao Cheng    private CallIdentification mIdentification;
174bbe8ecf9f2f8733f6e0a7c8e88082bd98dea8b98Santos Cordon
175bbe8ecf9f2f8733f6e0a7c8e88082bd98dea8b98Santos Cordon    // The current state of the call
176a3d0514c3480db25a813d8841c39e965f2925180Santos Cordon    private int mState = State.INVALID;
177bbe8ecf9f2f8733f6e0a7c8e88082bd98dea8b98Santos Cordon
178bbe8ecf9f2f8733f6e0a7c8e88082bd98dea8b98Santos Cordon    // Reason for disconnect. Valid when the call state is DISCONNECTED.
1794ad64cd167e942b1dd132106750f4c221e3bf1a9Santos Cordon    private DisconnectCause mDisconnectCause = DisconnectCause.UNKNOWN;
180bbe8ecf9f2f8733f6e0a7c8e88082bd98dea8b98Santos Cordon
181bbe8ecf9f2f8733f6e0a7c8e88082bd98dea8b98Santos Cordon    // Bit mask of capabilities unique to this call.
1828b3538a19c78d13a4f775714d48177ba3f275a7aSantos Cordon    private int mCapabilities;
183f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon
184bbe8ecf9f2f8733f6e0a7c8e88082bd98dea8b98Santos Cordon    // Time that this call transitioned into ACTIVE state from INCOMING, WAITING, or OUTGOING.
1854ad64cd167e942b1dd132106750f4c221e3bf1a9Santos Cordon    private long mConnectTime = 0;
1864ad64cd167e942b1dd132106750f4c221e3bf1a9Santos Cordon
1874ad64cd167e942b1dd132106750f4c221e3bf1a9Santos Cordon    // List of call Ids for for this call.  (Used for managing conference calls).
1884ad64cd167e942b1dd132106750f4c221e3bf1a9Santos Cordon    private SortedSet<Integer> mChildCallIds = Sets.newSortedSet();
189bbe8ecf9f2f8733f6e0a7c8e88082bd98dea8b98Santos Cordon
19069a691914e9b013a7ff52c129d8466c152ed7239Santos Cordon    // Gateway number used to dial this call
19169a691914e9b013a7ff52c129d8466c152ed7239Santos Cordon    private String mGatewayNumber;
19269a691914e9b013a7ff52c129d8466c152ed7239Santos Cordon
19369a691914e9b013a7ff52c129d8466c152ed7239Santos Cordon    // Gateway service package name
19469a691914e9b013a7ff52c129d8466c152ed7239Santos Cordon    private String mGatewayPackage;
19569a691914e9b013a7ff52c129d8466c152ed7239Santos Cordon
196f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon    public Call(int callId) {
197f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon        mCallId = callId;
1986c6b27265806a053193b8ccbc57f66b1feb8e5abChiao Cheng        mIdentification = new CallIdentification(mCallId);
1996c6b27265806a053193b8ccbc57f66b1feb8e5abChiao Cheng    }
2006c6b27265806a053193b8ccbc57f66b1feb8e5abChiao Cheng
2016c6b27265806a053193b8ccbc57f66b1feb8e5abChiao Cheng    public Call(Call call) {
2026c6b27265806a053193b8ccbc57f66b1feb8e5abChiao Cheng        mCallId = call.mCallId;
2036c6b27265806a053193b8ccbc57f66b1feb8e5abChiao Cheng        mIdentification = new CallIdentification(call.mIdentification);
2046c6b27265806a053193b8ccbc57f66b1feb8e5abChiao Cheng        mState = call.mState;
2056c6b27265806a053193b8ccbc57f66b1feb8e5abChiao Cheng        mDisconnectCause = call.mDisconnectCause;
2066c6b27265806a053193b8ccbc57f66b1feb8e5abChiao Cheng        mCapabilities = call.mCapabilities;
2076c6b27265806a053193b8ccbc57f66b1feb8e5abChiao Cheng        mConnectTime = call.mConnectTime;
2086c6b27265806a053193b8ccbc57f66b1feb8e5abChiao Cheng        mChildCallIds = new TreeSet<Integer>(call.mChildCallIds);
2096c6b27265806a053193b8ccbc57f66b1feb8e5abChiao Cheng        mGatewayNumber = call.mGatewayNumber;
2106c6b27265806a053193b8ccbc57f66b1feb8e5abChiao Cheng        mGatewayPackage = call.mGatewayPackage;
211f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon    }
212f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon
213f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon    public int getCallId() {
214f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon        return mCallId;
215f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon    }
216f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon
2176c6b27265806a053193b8ccbc57f66b1feb8e5abChiao Cheng    public CallIdentification getIdentification() {
2186c6b27265806a053193b8ccbc57f66b1feb8e5abChiao Cheng        return mIdentification;
2196c6b27265806a053193b8ccbc57f66b1feb8e5abChiao Cheng    }
2206c6b27265806a053193b8ccbc57f66b1feb8e5abChiao Cheng
221995c816b6a596ccd48628c1da4199ea9e8a830b2Santos Cordon    public String getNumber() {
2226c6b27265806a053193b8ccbc57f66b1feb8e5abChiao Cheng        return mIdentification.getNumber();
223995c816b6a596ccd48628c1da4199ea9e8a830b2Santos Cordon    }
224995c816b6a596ccd48628c1da4199ea9e8a830b2Santos Cordon
225179907ffde3b1c48737992ef35eb19f6b0259065Santos Cordon    public void setNumber(String number) {
2266c6b27265806a053193b8ccbc57f66b1feb8e5abChiao Cheng        mIdentification.setNumber(number);
227179907ffde3b1c48737992ef35eb19f6b0259065Santos Cordon    }
228179907ffde3b1c48737992ef35eb19f6b0259065Santos Cordon
229a3d0514c3480db25a813d8841c39e965f2925180Santos Cordon    public int getState() {
230a3d0514c3480db25a813d8841c39e965f2925180Santos Cordon        return mState;
231a3d0514c3480db25a813d8841c39e965f2925180Santos Cordon    }
232a3d0514c3480db25a813d8841c39e965f2925180Santos Cordon
233a3d0514c3480db25a813d8841c39e965f2925180Santos Cordon    public void setState(int state) {
234a3d0514c3480db25a813d8841c39e965f2925180Santos Cordon        mState = state;
235a3d0514c3480db25a813d8841c39e965f2925180Santos Cordon    }
236a3d0514c3480db25a813d8841c39e965f2925180Santos Cordon
237c8f32e7cd96a678961865750d5c7ce75feb5a1e6Yorke Lee    public int getNumberPresentation() {
2386c6b27265806a053193b8ccbc57f66b1feb8e5abChiao Cheng        return mIdentification.getNumberPresentation();
239c8f32e7cd96a678961865750d5c7ce75feb5a1e6Yorke Lee    }
240c8f32e7cd96a678961865750d5c7ce75feb5a1e6Yorke Lee
241c8f32e7cd96a678961865750d5c7ce75feb5a1e6Yorke Lee    public void setNumberPresentation(int presentation) {
2426c6b27265806a053193b8ccbc57f66b1feb8e5abChiao Cheng        mIdentification.setNumberPresentation(presentation);
243c8f32e7cd96a678961865750d5c7ce75feb5a1e6Yorke Lee    }
244c8f32e7cd96a678961865750d5c7ce75feb5a1e6Yorke Lee
245c8f32e7cd96a678961865750d5c7ce75feb5a1e6Yorke Lee    public int getCnapNamePresentation() {
2466c6b27265806a053193b8ccbc57f66b1feb8e5abChiao Cheng        return mIdentification.getCnapNamePresentation();
247c8f32e7cd96a678961865750d5c7ce75feb5a1e6Yorke Lee    }
248c8f32e7cd96a678961865750d5c7ce75feb5a1e6Yorke Lee
249c8f32e7cd96a678961865750d5c7ce75feb5a1e6Yorke Lee    public void setCnapNamePresentation(int presentation) {
2506c6b27265806a053193b8ccbc57f66b1feb8e5abChiao Cheng        mIdentification.setCnapNamePresentation(presentation);
251c8f32e7cd96a678961865750d5c7ce75feb5a1e6Yorke Lee    }
252c8f32e7cd96a678961865750d5c7ce75feb5a1e6Yorke Lee
253c8f32e7cd96a678961865750d5c7ce75feb5a1e6Yorke Lee    public String getCnapName() {
2546c6b27265806a053193b8ccbc57f66b1feb8e5abChiao Cheng        return mIdentification.getCnapName();
255c8f32e7cd96a678961865750d5c7ce75feb5a1e6Yorke Lee    }
256c8f32e7cd96a678961865750d5c7ce75feb5a1e6Yorke Lee
257c8f32e7cd96a678961865750d5c7ce75feb5a1e6Yorke Lee    public void setCnapName(String cnapName) {
2586c6b27265806a053193b8ccbc57f66b1feb8e5abChiao Cheng        mIdentification.setCnapName(cnapName);
259c8f32e7cd96a678961865750d5c7ce75feb5a1e6Yorke Lee    }
260c8f32e7cd96a678961865750d5c7ce75feb5a1e6Yorke Lee
261e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon    public DisconnectCause getDisconnectCause() {
262e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon        if (mState == State.DISCONNECTED || mState == State.IDLE) {
263e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon            return mDisconnectCause;
264e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon        }
265e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon
266e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon        return DisconnectCause.NOT_DISCONNECTED;
267e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon    }
268e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon
269e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon    public void setDisconnectCause(DisconnectCause cause) {
270e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon        mDisconnectCause = cause;
271e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon    }
272e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon
2738b3538a19c78d13a4f775714d48177ba3f275a7aSantos Cordon    public int getCapabilities() {
2748b3538a19c78d13a4f775714d48177ba3f275a7aSantos Cordon        return mCapabilities;
2758b3538a19c78d13a4f775714d48177ba3f275a7aSantos Cordon    }
2768b3538a19c78d13a4f775714d48177ba3f275a7aSantos Cordon
2778b3538a19c78d13a4f775714d48177ba3f275a7aSantos Cordon    public void setCapabilities(int capabilities) {
2788b3538a19c78d13a4f775714d48177ba3f275a7aSantos Cordon        mCapabilities = (Capabilities.ALL & capabilities);
2798b3538a19c78d13a4f775714d48177ba3f275a7aSantos Cordon    }
2808b3538a19c78d13a4f775714d48177ba3f275a7aSantos Cordon
2818b3538a19c78d13a4f775714d48177ba3f275a7aSantos Cordon    public boolean can(int capabilities) {
2828b3538a19c78d13a4f775714d48177ba3f275a7aSantos Cordon        return (capabilities == (capabilities & mCapabilities));
2838b3538a19c78d13a4f775714d48177ba3f275a7aSantos Cordon    }
2848b3538a19c78d13a4f775714d48177ba3f275a7aSantos Cordon
2858b3538a19c78d13a4f775714d48177ba3f275a7aSantos Cordon    public void addCapabilities(int capabilities) {
2868b3538a19c78d13a4f775714d48177ba3f275a7aSantos Cordon        setCapabilities(capabilities | mCapabilities);
2878b3538a19c78d13a4f775714d48177ba3f275a7aSantos Cordon    }
2888b3538a19c78d13a4f775714d48177ba3f275a7aSantos Cordon
289bbe8ecf9f2f8733f6e0a7c8e88082bd98dea8b98Santos Cordon    public void setConnectTime(long connectTime) {
290bbe8ecf9f2f8733f6e0a7c8e88082bd98dea8b98Santos Cordon        mConnectTime = connectTime;
291bbe8ecf9f2f8733f6e0a7c8e88082bd98dea8b98Santos Cordon    }
292bbe8ecf9f2f8733f6e0a7c8e88082bd98dea8b98Santos Cordon
293bbe8ecf9f2f8733f6e0a7c8e88082bd98dea8b98Santos Cordon    public long getConnectTime() {
294bbe8ecf9f2f8733f6e0a7c8e88082bd98dea8b98Santos Cordon        return mConnectTime;
295bbe8ecf9f2f8733f6e0a7c8e88082bd98dea8b98Santos Cordon    }
296bbe8ecf9f2f8733f6e0a7c8e88082bd98dea8b98Santos Cordon
2974ad64cd167e942b1dd132106750f4c221e3bf1a9Santos Cordon    public void removeChildId(int id) {
2984ad64cd167e942b1dd132106750f4c221e3bf1a9Santos Cordon        mChildCallIds.remove(id);
2994ad64cd167e942b1dd132106750f4c221e3bf1a9Santos Cordon    }
3004ad64cd167e942b1dd132106750f4c221e3bf1a9Santos Cordon
3014ad64cd167e942b1dd132106750f4c221e3bf1a9Santos Cordon    public void removeAllChildren() {
3024ad64cd167e942b1dd132106750f4c221e3bf1a9Santos Cordon        mChildCallIds.clear();
3034ad64cd167e942b1dd132106750f4c221e3bf1a9Santos Cordon    }
3044ad64cd167e942b1dd132106750f4c221e3bf1a9Santos Cordon
3054ad64cd167e942b1dd132106750f4c221e3bf1a9Santos Cordon    public void addChildId(int id) {
3064ad64cd167e942b1dd132106750f4c221e3bf1a9Santos Cordon        mChildCallIds.add(id);
3074ad64cd167e942b1dd132106750f4c221e3bf1a9Santos Cordon    }
3084ad64cd167e942b1dd132106750f4c221e3bf1a9Santos Cordon
3094ad64cd167e942b1dd132106750f4c221e3bf1a9Santos Cordon    public ImmutableSortedSet<Integer> getChildCallIds() {
3104ad64cd167e942b1dd132106750f4c221e3bf1a9Santos Cordon        return ImmutableSortedSet.copyOf(mChildCallIds);
3114ad64cd167e942b1dd132106750f4c221e3bf1a9Santos Cordon    }
3124ad64cd167e942b1dd132106750f4c221e3bf1a9Santos Cordon
3134ad64cd167e942b1dd132106750f4c221e3bf1a9Santos Cordon    public boolean isConferenceCall() {
3144ad64cd167e942b1dd132106750f4c221e3bf1a9Santos Cordon        return mChildCallIds.size() >= 2;
3154ad64cd167e942b1dd132106750f4c221e3bf1a9Santos Cordon    }
3164ad64cd167e942b1dd132106750f4c221e3bf1a9Santos Cordon
31769a691914e9b013a7ff52c129d8466c152ed7239Santos Cordon    public String getGatewayNumber() {
31869a691914e9b013a7ff52c129d8466c152ed7239Santos Cordon        return mGatewayNumber;
31969a691914e9b013a7ff52c129d8466c152ed7239Santos Cordon    }
32069a691914e9b013a7ff52c129d8466c152ed7239Santos Cordon
32169a691914e9b013a7ff52c129d8466c152ed7239Santos Cordon    public void setGatewayNumber(String number) {
32269a691914e9b013a7ff52c129d8466c152ed7239Santos Cordon        mGatewayNumber = number;
32369a691914e9b013a7ff52c129d8466c152ed7239Santos Cordon    }
32469a691914e9b013a7ff52c129d8466c152ed7239Santos Cordon
32569a691914e9b013a7ff52c129d8466c152ed7239Santos Cordon    public String getGatewayPackage() {
32669a691914e9b013a7ff52c129d8466c152ed7239Santos Cordon        return mGatewayPackage;
32769a691914e9b013a7ff52c129d8466c152ed7239Santos Cordon    }
32869a691914e9b013a7ff52c129d8466c152ed7239Santos Cordon
32969a691914e9b013a7ff52c129d8466c152ed7239Santos Cordon    public void setGatewayPackage(String packageName) {
33069a691914e9b013a7ff52c129d8466c152ed7239Santos Cordon        mGatewayPackage = packageName;
33169a691914e9b013a7ff52c129d8466c152ed7239Santos Cordon    }
33269a691914e9b013a7ff52c129d8466c152ed7239Santos Cordon
333995c816b6a596ccd48628c1da4199ea9e8a830b2Santos Cordon    /**
334995c816b6a596ccd48628c1da4199ea9e8a830b2Santos Cordon     * Parcelable implementation
335995c816b6a596ccd48628c1da4199ea9e8a830b2Santos Cordon     */
336995c816b6a596ccd48628c1da4199ea9e8a830b2Santos Cordon
337f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon    @Override
338f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon    public void writeToParcel(Parcel dest, int flags) {
339f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon        dest.writeInt(mCallId);
340a3d0514c3480db25a813d8841c39e965f2925180Santos Cordon        dest.writeInt(mState);
341e38b1fff94c3e93e75c776fe2f5bb9a088588c39Santos Cordon        dest.writeString(getDisconnectCause().toString());
3428b3538a19c78d13a4f775714d48177ba3f275a7aSantos Cordon        dest.writeInt(getCapabilities());
343bbe8ecf9f2f8733f6e0a7c8e88082bd98dea8b98Santos Cordon        dest.writeLong(getConnectTime());
3444ad64cd167e942b1dd132106750f4c221e3bf1a9Santos Cordon        dest.writeIntArray(Ints.toArray(mChildCallIds));
34569a691914e9b013a7ff52c129d8466c152ed7239Santos Cordon        dest.writeString(getGatewayNumber());
34669a691914e9b013a7ff52c129d8466c152ed7239Santos Cordon        dest.writeString(getGatewayPackage());
3476c6b27265806a053193b8ccbc57f66b1feb8e5abChiao Cheng        dest.writeParcelable(mIdentification, 0);
3484ad64cd167e942b1dd132106750f4c221e3bf1a9Santos Cordon    }
3494ad64cd167e942b1dd132106750f4c221e3bf1a9Santos Cordon
3504ad64cd167e942b1dd132106750f4c221e3bf1a9Santos Cordon    /**
3514ad64cd167e942b1dd132106750f4c221e3bf1a9Santos Cordon     * Constructor for Parcelable implementation.
3524ad64cd167e942b1dd132106750f4c221e3bf1a9Santos Cordon     */
3534ad64cd167e942b1dd132106750f4c221e3bf1a9Santos Cordon    private Call(Parcel in) {
3544ad64cd167e942b1dd132106750f4c221e3bf1a9Santos Cordon        mCallId = in.readInt();
3554ad64cd167e942b1dd132106750f4c221e3bf1a9Santos Cordon        mState = in.readInt();
3564ad64cd167e942b1dd132106750f4c221e3bf1a9Santos Cordon        mDisconnectCause = DisconnectCause.valueOf(in.readString());
3574ad64cd167e942b1dd132106750f4c221e3bf1a9Santos Cordon        mCapabilities = in.readInt();
3584ad64cd167e942b1dd132106750f4c221e3bf1a9Santos Cordon        mConnectTime = in.readLong();
3594ad64cd167e942b1dd132106750f4c221e3bf1a9Santos Cordon        mChildCallIds.addAll(Ints.asList(in.createIntArray()));
36069a691914e9b013a7ff52c129d8466c152ed7239Santos Cordon        mGatewayNumber = in.readString();
36169a691914e9b013a7ff52c129d8466c152ed7239Santos Cordon        mGatewayPackage = in.readString();
3626c6b27265806a053193b8ccbc57f66b1feb8e5abChiao Cheng        mIdentification = in.readParcelable(CallIdentification.class.getClassLoader());
363f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon    }
364f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon
365f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon    @Override
366f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon    public int describeContents() {
367f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon        return 0;
368f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon    }
369f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon
3708b3538a19c78d13a4f775714d48177ba3f275a7aSantos Cordon    /**
3718b3538a19c78d13a4f775714d48177ba3f275a7aSantos Cordon     * Creates Call objects for Parcelable implementation.
3728b3538a19c78d13a4f775714d48177ba3f275a7aSantos Cordon     */
373f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon    public static final Parcelable.Creator<Call> CREATOR
374f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon            = new Parcelable.Creator<Call>() {
375f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon
3768b3538a19c78d13a4f775714d48177ba3f275a7aSantos Cordon        @Override
377f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon        public Call createFromParcel(Parcel in) {
378f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon            return new Call(in);
379f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon        }
380f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon
3818b3538a19c78d13a4f775714d48177ba3f275a7aSantos Cordon        @Override
382f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon        public Call[] newArray(int size) {
383f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon            return new Call[size];
384f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon        }
385f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon    };
386f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon
387593ab38970a84a60ac39edba4306647c8b66436dSantos Cordon    @Override
388593ab38970a84a60ac39edba4306647c8b66436dSantos Cordon    public String toString() {
3896c6b27265806a053193b8ccbc57f66b1feb8e5abChiao Cheng        return Objects.toStringHelper(this)
3906c6b27265806a053193b8ccbc57f66b1feb8e5abChiao Cheng                .add("mCallId", mCallId)
3912c2e9800fd1823800135d83ccb33e8bace6a031eSantos Cordon                .add("mState", STATE_MAP.get(mState))
3926c6b27265806a053193b8ccbc57f66b1feb8e5abChiao Cheng                .add("mDisconnectCause", mDisconnectCause)
3936c6b27265806a053193b8ccbc57f66b1feb8e5abChiao Cheng                .add("mCapabilities", mCapabilities)
3946c6b27265806a053193b8ccbc57f66b1feb8e5abChiao Cheng                .add("mConnectTime", mConnectTime)
3956c6b27265806a053193b8ccbc57f66b1feb8e5abChiao Cheng                .add("mChildCallIds", mChildCallIds)
3966c6b27265806a053193b8ccbc57f66b1feb8e5abChiao Cheng                .add("mGatewayNumber", MoreStrings.toSafeString(mGatewayNumber))
3976c6b27265806a053193b8ccbc57f66b1feb8e5abChiao Cheng                .add("mGatewayPackage", mGatewayPackage)
3986c6b27265806a053193b8ccbc57f66b1feb8e5abChiao Cheng                .add("mIdentification", mIdentification)
3996c6b27265806a053193b8ccbc57f66b1feb8e5abChiao Cheng                .toString();
400593ab38970a84a60ac39edba4306647c8b66436dSantos Cordon    }
401f404688cbde8e73c68c3b285cdd144c0b8580f8fSantos Cordon}
402