tizen2.1 code merge
[apps/osp/Call.git] / src / CallTelephonyManager.cpp
index 9b31aa4..0a98f23 100644 (file)
@@ -1,7 +1,7 @@
 //
 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
 //
-// Licensed under the Flora License, Version 1.0 (the License);
+// Licensed under the Flora License, Version 1.1 (the License);
 // you may not use this file except in compliance with the License.
 // You may obtain a copy of the License at
 //
@@ -390,19 +390,21 @@ TelephonyManager::EndCall(AppCallInfo& endCallInfo)
 result
 TelephonyManager::AnswerAutoRejectCall(int callHandle)
 {
+       //Incoming call automatically blocked is handled here.
        AppLogDebug("Enter ");
        result r = E_FAILURE;
-       TelCallAnswerType_t answerType = TAPI_CALL_ANSWER_ACCEPT;
+       TelCallAnswerType_t answerType = TAPI_CALL_ANSWER_REJECT;
        int res = -1;
 
        AppLogDebug("tel_answer_call");
-       answerType = TAPI_CALL_ANSWER_REJECT;
+       //save to logs db.
        AppCallInfo rejectedCallInfo;
        rejectedCallInfo = *(__pIncomingCall);
        rejectedCallInfo.SetCalllogType(CALL_LOG_TYPE_VOICE_BLOCKED);
        SaveCallInfoToLogsDb(rejectedCallInfo);
        delete __pIncomingCall;
        __pIncomingCall = null;
+
        // redirect to reject call back handler as the flow has to be handled
        res = tel_answer_call(__pTapiHandle, callHandle, answerType, &HandleCallbackResponse, this);
 
@@ -552,7 +554,7 @@ TelephonyManager::AcceptSecondCall(CallAnsweringOptions answerOptions, const int
                //Call connected successfully
                r = E_SUCCESS;
                //Add calls information to call log before deleting from active call list.
-               IListT<AppCallInfo>* pCallList = pEndCallsList->GetValuesN();
+               /*IListT<AppCallInfo>* pCallList = pEndCallsList->GetValuesN();
                if(pCallList != null)
                {
                        AppCallInfo endCallInfo;
@@ -561,7 +563,7 @@ TelephonyManager::AcceptSecondCall(CallAnsweringOptions answerOptions, const int
                                SaveCallInfoToLogsDb(endCallInfo);
                        }
                        delete pCallList;
-               }
+               }*/
                pEndCallsList->RemoveAll();
                delete pEndCallsList;
        }
@@ -610,7 +612,7 @@ TelephonyManager::AcceptMultipleCall(CallAnsweringOptions answerOptions, const i
                //Incoming Call connected successfully
                r = E_SUCCESS;
                //save to ended call to call logs db.
-               SaveCallInfoToLogsDb(callToBeEnded);
+               //SaveCallInfoToLogsDb(callToBeEnded);
        }
        break;
 
@@ -665,7 +667,7 @@ TelephonyManager::AcceptMultipleCall(CallAnsweringOptions answerOptions, const i
                        break;
                }
                //"Held" call successfully ended - Add call ended to call log database
-               SaveCallInfoToLogsDb(callToBeEnded);
+               //SaveCallInfoToLogsDb(callToBeEnded);
 
                //accept incoming call by Holding "Active" call using "TAPI_CALL_ANSWER_HOLD_AND_ACCEPT".
                res = tel_answer_call(__pTapiHandle, incomingCallHandle, TAPI_CALL_ANSWER_HOLD_AND_ACCEPT, &HandleCallbackResponse, this);
@@ -720,7 +722,7 @@ TelephonyManager::AcceptMultipleCall(CallAnsweringOptions answerOptions, const i
                IListT<AppCallInfo>* pCallList = pEndCallsList->GetValuesN();
                if(pCallList != null)
                {
-                       int callCount = pCallList->GetCount();
+/*                     int callCount = pCallList->GetCount();
                        for (int index = 0; index < callCount; index++)
                        {
                                AppCallInfo endCallInfo;
@@ -728,7 +730,7 @@ TelephonyManager::AcceptMultipleCall(CallAnsweringOptions answerOptions, const i
                                {
                                        SaveCallInfoToLogsDb(endCallInfo);
                                }
-                       }
+                       }*/
                        delete pCallList;
                        pCallList = null;
                }
@@ -1279,6 +1281,21 @@ TelephonyManager::HandleDialCallbackResponse(TapiHandle* pHandle, int callBackRe
                        delete pTelManager->__pDialedCall;
                        pTelManager->__pDialedCall = null;
                }
+
+               //Check if there are no active connected calls and no incoming call.
+               if (pTelManager->__pIncomingCall != null)
+               {
+                       pTelManager->__pSettingsManager->SetCallState(CALL_STATE_CALL_VOICE_CONNECTING);
+               }
+               else if (pTelManager->GetCurrentCallCount() >= 1)
+               {
+                       pTelManager->__pSettingsManager->SetCallState(CALL_STATE_CALL_VOICE_ACTIVE);
+               }
+               else
+               {
+                       pTelManager->__pSettingsManager->SetCallState(CALL_STATE_CALL_OFF);
+               }
+
                pTelManager->__pEventListener->HandleTelephonyError(ERROR_DIAL_FAILED);
        }
 }
