1 /* 2 * Copyright (C) 2009 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.phone; 18 19 /** 20 * Class to internally keep track of Call states to maintain 21 * information for Call Waiting and 3Way for CDMA instance of Phone App. 22 * 23 * Explanation for PhoneApp's Call states and why it is required: 24 * IDLE - When no call is going on. This is just required as default state to reset the PhoneApp 25 * call state to when the complete call gets disconnected 26 * SINGLE_ACTIVE - When only single call is active. 27 * In normal case(on a single call) this state would be similar for FW's state of ACTIVE 28 * call or phone state of OFFHOOK, but in more complex conditions e.g. when phone is already 29 * in a CONF_CALL state and user rejects a CW, which basically tells the PhoneApp that the 30 * Call is back to a single call, the FW's state still would remain ACTIVE or OFFHOOK and 31 * isGeneric would still be true. At this condition PhoneApp does need to enable the 32 * "Add Call" menu item and disable the "Swap" and "Merge" options 33 * THRWAY_ACTIVE - When user initiate an outgoing call when already on a call. 34 * fgCall can have more than one connections from various scenarios (accepting the CW or 35 * making a 3way call) but once we are in this state and one of the parties drops off, 36 * when the user originates another call we need to remember this state to update the menu 37 * items accordingly. FW currently does not differentiate this condition hence PhoneApp 38 * needs to maintain it. 39 * CONF_CALL - When the user merges two calls or on accepting the Call waiting call. 40 * This is required cause even though a call might be generic but that does not mean it is 41 * in conference. We can take the same example mention in the SINGLE_ACTIVE state. 42 * 43 * TODO: Eventually this state information should be maintained by Telephony FW. 44 */ 45 public class CdmaPhoneCallState { 46 47 /** 48 * Allowable values for the PhoneCallState. 49 * IDLE - When no call is going on. 50 * SINGLE_ACTIVE - When only single call is active 51 * THRWAY_ACTIVE - When user initiate an outgoing call when already on a call 52 * CONF_CALL - When the user merges two calls or on accepting the Call waiting call 53 */ 54 public enum PhoneCallState { 55 IDLE, 56 SINGLE_ACTIVE, 57 THRWAY_ACTIVE, 58 CONF_CALL 59 } 60 61 // For storing current and previous PhoneCallState's 62 private PhoneCallState mPreviousCallState; 63 private PhoneCallState mCurrentCallState; 64 65 // Boolean to track 3Way display state 66 private boolean mThreeWayCallOrigStateDialing; 67 68 // Flag to indicate if the "Add Call" menu item in an InCallScreen is OK 69 // to be displayed after a Call Waiting call was ignored or timed out 70 private boolean mAddCallMenuStateAfterCW; 71 72 /** 73 * Initialize PhoneCallState related members - constructor 74 */ CdmaPhoneCallStateInit()75 public void CdmaPhoneCallStateInit() { 76 mCurrentCallState = PhoneCallState.IDLE; 77 mPreviousCallState = PhoneCallState.IDLE; 78 mThreeWayCallOrigStateDialing = false; 79 mAddCallMenuStateAfterCW = true; 80 } 81 82 /** 83 * Returns the current call state 84 */ getCurrentCallState()85 public PhoneCallState getCurrentCallState() { 86 return mCurrentCallState; 87 } 88 89 /** 90 * Set current and previous PhoneCallState's 91 */ setCurrentCallState(PhoneCallState newState)92 public void setCurrentCallState(PhoneCallState newState) { 93 mPreviousCallState = mCurrentCallState; 94 mCurrentCallState = newState; 95 96 //Reset the 3Way display boolean 97 mThreeWayCallOrigStateDialing = false; 98 99 //Set mAddCallMenuStateAfterCW to true 100 //if the current state is being set to SINGLE_ACTIVE 101 //and previous state was IDLE as we could reach the SINGLE_ACTIVE 102 //from CW ignore too. For all other cases let the timer or 103 //specific calls to setAddCallMenuStateAfterCallWaiting set 104 //mAddCallMenuStateAfterCW. 105 if ((mCurrentCallState == PhoneCallState.SINGLE_ACTIVE) 106 && (mPreviousCallState == PhoneCallState.IDLE)) { 107 mAddCallMenuStateAfterCW = true; 108 } 109 } 110 111 /** 112 * Return 3Way display information 113 */ IsThreeWayCallOrigStateDialing()114 public boolean IsThreeWayCallOrigStateDialing() { 115 return mThreeWayCallOrigStateDialing; 116 } 117 118 /** 119 * Set 3Way display information 120 */ setThreeWayCallOrigState(boolean newState)121 public void setThreeWayCallOrigState(boolean newState) { 122 mThreeWayCallOrigStateDialing = newState; 123 } 124 125 /** 126 * Return information for enabling/disabling "Add Call" menu item 127 */ getAddCallMenuStateAfterCallWaiting()128 public boolean getAddCallMenuStateAfterCallWaiting() { 129 return mAddCallMenuStateAfterCW; 130 } 131 132 /** 133 * Set mAddCallMenuStateAfterCW to enabling/disabling "Add Call" menu item 134 */ setAddCallMenuStateAfterCallWaiting(boolean newState)135 public void setAddCallMenuStateAfterCallWaiting(boolean newState) { 136 mAddCallMenuStateAfterCW = newState; 137 } 138 139 /** 140 * Return previous PhoneCallState's 141 */ getPreviousCallState()142 public PhoneCallState getPreviousCallState() { 143 return mPreviousCallState; 144 } 145 146 /** 147 * Reset all PhoneCallState 148 */ resetCdmaPhoneCallState()149 public void resetCdmaPhoneCallState() { 150 mCurrentCallState = PhoneCallState.IDLE; 151 mPreviousCallState = PhoneCallState.IDLE; 152 mThreeWayCallOrigStateDialing = false; 153 mAddCallMenuStateAfterCW = true; 154 } 155 } 156