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