@@ -1287,8 +1304,7 @@ void
 TelephonyManager::HandleRejectCallbackResponse(TapiHandle* pHandle, int callBackResult, void* pData, void* pUserData)
 {
        AppLogDebug("ENTER");
-       // This callback comes only if user has either rejected an incoming call from IncomingCallForm.
-       // or the incoming call was automatically blocked.
+       // This callback comes only if user has rejected an incoming call from IncomingCallForm.
        TelephonyManager* pTelManager = (TelephonyManager*) pUserData;
        if (pData != null && callBackResult == TAPI_API_SUCCESS)
        {
@@ -1298,65 +1314,48 @@ TelephonyManager::HandleRejectCallbackResponse(TapiHandle* pHandle, int callBack
                //Check if incoming call is rejected
                if (pTelManager->__pIncomingCall != null && (rejectedCallHandle == (unsigned int) pTelManager->__pIncomingCall->GetCallHandle()->ToLong()))
                {
+                       AppLogDebug("Call rejected by user");
                        AppCallInfo rejectedCallInfo;
                        rejectedCallInfo = *(pTelManager->__pIncomingCall);
                        delete pTelManager->__pIncomingCall;
                        pTelManager->__pIncomingCall = null;
 
-                       //Check if number was automatically rejected using settings, then don't give any notification to user.
-                       bool showIncomingCallRejectedNotification = true;
-                       if (((pTelManager->__pSettingsManager->GetUnknownRejectStatus() == true) && (rejectedCallInfo.GetContactInfo() == null))
-                                               || (pTelManager->__pSettingsManager->IsCallToBeRejected(rejectedCallInfo.GetContactNumber()) == true))
-                       {
-                               //blocked
-                               AppLogDebug("Call blocked");
-                               showIncomingCallRejectedNotification = false;
-                               rejectedCallInfo.SetCalllogType(CALL_LOG_TYPE_VOICE_BLOCKED);
-                       }
-                       else
-                       {
-                               AppLogDebug("Call rejected");
-                               //rejected by user from incoming call form
-                               showIncomingCallRejectedNotification = true;
-                               rejectedCallInfo.SetCalllogType(CALL_LOG_TYPE_VOICE_REJECTED);
-                       }
+                       //rejected by user from incoming call form
+                       rejectedCallInfo.SetCalllogType(CALL_LOG_TYPE_VOICE_REJECTED);
                        //Save rejected incoming call to call log db.
                        pTelManager->SaveCallInfoToLogsDb(rejectedCallInfo);
 
-                       if (showIncomingCallRejectedNotification == true)
+                       //check if the ended call was the last call
+                       bool isLastCall = (pTelManager->__pActiveCallList->GetCount() == 0);
+                       //Stop alert - started only for incoming calls which are not blocked.
+                       if(pTelManager->__pSoundManager != null)
                        {
-                               //check if the ended call was the last call
-                               bool isLastCall = (pTelManager->__pActiveCallList->GetCount() == 0);
-                               //Stop alert - started only for incoming calls which are not blocked.
-                               if(pTelManager->__pSoundManager != null)
-                               {
-                                       pTelManager->__pSoundManager->StopAlert();
-                                       //Do not call stop session if there is already a call going on
-                                       if(isLastCall == true)
-                                       {
-                                               pTelManager->__pSoundManager->StopSession();
-                                       }
-                               }
-                               //Send notification to user
-                               ArrayListT<AppCallInfo>* pCallList = null;
-                               if (isLastCall)
+                               pTelManager->__pSoundManager->StopAlert();
+                               //Do not call stop session if there is already a call going on
+                               if(isLastCall == true)
                                {
-                                       //save 'RejectedCall' to list to show on EndCallForm
-                                       pCallList = new (std::nothrow) ArrayListT<AppCallInfo>();
-                                       pCallList->Construct(1);
-                                       AppCallInfo* pRejectedCall = new (std::nothrow) AppCallInfo();
-                                       *pRejectedCall = rejectedCallInfo;
-                                       pCallList->Add(*pRejectedCall);
+                                       pTelManager->__pSoundManager->StopSession();
                                }
-                               else
-                               {
-                                       //fetch active calls to show appropriate scene
-                                       pCallList = static_cast<ArrayListT<AppCallInfo>*>(pTelManager->__pActiveCallList->GetValuesN());
-                               }
-                               pTelManager->__pEventListener->HandleCallDisconnected(isLastCall, *pCallList);
-                               delete pCallList;
-                               pCallList = null;
                        }
+                       //Send notification to user
+                       ArrayListT<AppCallInfo>* pCallList = null;
+                       if (isLastCall)
+                       {
+                               //save 'RejectedCall' to list to show on EndCallForm
+                               pCallList = new (std::nothrow) ArrayListT<AppCallInfo>();
+                               pCallList->Construct(1);
+                               AppCallInfo* pRejectedCall = new (std::nothrow) AppCallInfo();
+                               *pRejectedCall = rejectedCallInfo;
+                               pCallList->Add(*pRejectedCall);
+                       }
+                       else
+                       {
+                               //fetch active calls to show appropriate scene
+                               pCallList = static_cast<ArrayListT<AppCallInfo>*>(pTelManager->__pActiveCallList->GetValuesN());
+                       }
+                       pTelManager->__pEventListener->HandleCallDisconnected(isLastCall, *pCallList);
+                       delete pCallList;
+                       pCallList = null;
                }
        }
        else
@@ -1561,7 +1560,7 @@ TelephonyManager::HandleParticipantEndedFromConference(unsigned int participantC
                        conferenceCall.RemoveCallFromCallerList(index);
                        //update its status to individual call before saving to database
                        callToBeEnded.SetConference(false);
-                       SaveCallInfoToLogsDb(callToBeEnded);
+               //      SaveCallInfoToLogsDb(callToBeEnded);
                        isParticipantCallEnded = true;
                        break;
                }
@@ -1591,16 +1590,12 @@ TelephonyManager::HandleParticipantEndedFromConference(unsigned int participantC
                __pActiveCallList->Add(pActiveCall->GetCallHandle()->ToLong(), *pActiveCall);
                pActiveCall = null;
 
-               //Check if there is no incoming or dialing call exist, then only notify to change screen, Else ignore
-               if (IsIncomingorDialingCallPresent() == false)
-               {
-                       //using the callConnected to switch to single active screen
-                       //or update multiple active call screen
-                       IListT<AppCallInfo>* pActiveCallList = __pActiveCallList->GetValuesN();
-                       __pEventListener->HandleCallConnected(*pActiveCallList);
-                       delete pActiveCallList;
-                       pActiveCallList = null;
-               }
+               //using the callConnected to switch to single active screen
+               //or update multiple active call screen
+               IListT<AppCallInfo>* pActiveCallList = __pActiveCallList->GetValuesN();
+               __pEventListener->HandleCallConnected(*pActiveCallList);
+               delete pActiveCallList;
+               pActiveCallList = null;
        }
        else
        {
@@ -1778,7 +1773,7 @@ TelephonyManager::HandleEndConferenceCallbackResponse(TapiHandle* pHandle, int c
                //remove the conference call handle from active call list to avoid any processing in HandleIdleCallback().
                pTelManager->__pActiveCallList->Remove(endConfCallInfo.GetCallHandle()->ToLong());
                //Save "End" Conf. call info to call log database
-               pTelManager->SaveCallInfoToLogsDb(endConfCallInfo);
+       //      pTelManager->SaveCallInfoToLogsDb(endConfCallInfo);
 
                //check if the ended call was the last call and show notification to user
                bool isLastCall = (pTelManager->__pActiveCallList->GetCount() == 0);
@@ -1789,7 +1784,9 @@ TelephonyManager::HandleEndConferenceCallbackResponse(TapiHandle* pHandle, int c
                        //stop sound session
                        pTelManager->__pSoundManager->StopSession();
                        //send empty call list to show dialer or call log screen
-                       pCallList = new (std::nothrow) ArrayListT<AppCallInfo>();
+                       pCallList =new (std::nothrow) ArrayListT<AppCallInfo>();
+                       pCallList->Construct(1);
+                       pCallList->Add(endConfCallInfo);
                }
                else
                {
@@ -1815,7 +1812,7 @@ TelephonyManager::HandleIdleCallBack(void* pData)
        //This callback comes when any type of calls are ended
        //We do NOT handle below scenarios here -
        //1) In incoming call scenarios, if we end any active calls - handled in "AcceptCall()".
-       //2) Incoming call automatically blocked and rejection by user scenarios are handled in "HandleRejectCallbackResponse()".
+       //2) Incoming call automatically blocked is handled in "AnswerAutoRejectCall()" and rejection by user scenarios are handled in "HandleRejectCallbackResponse()".
        //3) End conference call is handled in "HandleEndConferenceCallbackResponse()".
        //4) End Single Call from Conference call by user is handled in "HandleEndFromConferenceCallbackResponse()".
        //5) End Single Call from Conference call using eventInjector is diverted to "HandleParticipantEndedFromConference()".
@@ -1824,10 +1821,7 @@ TelephonyManager::HandleIdleCallBack(void* pData)
        //2) an "unconnected" dialed call is ended by caller or other party.
        //3) Any normal active calls(NOT conference calls) ended by user or by other party.
 
-       if(__pSoundManager->GetLastConferenceCall() == false)
-       {
-               __pSoundManager->SetDisconnectTone();
-       }
+
 
        TelCallStatusIdleNoti_t idleNotification;
        memcpy(&idleNotification, pData, sizeof(TelCallStatusIdleNoti_t));
@@ -1842,7 +1836,10 @@ TelephonyManager::HandleIdleCallBack(void* pData)
                AppLogDebug("EXIT - no calls exist");
                return;
        }
-
+       if(__pSoundManager->GetLastConferenceCall() == false)
+       {
+               __pSoundManager->SetDisconnectTone();
+       }
        //Check if ended call was among conference caller list,
        //then divert event to "HandleParticipantEndedFromConference()"
        AppCallInfo confCallInfo;
@@ -1911,9 +1908,11 @@ TelephonyManager::HandleIdleCallBack(void* pData)
                        __pIncomingCall = null;
                        //update missed status
                        endCallInfo.SetCalllogType(CALL_LOG_TYPE_VOICE_MISSED_UNSEEN);
+                       //save ended call to call log db.
+                       SaveCallInfoToLogsDb(endCallInfo);
                }
-               //save ended call to call log db.
-               SaveCallInfoToLogsDb(endCallInfo);
+               /*//save ended call to call log db.
+               SaveCallInfoToLogsDb(endCallInfo);*/
 
                //notify listener that call is disconnected.
                if (isLastCall == true)
@@ -1921,7 +1920,12 @@ TelephonyManager::HandleIdleCallBack(void* pData)
                        __pSoundManager->StopSession();
                        pCallList = new (std::nothrow) ArrayListT<AppCallInfo>();
                        pCallList->Construct(1);
-                       if (isMissedIncomingCallEnded == false)
+               //This is done to show end call form in missed call case also
+               //this was done on request received from HQ to solve a bug in
+               //camera application. In which if a call comes when camera is
+               //running and user disconnects before the ui is shown the camera
+               //application hangs
+                       //if (isMissedIncomingCallEnded == false)
                        {
                                //save to list to show EndCallForm
                                pCallList->Add(endCallInfo);
@@ -1970,7 +1974,7 @@ TelephonyManager::HandleEndNormalActiveCall(AppCallInfo& endCallInfo)
                }
 
                //Save "End" call info to call log database
-               SaveCallInfoToLogsDb(endCallInfo);
+               //SaveCallInfoToLogsDb(endCallInfo);
                //notify listener that call is disconnected.
                __pEventListener->HandleCallDisconnected(isLastCall, *pCallList);
                delete pCallList;
@@ -2028,6 +2032,7 @@ TelephonyManager::HandleDialingCallBack(void* pData)
        long long startTime = 0;
        SystemTime::GetTicks(startTime);
        __pDialedCall->SetCallNotificationTime(startTime);
+       SaveCallInfoToLogsDb(*__pDialedCall);
 }
 
 void
@@ -2179,6 +2184,10 @@ TelephonyManager::HandleCallConnected(unsigned int connectedCallHandle)
 
        //transfer ownership to Active calls list
        __pActiveCallList->Add(connectedCallHandle, *(pConnectedCall));
+       if (pConnectedCall->GetCalllogType() == CALL_LOG_TYPE_VOICE_INCOMING)
+       {
+               SaveCallInfoToLogsDb(*pConnectedCall);
+       }
        pConnectedCall = null;
 
        //notify listener that call is connected.
@@ -2202,11 +2211,14 @@ TelephonyManager::CheckIncomingCallToBeRejected(AppCallInfo* pIncomingCallInfo)
        contactNumber.Append(pIncomingCallInfo->GetContactNumber());
        //Check if "reject unknown calls" is set and contact number is not present in AddressBook
        //or if contact number is blacklisted
-       if (((__pSettingsManager->GetUnknownRejectStatus() == true) && (pIncomingCallInfo->GetContactInfo() == null))
-                       || (__pSettingsManager->IsCallToBeRejected(contactNumber) == true))
+       if(__pSettingsManager != null)
        {
-               AnswerAutoRejectCall(callHandle);
-               return true;
+               if (((__pSettingsManager->GetUnknownRejectStatus() == true) && (pIncomingCallInfo->GetContactInfo() == null))
+                               || (__pSettingsManager->IsCallToBeRejected(contactNumber) == true))
+               {
+                       AnswerAutoRejectCall(callHandle);
+                       return true;
+               }
        }
        return false;
 }
@@ -2214,6 +2226,7 @@ TelephonyManager::CheckIncomingCallToBeRejected(AppCallInfo* pIncomingCallInfo)
 void
 TelephonyManager::HandleCallback(TapiHandle* pHandle, const char* pNotiId, void* pData, void* pUserData)
 {
+       AppLogDebug("Enter");
        unsigned int tempHandle = 0;
        TelephonyManager* pTelManager = (TelephonyManager*) pUserData;
        if (pTelManager->__pSoundManager == null)
@@ -2301,6 +2314,16 @@ TelephonyManager::StartAlert(AppCallInfo& incomingCallInfo)
                {
                        //fetch custom ringtone for contact
                        result r = foundContact->GetValue(CONTACT_PROPERTY_ID_RINGTONE, contactRingTone);
+                       //Now check if there is a group ring tone
+                       if(contactRingTone.IsEmpty() == true)
+                       {
+                               IList* pCategoryList = __pAddressBook->GetCategoriesByContactN(foundContact->GetRecordId());
+                               if(pCategoryList != null && pCategoryList->GetCount() > 0)
+                               {
+                                       Category* pCategory = static_cast<Category*>(pCategoryList->GetAt(0));
+                                       contactRingTone = pCategory->GetRingtonePath();
+                               }
+                       }
                        AppLog("ringtone fetched - r = %d", r);
                        delete foundContact;
                        foundContact = null;