public class

CdmaPhoneCallState

extends Object
/*
 * 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;
        }
   }