/* * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.phone; /** * Class to internally keep track of Call states to maintain * information for Call Waiting and 3Way for CDMA instance of Phone App. * * Explanation for PhoneApp's Call states and why it is required: * IDLE - When no call is going on. This is just required as default state to reset the PhoneApp * call state to when the complete call gets disconnected * SINGLE_ACTIVE - When only single call is active. * In normal case(on a single call) this state would be similar for FW's state of ACTIVE * call or phone state of OFFHOOK, but in more complex conditions e.g. when phone is already * in a CONF_CALL state and user rejects a CW, which basically tells the PhoneApp that the * Call is back to a single call, the FW's state still would remain ACTIVE or OFFHOOK and * isGeneric would still be true. At this condition PhoneApp does need to enable the * "Add Call" menu item and disable the "Swap" and "Merge" options * THRWAY_ACTIVE - When user initiate an outgoing call when already on a call. * fgCall can have more than one connections from various scenarios (accepting the CW or * making a 3way call) but once we are in this state and one of the parties drops off, * when the user originates another call we need to remember this state to update the menu * items accordingly. FW currently does not differentiate this condition hence PhoneApp * needs to maintain it. * CONF_CALL - When the user merges two calls or on accepting the Call waiting call. * This is required cause even though a call might be generic but that does not mean it is * in conference. We can take the same example mention in the SINGLE_ACTIVE state. * * TODO: Eventually this state information should be maintained by Telephony FW. */ public class CdmaPhoneCallState { /** * Allowable values for the PhoneCallState. * IDLE - When no call is going on. * SINGLE_ACTIVE - When only single call is active * THRWAY_ACTIVE - When user initiate an outgoing call when already on a call * CONF_CALL - When the user merges two calls or on accepting the Call waiting call */ public enum PhoneCallState { IDLE, SINGLE_ACTIVE, THRWAY_ACTIVE, CONF_CALL } // For storing current and previous PhoneCallState's private PhoneCallState mPreviousCallState; private PhoneCallState mCurrentCallState; // Boolean to track 3Way display state private boolean mThreeWayCallOrigStateDialing; // Flag to indicate if the "Add Call" menu item in an InCallScreen is OK // to be displayed after a Call Waiting call was ignored or timed out private boolean mAddCallMenuStateAfterCW; /** * Initialize PhoneCallState related members - constructor */ public void CdmaPhoneCallStateInit() { mCurrentCallState = PhoneCallState.IDLE; mPreviousCallState = PhoneCallState.IDLE; mThreeWayCallOrigStateDialing = false; mAddCallMenuStateAfterCW = true; } /** * Returns the current call state */ public PhoneCallState getCurrentCallState() { return mCurrentCallState; } /** * Set current and previous PhoneCallState's */ public void setCurrentCallState(PhoneCallState newState) { mPreviousCallState = mCurrentCallState; mCurrentCallState = newState; //Reset the 3Way display boolean mThreeWayCallOrigStateDialing = false; //Set mAddCallMenuStateAfterCW to true //if the current state is being set to SINGLE_ACTIVE //and previous state was IDLE as we could reach the SINGLE_ACTIVE //from CW ignore too. For all other cases let the timer or //specific calls to setAddCallMenuStateAfterCallWaiting set //mAddCallMenuStateAfterCW. if ((mCurrentCallState == PhoneCallState.SINGLE_ACTIVE) && (mPreviousCallState == PhoneCallState.IDLE)) { mAddCallMenuStateAfterCW = true; } } /** * Return 3Way display information */ public boolean IsThreeWayCallOrigStateDialing() { return mThreeWayCallOrigStateDialing; } /** * Set 3Way display information */ public void setThreeWayCallOrigState(boolean newState) { mThreeWayCallOrigStateDialing = newState; } /** * Return information for enabling/disabling "Add Call" menu item */ public boolean getAddCallMenuStateAfterCallWaiting() { return mAddCallMenuStateAfterCW; } /** * Set mAddCallMenuStateAfterCW to enabling/disabling "Add Call" menu item */ public void setAddCallMenuStateAfterCallWaiting(boolean newState) { mAddCallMenuStateAfterCW = newState; } /** * Return previous PhoneCallState's */ public PhoneCallState getPreviousCallState() { return mPreviousCallState; } /** * Reset all PhoneCallState */ public void resetCdmaPhoneCallState() { mCurrentCallState = PhoneCallState.IDLE; mPreviousCallState = PhoneCallState.IDLE; mThreeWayCallOrigStateDialing = false; mAddCallMenuStateAfterCW = true; } }