From 0b80ac98256114b0a3adb0de921581b786d807ea Mon Sep 17 00:00:00 2001 From: John Wang Date: Mon, 2 Aug 2010 15:18:36 -0700 Subject: Add register methods in CallManager "do not merge" Cherry-picked from master. Add register methods used by PhoneApp into CallManager class. For most register methods, CallManager acts as an pass-through register to handle register and unregister phone case. Change-Id: I9567c2dbffb9e482b906f94c2d991a404ad4626e --- .../android/internal/telephony/CallManager.java | 348 +++++++++++++++++---- .../android/internal/telephony/cdma/CdmaCall.java | 3 +- .../android/internal/telephony/gsm/GsmCall.java | 3 +- 3 files changed, 296 insertions(+), 58 deletions(-) (limited to 'telephony') diff --git a/telephony/java/com/android/internal/telephony/CallManager.java b/telephony/java/com/android/internal/telephony/CallManager.java index 9822694..d77f778 100644 --- a/telephony/java/com/android/internal/telephony/CallManager.java +++ b/telephony/java/com/android/internal/telephony/CallManager.java @@ -16,8 +16,6 @@ package com.android.internal.telephony; - - import android.content.Context; import android.os.AsyncResult; import android.os.Handler; @@ -25,7 +23,6 @@ import android.os.Message; import android.os.RegistrantList; import android.telephony.PhoneStateListener; - import java.util.ArrayList; import java.util.List; @@ -49,8 +46,23 @@ import java.util.List; public final class CallManager { private static final int EVENT_DISCONNECT = 100; - private static final int EVENT_CALL_STATE_CHANGED = 101; - + private static final int EVENT_PRECISE_CALL_STATE_CHANGED = 101; + private static final int EVENT_NEW_RINGING_CONNECTION = 102; + private static final int EVENT_UNKNOWN_CONNECTION = 103; + private static final int EVENT_INCOMING_RING = 104; + private static final int EVENT_RINGBACK_TONE = 105; + private static final int EVENT_IN_CALL_VOICE_PRIVACY_ON = 106; + private static final int EVENT_IN_CALL_VOICE_PRIVACY_OFF = 107; + private static final int EVENT_CALL_WAITING = 108; + private static final int EVENT_DISPLAY_INFO = 109; + private static final int EVENT_SIGNAL_INFO = 110; + private static final int EVENT_CDMA_OTA_STATUS_CHANGE = 111; + private static final int EVENT_RESEND_INCALL_MUTE = 112; + private static final int EVENT_MMI_INITIATE = 113; + private static final int EVENT_MMI_COMPLETE = 114; + private static final int EVENT_ECM_TIMER_RESET = 115; + private static final int EVENT_SUBSCRIPTION_INFO_READY = 116; + private static final int EVENT_SUPP_SERVICE_FAILED = 117; // Singleton instance private static final CallManager INSTANCE = new CallManager(); @@ -89,13 +101,46 @@ public final class CallManager { protected final RegistrantList mServiceStateRegistrants = new RegistrantList(); + protected final RegistrantList mMmiRegistrants + = new RegistrantList(); + + protected final RegistrantList mUnknownConnectionRegistrants + = new RegistrantList(); + + protected final RegistrantList mRingbackToneRegistrants + = new RegistrantList(); + + protected final RegistrantList mInCallVoicePrivacyOnRegistrants + = new RegistrantList(); + + protected final RegistrantList mInCallVoicePrivacyOffRegistrants + = new RegistrantList(); + + protected final RegistrantList mCallWaitingRegistrants + = new RegistrantList(); + + protected final RegistrantList mDisplayInfoRegistrants + = new RegistrantList(); + + protected final RegistrantList mSignalInfoRegistrants + = new RegistrantList(); + + protected final RegistrantList mCdmaOtaStatusChangeRegistrants + = new RegistrantList(); + + protected final RegistrantList mResendIncallMuteRegistrants + = new RegistrantList(); + + protected final RegistrantList mMmiInitiateRegistrants + = new RegistrantList(); + protected final RegistrantList mMmiCompleteRegistrants = new RegistrantList(); - protected final RegistrantList mMmiRegistrants + protected final RegistrantList mEcmTimerResetRegistrants = new RegistrantList(); - protected final RegistrantList mUnknownConnectionRegistrants + protected final RegistrantList mSubscriptionInfoReadyRegistrants = new RegistrantList(); protected final RegistrantList mSuppServiceFailedRegistrants @@ -118,9 +163,28 @@ public final class CallManager { } /** + * Get current coarse-grained voice call state. + * If the Call Manager has an active call and call waiting occurs, + * then the phone state is RINGING not OFFHOOK + * + */ + public Phone.State getState() { + Phone.State s = Phone.State.IDLE; + + for(Phone phone : mPhones) { + if (phone.getState() == Phone.State.RINGING) { + return Phone.State.RINGING; + } else if (phone.getState() == Phone.State.OFFHOOK) { + s = Phone.State.OFFHOOK; + } + } + return s; + } + + /** * Register phone to CallManager * @param phone - * @return + * @return true if register successfully */ public boolean registerPhone(Phone phone) { if (phone != null && !mPhones.contains(phone)) { @@ -159,13 +223,45 @@ public final class CallManager { } private void registerForPhoneStates(Phone phone) { - phone.registerForPreciseCallStateChanged(mHandler, EVENT_CALL_STATE_CHANGED, null); + phone.registerForPreciseCallStateChanged(mHandler, EVENT_PRECISE_CALL_STATE_CHANGED, null); phone.registerForDisconnect(mHandler, EVENT_DISCONNECT, null); + phone.registerForNewRingingConnection(mHandler, EVENT_NEW_RINGING_CONNECTION, null); + phone.registerForUnknownConnection(mHandler, EVENT_UNKNOWN_CONNECTION, null); + phone.registerForIncomingRing(mHandler, EVENT_INCOMING_RING, null); + phone.registerForRingbackTone(mHandler, EVENT_RINGBACK_TONE, null); + phone.registerForInCallVoicePrivacyOn(mHandler, EVENT_IN_CALL_VOICE_PRIVACY_ON, null); + phone.registerForInCallVoicePrivacyOff(mHandler, EVENT_IN_CALL_VOICE_PRIVACY_OFF, null); + phone.registerForCallWaiting(mHandler, EVENT_CALL_WAITING, null); + phone.registerForDisplayInfo(mHandler, EVENT_DISPLAY_INFO, null); + phone.registerForSignalInfo(mHandler, EVENT_SIGNAL_INFO, null); + phone.registerForCdmaOtaStatusChange(mHandler, EVENT_CDMA_OTA_STATUS_CHANGE, null); + phone.registerForResendIncallMute(mHandler, EVENT_RESEND_INCALL_MUTE, null); + phone.registerForMmiInitiate(mHandler, EVENT_MMI_INITIATE, null); + phone.registerForMmiComplete(mHandler, EVENT_MMI_COMPLETE, null); + phone.registerForEcmTimerReset(mHandler, EVENT_ECM_TIMER_RESET, null); + phone.registerForSubscriptionInfoReady(mHandler, EVENT_SUBSCRIPTION_INFO_READY, null); + phone.registerForSuppServiceFailed(mHandler, EVENT_SUPP_SERVICE_FAILED, null); } private void unregisterForPhoneStates(Phone phone) { phone.unregisterForPreciseCallStateChanged(mHandler); phone.unregisterForDisconnect(mHandler); + phone.unregisterForNewRingingConnection(mHandler); + phone.unregisterForUnknownConnection(mHandler); + phone.unregisterForIncomingRing(mHandler); + phone.unregisterForRingbackTone(mHandler); + phone.unregisterForInCallVoicePrivacyOn(mHandler); + phone.unregisterForInCallVoicePrivacyOff(mHandler); + phone.unregisterForCallWaiting(mHandler); + phone.unregisterForDisplayInfo(mHandler); + phone.unregisterForSignalInfo(mHandler); + phone.unregisterForCdmaOtaStatusChange(mHandler); + phone.unregisterForResendIncallMute(mHandler); + phone.unregisterForMmiInitiate(mHandler); + phone.unregisterForMmiComplete(mHandler); + phone.unregisterForEcmTimerReset(mHandler); + phone.unregisterForSubscriptionInfoReady(mHandler); + phone.unregisterForSuppServiceFailed(mHandler); } /** @@ -523,12 +619,16 @@ public final class CallManager { * Notifies when a previously untracked non-ringing/waiting connection has appeared. * This is likely due to some other entity (eg, SIM card application) initiating a call. */ - public void registerForUnknownConnection(Handler h, int what, Object obj){} + public void registerForUnknownConnection(Handler h, int what, Object obj){ + mUnknownConnectionRegistrants.addUnique(h, what, obj); + } /** * Unregisters for unknown connection notifications. */ - public void unregisterForUnknownConnection(Handler h){} + public void unregisterForUnknownConnection(Handler h){ + mUnknownConnectionRegistrants.remove(h); + } /** @@ -543,14 +643,18 @@ public final class CallManager { * If Connection.isRinging() is true, then * Connection.getCall() == Phone.getRingingCall() */ - public void registerForNewRingingConnection(Handler h, int what, Object obj){} + public void registerForNewRingingConnection(Handler h, int what, Object obj){ + mNewRingingConnectionRegistrants.addUnique(h, what, obj); + } /** * Unregisters for new ringing connection notification. * Extraneous calls are tolerated silently */ - public void unregisterForNewRingingConnection(Handler h){} + public void unregisterForNewRingingConnection(Handler h){ + mNewRingingConnectionRegistrants.remove(h); + } /** * Notifies when an incoming call rings.

@@ -560,14 +664,18 @@ public final class CallManager { * AsyncResult.userObj = obj * AsyncResult.result = a Connection.

*/ - public void registerForIncomingRing(Handler h, int what, Object obj){} + public void registerForIncomingRing(Handler h, int what, Object obj){ + mIncomingRingRegistrants.addUnique(h, what, obj); + } /** * Unregisters for ring notification. * Extraneous calls are tolerated silently */ - public void unregisterForIncomingRing(Handler h){} + public void unregisterForIncomingRing(Handler h){ + mIncomingRingRegistrants.remove(h); + } /** * Notifies when out-band ringback tone is needed.

@@ -578,26 +686,32 @@ public final class CallManager { * AsyncResult.result = boolean, true to start play ringback tone * and false to stop.

*/ - public void registerForRingbackTone(Handler h, int what, Object obj){} + public void registerForRingbackTone(Handler h, int what, Object obj){ + mRingbackToneRegistrants.addUnique(h, what, obj); + } /** * Unregisters for ringback tone notification. */ - public void unregisterForRingbackTone(Handler h){} + public void unregisterForRingbackTone(Handler h){ + mRingbackToneRegistrants.remove(h); + } /** * Registers the handler to reset the uplink mute state to get * uplink audio. */ - public void registerForResendIncallMute(Handler h, int what, Object obj){} + public void registerForResendIncallMute(Handler h, int what, Object obj){ + mResendIncallMuteRegistrants.addUnique(h, what, obj); + } /** * Unregisters for resend incall mute notifications. */ - public void unregisterForResendIncallMute(Handler h){} - - + public void unregisterForResendIncallMute(Handler h){ + mResendIncallMuteRegistrants.remove(h); + } /** * Register for notifications of initiation of a new MMI code request. @@ -610,13 +724,17 @@ public final class CallManager { * * obj.result will be an "MmiCode" object. */ - public void registerForMmiInitiate(Handler h, int what, Object obj){} + public void registerForMmiInitiate(Handler h, int what, Object obj){ + mMmiInitiateRegistrants.addUnique(h, what, obj); + } /** * Unregisters for new MMI initiate notification. * Extraneous calls are tolerated silently */ - public void unregisterForMmiInitiate(Handler h){} + public void unregisterForMmiInitiate(Handler h){ + mMmiInitiateRegistrants.remove(h); + } /** * Register for notifications that an MMI request has completed @@ -626,13 +744,17 @@ public final class CallManager { * Message.obj will contain an AsyncResult. * obj.result will be an "MmiCode" object */ - public void registerForMmiComplete(Handler h, int what, Object obj){} + public void registerForMmiComplete(Handler h, int what, Object obj){ + mMmiCompleteRegistrants.addUnique(h, what, obj); + } /** * Unregisters for MMI complete notification. * Extraneous calls are tolerated silently */ - public void unregisterForMmiComplete(Handler h){} + public void unregisterForMmiComplete(Handler h){ + mMmiCompleteRegistrants.remove(h); + } /** * Registration point for Ecm timer reset @@ -640,15 +762,17 @@ public final class CallManager { * @param what user-defined message code * @param obj placed in Message.obj */ - public void registerForEcmTimerReset(Handler h, int what, Object obj){} + public void registerForEcmTimerReset(Handler h, int what, Object obj){ + mEcmTimerResetRegistrants.addUnique(h, what, obj); + } /** * Unregister for notification for Ecm timer reset * @param h Handler to be removed from the registrant list. */ - public void unregisterForEcmTimerReset(Handler h){} - - + public void unregisterForEcmTimerReset(Handler h){ + mEcmTimerResetRegistrants.remove(h); + } /** * Register for ServiceState changed. @@ -664,73 +788,133 @@ public final class CallManager { public void unregisterForServiceStateChanged(Handler h){} /** - * Register for Supplementary Service notifications from the network. + * Register for notifications when a supplementary service attempt fails. * Message.obj will contain an AsyncResult. - * AsyncResult.result will be a SuppServiceNotification instance. * * @param h Handler that receives the notification message. * @param what User-defined message code. * @param obj User object. */ - public void registerForSuppServiceNotification(Handler h, int what, Object obj){} + public void registerForSuppServiceFailed(Handler h, int what, Object obj){ + mSuppServiceFailedRegistrants.addUnique(h, what, obj); + } /** - * Unregisters for Supplementary Service notifications. + * Unregister for notifications when a supplementary service attempt fails. * Extraneous calls are tolerated silently * * @param h Handler to be removed from the registrant list. */ - public void unregisterForSuppServiceNotification(Handler h){} + public void unregisterForSuppServiceFailed(Handler h){ + mSuppServiceFailedRegistrants.remove(h); + } /** - * Register for notifications when a supplementary service attempt fails. - * Message.obj will contain an AsyncResult. + * Register for notifications when a sInCall VoicePrivacy is enabled * * @param h Handler that receives the notification message. * @param what User-defined message code. * @param obj User object. */ - public void registerForSuppServiceFailed(Handler h, int what, Object obj){} + public void registerForInCallVoicePrivacyOn(Handler h, int what, Object obj){ + mInCallVoicePrivacyOnRegistrants.addUnique(h, what, obj); + } /** - * Unregister for notifications when a supplementary service attempt fails. - * Extraneous calls are tolerated silently + * Unregister for notifications when a sInCall VoicePrivacy is enabled * * @param h Handler to be removed from the registrant list. */ - public void unregisterForSuppServiceFailed(Handler h){} + public void unregisterForInCallVoicePrivacyOn(Handler h){ + mInCallVoicePrivacyOnRegistrants.remove(h); + } /** - * Register for notifications when a sInCall VoicePrivacy is enabled + * Register for notifications when a sInCall VoicePrivacy is disabled * * @param h Handler that receives the notification message. * @param what User-defined message code. * @param obj User object. */ - public void registerForInCallVoicePrivacyOn(Handler h, int what, Object obj){} + public void registerForInCallVoicePrivacyOff(Handler h, int what, Object obj){ + mInCallVoicePrivacyOffRegistrants.addUnique(h, what, obj); + } /** - * Unegister for notifications when a sInCall VoicePrivacy is enabled + * Unregister for notifications when a sInCall VoicePrivacy is disabled * * @param h Handler to be removed from the registrant list. */ - public void unregisterForInCallVoicePrivacyOn(Handler h){} + public void unregisterForInCallVoicePrivacyOff(Handler h){ + mInCallVoicePrivacyOffRegistrants.remove(h); + } /** - * Register for notifications when a sInCall VoicePrivacy is disabled + * Register for notifications when CDMA call waiting comes + * + * @param h Handler that receives the notification message. + * @param what User-defined message code. + * @param obj User object. + */ + public void registerForCallWaiting(Handler h, int what, Object obj){ + mCallWaitingRegistrants.addUnique(h, what, obj); + } + + /** + * Unregister for notifications when CDMA Call waiting comes + * @param h Handler to be removed from the registrant list. + */ + public void unregisterForCallWaiting(Handler h){ + mCallWaitingRegistrants.remove(h); + } + + + /** + * Register for signal information notifications from the network. + * Message.obj will contain an AsyncResult. + * AsyncResult.result will be a SuppServiceNotification instance. + * + * @param h Handler that receives the notification message. + * @param what User-defined message code. + * @param obj User object. + */ + + public void registerForSignalInfo(Handler h, int what, Object obj){ + mSignalInfoRegistrants.addUnique(h, what, obj); + } + + /** + * Unregisters for signal information notifications. + * Extraneous calls are tolerated silently + * + * @param h Handler to be removed from the registrant list. + */ + public void unregisterForSignalInfo(Handler h){ + mSignalInfoRegistrants.remove(h); + } + + /** + * Register for display information notifications from the network. + * Message.obj will contain an AsyncResult. + * AsyncResult.result will be a SuppServiceNotification instance. * * @param h Handler that receives the notification message. * @param what User-defined message code. * @param obj User object. */ - public void registerForInCallVoicePrivacyOff(Handler h, int what, Object obj){} + public void registerForDisplayInfo(Handler h, int what, Object obj){ + mDisplayInfoRegistrants.addUnique(h, what, obj); + } /** - * Unegister for notifications when a sInCall VoicePrivacy is disabled + * Unregisters for display information notifications. + * Extraneous calls are tolerated silently * * @param h Handler to be removed from the registrant list. */ - public void unregisterForInCallVoicePrivacyOff(Handler h){} + public void unregisterForDisplayInfo(Handler h) { + mDisplayInfoRegistrants.remove(h); + } /** * Register for notifications when CDMA OTA Provision status change @@ -739,13 +923,17 @@ public final class CallManager { * @param what User-defined message code. * @param obj User object. */ - public void registerForCdmaOtaStatusChange(Handler h, int what, Object obj){} + public void registerForCdmaOtaStatusChange(Handler h, int what, Object obj){ + mCdmaOtaStatusChangeRegistrants.addUnique(h, what, obj); + } /** - * Unegister for notifications when CDMA OTA Provision status change + * Unregister for notifications when CDMA OTA Provision status change * @param h Handler to be removed from the registrant list. */ - public void unregisterForCdmaOtaStatusChange(Handler h){} + public void unregisterForCdmaOtaStatusChange(Handler h){ + mCdmaOtaStatusChangeRegistrants.remove(h); + } /** * Registration point for subscription info ready @@ -753,13 +941,17 @@ public final class CallManager { * @param what what code of message when delivered * @param obj placed in Message.obj */ - public void registerForSubscriptionInfoReady(Handler h, int what, Object obj){} + public void registerForSubscriptionInfoReady(Handler h, int what, Object obj){ + mSubscriptionInfoReadyRegistrants.addUnique(h, what, obj); + } /** * Unregister for notifications for subscription info * @param h Handler to be removed from the registrant list. */ - public void unregisterForSubscriptionInfoReady(Handler h){} + public void unregisterForSubscriptionInfoReady(Handler h){ + mSubscriptionInfoReadyRegistrants.remove(h); + } /* APIs to access foregroudCalls, backgroudCalls, and ringingCalls * 1. APIs to access list of calls @@ -974,9 +1166,57 @@ public final class CallManager { case EVENT_DISCONNECT: mDisconnectRegistrants.notifyRegistrants((AsyncResult) msg.obj); break; - case EVENT_CALL_STATE_CHANGED: + case EVENT_PRECISE_CALL_STATE_CHANGED: mPreciseCallStateRegistrants.notifyRegistrants((AsyncResult) msg.obj); break; + case EVENT_NEW_RINGING_CONNECTION: + mNewRingingConnectionRegistrants.notifyRegistrants((AsyncResult) msg.obj); + break; + case EVENT_UNKNOWN_CONNECTION: + mUnknownConnectionRegistrants.notifyRegistrants((AsyncResult) msg.obj); + break; + case EVENT_INCOMING_RING: + mIncomingRingRegistrants.notifyRegistrants((AsyncResult) msg.obj); + break; + case EVENT_RINGBACK_TONE: + mRingbackToneRegistrants.notifyRegistrants((AsyncResult) msg.obj); + break; + case EVENT_IN_CALL_VOICE_PRIVACY_ON: + mInCallVoicePrivacyOnRegistrants.notifyRegistrants((AsyncResult) msg.obj); + break; + case EVENT_IN_CALL_VOICE_PRIVACY_OFF: + mInCallVoicePrivacyOffRegistrants.notifyRegistrants((AsyncResult) msg.obj); + break; + case EVENT_CALL_WAITING: + mCallWaitingRegistrants.notifyRegistrants((AsyncResult) msg.obj); + break; + case EVENT_DISPLAY_INFO: + mDisplayInfoRegistrants.notifyRegistrants((AsyncResult) msg.obj); + break; + case EVENT_SIGNAL_INFO: + mSignalInfoRegistrants.notifyRegistrants((AsyncResult) msg.obj); + break; + case EVENT_CDMA_OTA_STATUS_CHANGE: + mCdmaOtaStatusChangeRegistrants.notifyRegistrants((AsyncResult) msg.obj); + break; + case EVENT_RESEND_INCALL_MUTE: + mResendIncallMuteRegistrants.notifyRegistrants((AsyncResult) msg.obj); + break; + case EVENT_MMI_INITIATE: + mMmiInitiateRegistrants.notifyRegistrants((AsyncResult) msg.obj); + break; + case EVENT_MMI_COMPLETE: + mMmiCompleteRegistrants.notifyRegistrants((AsyncResult) msg.obj); + break; + case EVENT_ECM_TIMER_RESET: + mEcmTimerResetRegistrants.notifyRegistrants((AsyncResult) msg.obj); + break; + case EVENT_SUBSCRIPTION_INFO_READY: + mSubscriptionInfoReadyRegistrants.notifyRegistrants((AsyncResult) msg.obj); + break; + case EVENT_SUPP_SERVICE_FAILED: + mSuppServiceFailedRegistrants.notifyRegistrants((AsyncResult) msg.obj); + break; } } }; diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaCall.java b/telephony/java/com/android/internal/telephony/cdma/CdmaCall.java index c3bb01f..4ad61bb 100644 --- a/telephony/java/com/android/internal/telephony/cdma/CdmaCall.java +++ b/telephony/java/com/android/internal/telephony/cdma/CdmaCall.java @@ -75,8 +75,7 @@ public final class CdmaCall extends Call { public Phone getPhone() { - //TODO, see GsmCall - return null; + return owner.phone; } public boolean isMultiparty() { diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmCall.java b/telephony/java/com/android/internal/telephony/gsm/GsmCall.java index 9542d20..58124a2 100644 --- a/telephony/java/com/android/internal/telephony/gsm/GsmCall.java +++ b/telephony/java/com/android/internal/telephony/gsm/GsmCall.java @@ -70,8 +70,7 @@ class GsmCall extends Call { public Phone getPhone() { - //TODO - return null; + return owner.phone; } public boolean -- cgit v1.1