Add "canDial" check.

For bug #3164802.

CallManager allow a new phone call only if ALL of the following are true:

- Phone is not powered off
- There's no incoming or waiting call
- There's available call slot in either foreground or background
- The foreground call is ACTIVE or IDLE or DISCONNECTED.

Change-Id: I0124d600fd8c63b8c608301f3889b3faec47f1db
This commit is contained in:
John Wang
2010-11-15 18:44:46 -08:00
parent 525566893b
commit 4567847d46

View File

@@ -695,6 +695,10 @@ public final class CallManager {
Log.d(LOG_TAG, this.toString());
}
if (!canDial(phone)) {
throw new CallStateException("cannot dial in current state");
}
if ( hasActiveFgCall() ) {
Phone activePhone = getActiveFgCall().getPhone();
boolean hasBgCall = !(activePhone.getBackgroundCall().isIdle());
@@ -747,6 +751,32 @@ public final class CallManager {
}
}
/**
* Phone can make a call only if ALL of the following are true:
* - Phone is not powered off
* - There's no incoming or waiting call
* - There's available call slot in either foreground or background
* - The foreground call is ACTIVE or IDLE or DISCONNECTED.
* (We mainly need to make sure it *isn't* DIALING or ALERTING.)
* @param phone
* @return true if the phone can make a new call
*/
private boolean canDial(Phone phone) {
int serviceState = phone.getServiceState().getState();
boolean hasRingingCall = hasActiveRingingCall();
boolean hasActiveCall = hasActiveFgCall();
boolean hasHoldingCall = hasActiveBgCall();
boolean allLinesTaken = hasActiveCall && hasHoldingCall;
Call.State fgCallState = getActiveFgCallState();
return (serviceState != ServiceState.STATE_POWER_OFF
&& !hasRingingCall
&& !allLinesTaken
&& ((fgCallState == Call.State.ACTIVE)
|| (fgCallState == Call.State.IDLE)
|| (fgCallState == Call.State.DISCONNECTED)));
}
/**
* Whether or not the phone can do explicit call transfer in the current
* phone state--that is, one call holding and one call active.