diff options
author | John Wang <johnwang@google.com> | 2010-08-11 01:27:49 -0700 |
---|---|---|
committer | John Wang <johnwang@google.com> | 2010-08-12 14:52:39 -0700 |
commit | c159c84699d4b739a14cdfb22c5807f419e1754f (patch) | |
tree | 7738ed60043108a0fb1289ca17f85e73885134db /telephony | |
parent | ae3a1f45951aeb716e1f6b9a99a09838eb55dab4 (diff) | |
download | frameworks_base-c159c84699d4b739a14cdfb22c5807f419e1754f.zip frameworks_base-c159c84699d4b739a14cdfb22c5807f419e1754f.tar.gz frameworks_base-c159c84699d4b739a14cdfb22c5807f419e1754f.tar.bz2 |
Update switch call and accept call.
Change-Id: Ifdd1af77e3eca08f6c931605ecfb275835b78709
Diffstat (limited to 'telephony')
4 files changed, 122 insertions, 8 deletions
diff --git a/telephony/java/android/telephony/PhoneNumberUtils.java b/telephony/java/android/telephony/PhoneNumberUtils.java index 03194ff..f5c6909 100644 --- a/telephony/java/android/telephony/PhoneNumberUtils.java +++ b/telephony/java/android/telephony/PhoneNumberUtils.java @@ -1649,6 +1649,15 @@ public class PhoneNumberUtils } /** + * @hide + * @param number + * @return true if number contains @ + */ + public static boolean isUriNumber(String number) { + return number != null && number.contains("@"); + } + + /** * This function handles the plus code conversion within NANP CDMA network * If the number format is * 1)+1NANP,remove +, diff --git a/telephony/java/com/android/internal/telephony/CallManager.java b/telephony/java/com/android/internal/telephony/CallManager.java index 4dc1991..819cfbe 100644 --- a/telephony/java/com/android/internal/telephony/CallManager.java +++ b/telephony/java/com/android/internal/telephony/CallManager.java @@ -21,12 +21,18 @@ import android.os.AsyncResult; import android.os.Handler; import android.os.Message; import android.os.RegistrantList; +import android.util.Log; + import android.telephony.PhoneStateListener; +import android.telephony.ServiceState; + import java.util.ArrayList; import java.util.Collections; import java.util.List; + + /** * @hide * @@ -46,6 +52,9 @@ import java.util.List; */ public final class CallManager { + private static final String LOG_TAG ="GSM"; + private static final boolean LOCAL_DEBUG = true; + private static final int EVENT_DISCONNECT = 100; private static final int EVENT_PRECISE_CALL_STATE_CHANGED = 101; private static final int EVENT_NEW_RINGING_CONNECTION = 102; @@ -180,7 +189,7 @@ public final class CallManager { public Phone.State getState() { Phone.State s = Phone.State.IDLE; - for(Phone phone : mPhones) { + for (Phone phone : mPhones) { if (phone.getState() == Phone.State.RINGING) { return Phone.State.RINGING; } else if (phone.getState() == Phone.State.OFFHOOK) { @@ -191,6 +200,41 @@ public final class CallManager { } /** + * @return the service state of CallManager, which represents the + * highest priority state of all the service states of phones + * + * The priority is defined as + * + * STATE_IN_SERIVCE > STATE_OUT_OF_SERIVCE > STATE_EMERGENCY > STATE_POWER_OFF + * + */ + + public int getServiceState() { + int resultState = ServiceState.STATE_OUT_OF_SERVICE; + + for (Phone phone : mPhones) { + int serviceState = phone.getServiceState().getState(); + if (serviceState == ServiceState.STATE_IN_SERVICE) { + // IN_SERVICE has the highest priority + resultState = serviceState; + break; + } else if (serviceState == ServiceState.STATE_OUT_OF_SERVICE) { + // OUT_OF_SERVICE replaces EMERGENCY_ONLY and POWER_OFF + // Note: EMERGENCY_ONLY is not in use at this moment + if ( resultState == ServiceState.STATE_EMERGENCY_ONLY || + resultState == ServiceState.STATE_POWER_OFF) { + resultState = serviceState; + } + } else if (serviceState == ServiceState.STATE_EMERGENCY_ONLY) { + if (resultState == ServiceState.STATE_POWER_OFF) { + resultState = serviceState; + } + } + } + return resultState; + } + + /** * Register phone to CallManager * @param phone * @return true if register successfully @@ -211,6 +255,34 @@ public final class CallManager { } /** + * return the default phone or null if no phone available + */ + public Phone getDefaultPhone() { + return mDefaultPhone; + } + + /** + * @return the phone associated with the foreground call + */ + public Phone getFgPhone() { + return getActiveFgCall().getPhone(); + } + + /** + * @return the phone associated with the background call + */ + public Phone getBgPhone() { + return getFirstActiveBgCall().getPhone(); + } + + /** + * @return the phone associated with the ringing call + */ + public Phone getRingingPhone() { + return getFirstActiveRingingCall().getPhone(); + } + + /** * unregister phone from CallManager * @param phone */ @@ -291,9 +363,13 @@ public final class CallManager { if ( hasActiveFgCall() ) { Phone activePhone = getActiveFgCall().getPhone(); - boolean hasBgCall = activePhone.getBackgroundCall().isIdle(); + boolean hasBgCall = ! (activePhone.getBackgroundCall().isIdle()); boolean sameChannel = (activePhone == ringingPhone); + if (LOCAL_DEBUG) { + Log.d(LOG_TAG, "hasBgCall: "+ hasBgCall + "sameChannel:" + sameChannel); + } + if (sameChannel && hasBgCall) { getActiveFgCall().hangup(); } else if (!sameChannel && !hasBgCall) { @@ -322,14 +398,21 @@ public final class CallManager { } /** - * Places any active calls on hold, and makes any held calls - * active. Switch occurs asynchronously and may fail. + * Places active call on hold, and makes held call active. + * Switch occurs asynchronously and may fail. + * + * There are 4 scenarios + * 1. only active call but no held call, aka, hold + * 2. no active call but only held call, aka, unhold + * 3. both active and held calls from same phone, aka, swap + * 4. active and held calls from different phones, aka, phone swap + * * Final notification occurs via * {@link #registerForPreciseCallStateChanged(android.os.Handler, int, * java.lang.Object) registerForPreciseCallStateChanged()}. * * @exception CallStateException if active call is ringing, waiting, or - * dialing/alerting, or heldCall can�t be active. + * dialing/alerting, or heldCall can't be active. * In these cases, this operation may not be performed. */ public void switchHoldingAndActive(Call heldCall) throws CallStateException { @@ -344,11 +427,13 @@ public final class CallManager { heldPhone = heldCall.getPhone(); } - if (activePhone != heldPhone) { + if (activePhone != null) { activePhone.switchHoldingAndActive(); } - heldPhone.switchHoldingAndActive(); + if (heldPhone != null && heldPhone != activePhone) { + heldPhone.switchHoldingAndActive(); + } } /** @@ -398,6 +483,24 @@ public final class CallManager { * handled asynchronously. */ public Connection dial(Phone phone, String dialString) throws CallStateException { + if ( hasActiveFgCall() ) { + Phone activePhone = getActiveFgCall().getPhone(); + boolean hasBgCall = !(activePhone.getBackgroundCall().isIdle()); + + if (LOCAL_DEBUG) { + Log.d(LOG_TAG, "hasBgCall: "+ hasBgCall + "sameChannel:" + (activePhone != phone)); + } + + if (activePhone != phone) { + if (hasBgCall) { + Log.d(LOG_TAG, "Hangup"); + getActiveFgCall().hangup(); + } else { + Log.d(LOG_TAG, "Switch"); + activePhone.switchHoldingAndActive(); + } + } + } return phone.dial(dialString); } @@ -975,7 +1078,7 @@ public final class CallManager { * @return list of ringing calls */ public ArrayList<Call> getRingingCalls() { - return mBackgroundCalls; + return mRingingCalls; } /** diff --git a/telephony/java/com/android/internal/telephony/Phone.java b/telephony/java/com/android/internal/telephony/Phone.java index 23325f6..33f7c9d 100644 --- a/telephony/java/com/android/internal/telephony/Phone.java +++ b/telephony/java/com/android/internal/telephony/Phone.java @@ -177,6 +177,7 @@ public interface Phone { static final int PHONE_TYPE_NONE = RILConstants.NO_PHONE; static final int PHONE_TYPE_GSM = RILConstants.GSM_PHONE; static final int PHONE_TYPE_CDMA = RILConstants.CDMA_PHONE; + static final int PHONE_TYPE_SIP = RILConstants.SIP_PHONE; // Used for preferred network type // Note NT_* substitute RILConstants.NETWORK_MODE_* above the Phone diff --git a/telephony/java/com/android/internal/telephony/RILConstants.java b/telephony/java/com/android/internal/telephony/RILConstants.java index 71a80e0..888f721 100644 --- a/telephony/java/com/android/internal/telephony/RILConstants.java +++ b/telephony/java/com/android/internal/telephony/RILConstants.java @@ -79,6 +79,7 @@ public interface RILConstants { int NO_PHONE = 0; int GSM_PHONE = 1; int CDMA_PHONE = 2; + int SIP_PHONE = 3; int CDM_TTY_MODE_DISABLED = 0; int CDM_TTY_MODE_ENABLED = 1; |