Fix for 45866
[apps/osp/Call.git] / src / CallActiveCallForm.cpp
index 1bdc61f..635a485 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
 //
@@ -22,6 +22,7 @@
 #include <FUi.h>
 #include <FMedia.h>
 #include <FSystem.h>
+#include <FShell.h>
 #include "CallActiveCallForm.h"
 #include "CallButtonsPanel.h"
 #include "CallInfo.h"
@@ -30,6 +31,7 @@
 #include "CallPresentationModel.h"
 #include "CallSceneRegister.h"
 #include "CallTypes.h"
+#include "CallApp.h"
 
 using namespace Tizen::App;
 using namespace Tizen::Base;
@@ -42,6 +44,7 @@ using namespace Tizen::System;
 using namespace Tizen::Ui;
 using namespace Tizen::Ui::Controls;
 using namespace Tizen::Ui::Scenes;
+using namespace Tizen::Shell;
 
 //constants
 const int IDI_MAX_SECONDS = 60;
@@ -78,7 +81,7 @@ static const wchar_t* IDC_CONF_CALL_MORE_BUTTON = L"IDC_CONF_CALL_MORE_BUTTON";
 static const wchar_t* IDC_HOLD_BUTTON = L"IDC_HOLD_BUTTON";
 static const wchar_t* IDC_SWAP_BUTTON = L"IDC_SWAP_BUTTON";
 static const wchar_t* IDC_HOLD_LABEL = L"IDC_HOLD_LABEL";
-static const wchar_t* IDC_TEXTBOX = L"IDC_TEXTBOX";
+static const wchar_t* IDC_TEXTBOX = L"IDC_NUM_EDITFIELD";
 static const wchar_t* IDC_CALLER1_LABEL = L"IDC_CALLER1_LABEL";
 static const wchar_t* IDC_BACKGROUND_LABEL = L"IDC_BACKGROUND_LABEL";
 static const wchar_t* IDC_CALLER1_TIME_LABEL = L"IDC_CALLER1_TIME_LABEL";
@@ -106,6 +109,8 @@ ActiveCallForm::ActiveCallForm(FormType formType)
        __pSmallPhotoLabel = null;
        __pActiveCallInfo = null;
        __pHeldCallInfo = null;
+       __isSwapInProgress = false;
+       __pAddressbook = null;
 }
 
 ActiveCallForm::~ActiveCallForm(void)
@@ -117,17 +122,14 @@ ActiveCallForm::~ActiveCallForm(void)
        }
        if (__pMoreOptionsList != null)
        {
-               RemoveControl(*__pMoreOptionsList);
                __pMoreOptionsList = null;
        }
        if (__pMoreOptionsListAnchor != null)
        {
-               RemoveControl(*__pMoreOptionsListAnchor);
                __pMoreOptionsListAnchor = null;
        }
        if (__pSmallPhotoLabel != null)
        {
-               RemoveControl(*__pSmallPhotoLabel);
                __pSmallPhotoLabel = null;
        }
        if (__pActiveCallInfo != null)
@@ -140,7 +142,6 @@ ActiveCallForm::~ActiveCallForm(void)
        }
        if(__pDTMFKeypad != null)
        {
-               RemoveControl(*__pDTMFKeypad);
                __pDTMFKeypad = null;
        }
 }
@@ -198,35 +199,40 @@ ActiveCallForm::OnInitializing(void)
 void
 ActiveCallForm::ShowDTMFKeypad(void)
 {
-       if(__pDTMFKeypad != null)
-       {
-               RemoveControl(*__pDTMFKeypad);
-               __pDTMFKeypad = null;
-       }
-
        if(__pDTMFKeypad == null)
        {
                //update rect according to client screen area
                Rectangle rect(0, 0, 0, 0);
-               if (GetOrientationStatus() == ORIENTATION_STATUS_PORTRAIT)
+               if (GetOrientationStatus() == ORIENTATION_STATUS_PORTRAIT || GetOrientationStatus() == ORIENTATION_STATUS_PORTRAIT_REVERSE)
                {
                        rect.width = GetClientAreaBounds().width;
                        rect.height = GetClientAreaBounds().height - __pCallButtonsPanel->GetHeight();
                }
-               else if (GetOrientationStatus() == ORIENTATION_STATUS_LANDSCAPE)
+               else if (GetOrientationStatus() == ORIENTATION_STATUS_LANDSCAPE || GetOrientationStatus() == ORIENTATION_STATUS_LANDSCAPE_REVERSE)
                {
                        rect.height = GetClientAreaBounds().height;
                        rect.width = GetClientAreaBounds().width - __pCallButtonsPanel->GetWidth();
                }
 
-               AppLog("rect(%d,%d,%d,%d)",rect.x,rect.y,rect.width,rect.height);
+               AppLog("DTMF Keypad rect(%d,%d,%d,%d)",rect.x,rect.y,rect.width,rect.height);
                __pDTMFKeypad = new (std::nothrow) DtmfKeyPadPanel();
                __pDTMFKeypad->Initialize(this, rect);
-               AddControl(*__pDTMFKeypad);
+               AddControl(__pDTMFKeypad);
+
+               //set layout relation w.r.t call buttons panel
+               RelativeLayout* pRelativeLayout = dynamic_cast<RelativeLayout*>(GetLandscapeLayoutN());
+               if (pRelativeLayout != null)
+               {
+                       pRelativeLayout->SetRelation(*__pDTMFKeypad, this, RECT_EDGE_RELATION_LEFT_TO_LEFT);
+                       pRelativeLayout->SetRelation(*__pDTMFKeypad, __pCallButtonsPanel, RECT_EDGE_RELATION_RIGHT_TO_LEFT);
+               }
        }
-       TextBox* pTextBox = static_cast<TextBox*>(__pDTMFKeypad->GetControl(IDC_TEXTBOX));
-       pTextBox->SetText(L"");
        __pDTMFKeypad->SetShowState(true);
+       if(__DtmfString.IsEmpty() == false)
+       {
+               EditField* pTextBox = static_cast<EditField*>(__pDTMFKeypad->GetControl(IDC_TEXTBOX));
+               pTextBox->SetText(__DtmfString);
+       }
        __pDTMFKeypad->Draw(true);
        __pDTMFKeypad->Show();
 }
@@ -261,23 +267,32 @@ ActiveCallForm::OnOrientationChanged(const Tizen::Ui::Control& source, Tizen::Ui
                //change orientation of DTMF Keypad, if it is visible.
                if (__pDTMFKeypad != null)
                {
-                       if (orientationStatus == ORIENTATION_STATUS_LANDSCAPE)
+                       if (orientationStatus == ORIENTATION_STATUS_LANDSCAPE || orientationStatus == ORIENTATION_STATUS_LANDSCAPE_REVERSE)
                        {
                                //in landscape mode, caller info is visible.
                                SetShowStateOnKeypad(true);
+                               SetHoldButtonShowState(false);
                        }
-                       else if (orientationStatus == ORIENTATION_STATUS_PORTRAIT)
+                       else if (orientationStatus == ORIENTATION_STATUS_PORTRAIT || orientationStatus == ORIENTATION_STATUS_PORTRAIT_REVERSE)
                        {
                                //in Portrait mode it is hidden beneath DTMF Keypad.
                                SetShowStateOnKeypad(false);
+                               DestroyMoreOptionsMenuList();
+                       }
+                       if(__pDTMFKeypad->GetShowState() == true)
+                       {
+                               String dtmfText = static_cast<EditField*>(__pDTMFKeypad->GetControl(IDC_TEXTBOX))->GetText();
+                               HideDTMFKeypad();
+                               ShowDTMFKeypad();
                        }
-                       String dtmfText = static_cast<TextBox*>(__pDTMFKeypad->GetControl(IDC_TEXTBOX))->GetText();
-                       ShowDTMFKeypad();
-                       //get new text box.
-                       TextBox* pTextBox = static_cast<TextBox*>(__pDTMFKeypad->GetControl(IDC_TEXTBOX));
-                       pTextBox->SetText(dtmfText);
                }
        }
+       //More option is displayed recreate it
+       if(__pMoreOptionsListAnchor != null)
+       {
+               CreateMoreOptionsMenuList();
+               CreateMoreOptionsMenuList();
+       }
 }
 
 void
@@ -285,7 +300,9 @@ ActiveCallForm::HideDTMFKeypad(void)
 {
        if(__pDTMFKeypad != null)
        {
-               RemoveControl(*__pDTMFKeypad);
+               __DtmfString = static_cast<EditField*>(__pDTMFKeypad->GetControl(IDC_TEXTBOX))->GetText();
+
+               RemoveControl(__pDTMFKeypad);
                __pDTMFKeypad = null;
        }
 }
@@ -307,7 +324,7 @@ ActiveCallForm::InitializeCallButtonsPanel(void)
                __pCallButtonsPanel = new (std::nothrow) CallButtonsPanel();
                __pCallButtonsPanel->ConstructPanel(this, __formType);
                __pCallButtonsPanel->SetBounds(pKeysBgLbl->GetBounds());
-               r = AddControl(*__pCallButtonsPanel);
+               r = AddControl(__pCallButtonsPanel);
        }
 
        RelativeLayout* pRelativeLayout = dynamic_cast<RelativeLayout*>(GetPortraitLayoutN());
@@ -320,6 +337,8 @@ ActiveCallForm::InitializeCallButtonsPanel(void)
        {
                pRelativeLayout->SetRelation(*__pCallButtonsPanel, *pKeysBgLbl, RECT_EDGE_RELATION_LEFT_TO_LEFT);
                pRelativeLayout->SetRelation(*__pCallButtonsPanel, *pKeysBgLbl, RECT_EDGE_RELATION_RIGHT_TO_RIGHT);
+               pRelativeLayout->SetRelation(*__pCallButtonsPanel, *pKeysBgLbl, RECT_EDGE_RELATION_BOTTOM_TO_BOTTOM);
+               pRelativeLayout->SetRelation(*__pCallButtonsPanel, *pKeysBgLbl, RECT_EDGE_RELATION_TOP_TO_TOP);
        }
 
        return r;
@@ -437,6 +456,7 @@ ActiveCallForm::SetHoldButtonStatus(bool toHoldCall)
                pHoldBtn->SetActionId(cmdId);
                pHoldBtn->SetNormalBitmap(Point(0, 0),*normalImg);
                pHoldBtn->SetPressedBitmap(Point(0, 0),*pressImg);
+               pHoldBtn->Invalidate(true);
        }
        if (pHoldLbl)
        {
@@ -467,7 +487,7 @@ ActiveCallForm::CreateMoreOptionsMenuList(void)
                pBgPopupArwBmp = null;
 
                // Adds a Label to the Form
-               AddControl(*__pMoreOptionsListAnchor);
+               AddControl(__pMoreOptionsListAnchor);
        }
 
        //create options menu list
@@ -478,7 +498,7 @@ ActiveCallForm::CreateMoreOptionsMenuList(void)
                __pMoreOptionsList->SetItemProvider(*this);
                __pMoreOptionsList->AddListViewItemEventListener(*this);
                //Add option list to the form
-               AddControl(*__pMoreOptionsList);
+               AddControl(__pMoreOptionsList);
        }
        else
        {
@@ -493,14 +513,14 @@ ActiveCallForm::DestroyMoreOptionsMenuList(void)
        if (__pMoreOptionsListAnchor != null)
        {
                //removes and delete the child control
-               RemoveControl(*__pMoreOptionsListAnchor);
+               RemoveControl(__pMoreOptionsListAnchor);
                __pMoreOptionsListAnchor = null;
        }
 
        if (__pMoreOptionsList != null)
        {
                //removes and delete the child control
-               RemoveControl(*__pMoreOptionsList);
+               RemoveControl(__pMoreOptionsList);
                __pMoreOptionsList = null;
        }
 }
@@ -557,13 +577,15 @@ ActiveCallForm::OnActionPerformed(const Control& source, int actionId)
 
        case IDA_OPEN_NUMKEYPAD:
        {
-               if (GetOrientationStatus() == ORIENTATION_STATUS_PORTRAIT)
+               if (GetOrientationStatus() == ORIENTATION_STATUS_PORTRAIT || GetOrientationStatus() == ORIENTATION_STATUS_PORTRAIT_REVERSE)
                {
                        //hide only in portrait mode.
-               SetShowStateOnKeypad(false);
+                       SetShowStateOnKeypad(false);
+                       DestroyMoreOptionsMenuList();
                }
+               //Hide the hold button as it goes behind DTMF keypad
+               SetHoldButtonShowState(false);
                ShowDTMFKeypad();
-               SetTextToDTMFTextField(L"");
                __pCallButtonsPanel->SetKeypadButtonState(IDA_CLOSE_NUMKEYPAD);
        }
        break;
@@ -581,15 +603,7 @@ ActiveCallForm::OnActionPerformed(const Control& source, int actionId)
                //switch to Dialer Form to make an call
                if(__pCallPresentor->GetCurrentCallCount() == 1)
                {
-/*             ArrayList* pArgs = new (std::nothrow) ArrayList(SingleObjectDeleter);
-               pArgs->Construct();
-               String* formType = new (std::nothrow) String();
-               formType->Append(__formType);
-               pArgs->Add(formType);
-               pSceneManager->GoForward( ForwardSceneTransition(IDSCN_DIALER, SCENE_TRANSITION_ANIMATION_TYPE_NONE,
-                               SCENE_HISTORY_OPTION_NO_HISTORY), pArgs);*/
-                       __pCallPresentor->LaunchDialAppControl();
-
+               __pCallPresentor->LaunchDialAppControl();
                }
        }
        break;
@@ -720,8 +734,12 @@ ActiveCallForm::OnActionPerformed(const Control& source, int actionId)
 
        case IDA_SWAP_CALLS:
        {
-               AppAssert(__formType == FORMTYPE_MULTIPLECALLS);
-               __pCallPresentor->SwapCalls();
+               if(IsSwapInProgress() == false)
+               {
+                       AppAssert(__formType == FORMTYPE_MULTIPLECALLS);
+                       __pCallPresentor->SwapCalls();
+                       SetSwapInProgress(true);
+               }
        }
        break;
 
@@ -833,13 +851,36 @@ ActiveCallForm::OnActionPerformed(const Control& source, int actionId)
        }
 }
 
+bool
+ActiveCallForm::IsSwapInProgress(void)
+{
+       return __isSwapInProgress;
+}
+
+void
+ActiveCallForm::SetSwapInProgress(bool progress)
+{
+       __isSwapInProgress = progress;
+}
+
 void
 ActiveCallForm::SetTextToDTMFTextField(const String& dtmfStr)
 {
        if(__pDTMFKeypad != null)
        {
-               TextBox* pTextBox = static_cast<TextBox*>(__pDTMFKeypad->GetControl(IDC_TEXTBOX));
-               pTextBox->AppendText(dtmfStr);
+               EditField* pTextBox = static_cast<EditField*>(__pDTMFKeypad->GetControl(IDC_TEXTBOX));
+
+               int startpos=-1,endpos=-1;
+               pTextBox->GetBlockRange(startpos,endpos);
+               if(startpos != -1)
+               {
+                       pTextBox->Remove();
+                       pTextBox->ReleaseBlock();
+               }
+
+               pTextBox->InsertTextAtCursorPosition(dtmfStr);
+               //pTextBox->AppendText(dtmfStr);
+               pTextBox->SetFocus();
                pTextBox->Invalidate(true);
        }
 }
@@ -852,9 +893,20 @@ ActiveCallForm::OnSceneActivatedN(const SceneId& previousSceneId, const SceneId&
        __pCallPresentor->SetTelEventListener(this);
        AddOrientationEventListener(*this);
 
+       CallApp* pPhoneApp = static_cast<CallApp*>(CallApp::GetInstance());
+       pPhoneApp->AddAppStateChangeListener(*this);
+
        //Initialize keypad and buttons
        InitializeCallButtonsPanel();
 
+       AddressbookManager* pAddressbookManager = AddressbookManager::GetInstance();
+       __pAddressbook = pAddressbookManager->GetAddressbookN(DEFAULT_ADDRESSBOOK_ID);
+       if(__pAddressbook != null)
+       {
+               __pAddressbook->SetAddressbookChangeEventListener(this);
+       }
+
+
        if (__pActiveCallInfo != null)
        {
                delete __pActiveCallInfo;
@@ -873,7 +925,7 @@ ActiveCallForm::OnSceneActivatedN(const SceneId& previousSceneId, const SceneId&
        {
                String contactNo;
                contactNo.Append(*(static_cast<String*>(pArgs->GetAt(0))));
-               __pActiveCallInfo = new (std::nothrow) CallInfo();
+               __pActiveCallInfo = new (std::nothrow) AppCallInfo();
                __pActiveCallInfo->SetContactNumber(contactNo);
                Contact* pContact = __pCallPresentor->GetContactN(contactNo);
                if (pContact != null)
@@ -890,7 +942,7 @@ ActiveCallForm::OnSceneActivatedN(const SceneId& previousSceneId, const SceneId&
        case FORMTYPE_EMERGENCYOUTGOINGCALL:
        {
                String* pContactNo = static_cast<String*>(pArgs->GetAt(0));
-               __pActiveCallInfo = new (std::nothrow) CallInfo();
+               __pActiveCallInfo = new (std::nothrow) AppCallInfo();
                long long phNumber = 0;
                LongLong::Parse(*pContactNo, phNumber);
                __pActiveCallInfo->SetContactNumber(*pContactNo);
@@ -902,9 +954,9 @@ ActiveCallForm::OnSceneActivatedN(const SceneId& previousSceneId, const SceneId&
        case FORMTYPE_ACTIVECALL:
        {
                //get contact number
-               CallInfo* pCall = static_cast<CallInfo*>(pArgs->GetAt(0));
+               AppCallInfo* pCall = static_cast<AppCallInfo*>(pArgs->GetAt(0));
 
-               __pActiveCallInfo = new (std::nothrow) CallInfo();
+               __pActiveCallInfo = new (std::nothrow) AppCallInfo();
                *__pActiveCallInfo =  *pCall;
                String activeContactNo;
                if(pCall->GetContactNumber().IsEmpty() == false)
@@ -926,9 +978,9 @@ ActiveCallForm::OnSceneActivatedN(const SceneId& previousSceneId, const SceneId&
        case FORMTYPE_EMERGENCYACTIVECALL:
        {
                //get contact number
-               CallInfo* pCall = static_cast<CallInfo*>(pArgs->GetAt(0));
+               AppCallInfo* pCall = static_cast<AppCallInfo*>(pArgs->GetAt(0));
 
-               __pActiveCallInfo = new (std::nothrow) CallInfo();
+               __pActiveCallInfo = new (std::nothrow) AppCallInfo();
                *__pActiveCallInfo =  *pCall;
 
                //show call active time using Timer
@@ -939,7 +991,7 @@ ActiveCallForm::OnSceneActivatedN(const SceneId& previousSceneId, const SceneId&
 
        case FORMTYPE_MULTIPLECALLS:
        {
-               IListT<CallInfo>* pCallsList = __pCallPresentor->GetCallListN();
+               IListT<AppCallInfo>* pCallsList = __pCallPresentor->GetCallListN();
                //update calls state
                UpdateMultipleCallScreen(*pCallsList);
                delete pCallsList;
@@ -950,8 +1002,8 @@ ActiveCallForm::OnSceneActivatedN(const SceneId& previousSceneId, const SceneId&
        case FORMTYPE_ACTIVECONFCALL:
        {
                //get Conf call
-               CallInfo* pConfInfo = static_cast<CallInfo*>(pArgs->GetAt(0));
-               __pActiveCallInfo = new (std::nothrow) CallInfo();
+               AppCallInfo* pConfInfo = static_cast<AppCallInfo*>(pArgs->GetAt(0));
+               __pActiveCallInfo = new (std::nothrow) AppCallInfo();
                *__pActiveCallInfo =  *pConfInfo;
 
                int participantsCount = __pActiveCallInfo->GetCallerListCount();
@@ -976,6 +1028,11 @@ ActiveCallForm::OnSceneActivatedN(const SceneId& previousSceneId, const SceneId&
                        __pCallButtonsPanel->EnableAddCallButton(true);
                }
 
+
+               //bring button on top
+               __pCallButtonsPanel->SetButtonPosition();
+
+
                //show call active time using Timer
                __activeCallStartTime = __pActiveCallInfo->GetCallConnectTime();
                ShowTimerInfo(IDC_CALLER1_TIME_LABEL, __pActiveCallInfo->IsOnHold(),__activeCallStartTime);
@@ -986,6 +1043,17 @@ ActiveCallForm::OnSceneActivatedN(const SceneId& previousSceneId, const SceneId&
                break;
        }
 
+       if(__formType == FORMTYPE_ACTIVECALL || __formType == FORMTYPE_EMERGENCYACTIVECALL ||
+                       __formType == FORMTYPE_MULTIPLECALLS || __formType == FORMTYPE_ACTIVECONFCALL)
+       {
+               //Unlock the phone if its locked
+               if(LockManager::GetInstance()->IsLocked())
+               {
+                       AppLogDebug("Phone Locked");
+                       LockManager::GetInstance()->Unlock();
+               }
+       }
+
        //Hide DTMFKeypad, if visible and show caller info
        HideDTMFKeypad();
        SetShowStateOnKeypad(true);
@@ -1017,17 +1085,19 @@ ActiveCallForm::OnSceneActivatedN(const SceneId& previousSceneId, const SceneId&
                delete pArgs;
                pArgs = null;
        }
+
+       //update position of call buttons panel
+       Label* pKeysBgLbl = static_cast<Label*>(GetControl(IDC_KEY_BG_LABEL, true));
+       __pCallButtonsPanel->SetBounds(pKeysBgLbl->GetBounds());
+
+       CallApp* pCallApp = static_cast<CallApp*>(CallApp::GetInstance());
+       pCallApp->SetTopMostWindow(false);
 }
 
 void
 ActiveCallForm::OnSceneDeactivated(const SceneId& currentSceneId, const SceneId& nextSceneId)
 {
        RemoveOrientationEventListener(*this);
-       if (__pCallButtonsPanel != null)
-       {
-               RemoveControl(*__pCallButtonsPanel);
-               __pCallButtonsPanel = null;
-       }
        if (__pActiveCallTimer != null)
        {
                __pActiveCallTimer->Cancel();
@@ -1047,6 +1117,13 @@ ActiveCallForm::OnSceneDeactivated(const SceneId& currentSceneId, const SceneId&
        {
                __pMoreOptionsList->SetShowState(false);
        }
+       __DtmfString.Clear();
+       CallApp* pCallApp = static_cast<CallApp*>(CallApp::GetInstance());
+       pCallApp->RemoveAppStateChangeListener(*this);
+       if(__pAddressbook != null)
+       {
+               __pAddressbook->SetAddressbookChangeEventListener(null);
+       }
 }
 
 void
@@ -1055,7 +1132,7 @@ ActiveCallForm::HandleConfCallChanged(void)
        AppLog("ENTER");
        AppAssert((__formType == FORMTYPE_ACTIVECONFCALL) || (__formType == FORMTYPE_MULTIPLECALLS));
        //fetch changed conference call info
-       CallInfo* pConfCallInfo = __pCallPresentor->GetConferenceCallInfoN();
+       AppCallInfo* pConfCallInfo = __pCallPresentor->GetConferenceCallInfoN();
        if (pConfCallInfo == null)
        {
                AppLog("EXIT");
@@ -1080,7 +1157,7 @@ ActiveCallForm::HandleConfCallChanged(void)
        {
                //Active call is conference call
                delete __pActiveCallInfo;
-               __pActiveCallInfo = new (std::nothrow) CallInfo();
+               __pActiveCallInfo = new (std::nothrow) AppCallInfo();
                *__pActiveCallInfo = *pConfCallInfo;
 
                if (__formType == FORMTYPE_MULTIPLECALLS)
@@ -1097,7 +1174,7 @@ ActiveCallForm::HandleConfCallChanged(void)
        {
                //Held call is conference call - this is definitely multiple call screen.
                delete __pHeldCallInfo;
-               __pHeldCallInfo = new (std::nothrow) CallInfo();
+               __pHeldCallInfo = new (std::nothrow) AppCallInfo();
                *__pHeldCallInfo = *pConfCallInfo;
                pPeopleCountLbl = static_cast<Label*>(GetControl(IDC_NUMBER2_LABEL));
        }
@@ -1115,12 +1192,115 @@ ActiveCallForm::HandleConfCallChanged(void)
        //change AddCall Button status
        __pCallButtonsPanel->EnableAddCallButton(isEnableAddCall);
        //change JoinCall Button status
-       __pCallButtonsPanel->EnableJoinCallButton(isEnableJoinCall);
+       __pCallButtonsPanel->EnableJoinCallButton(__pCallPresentor->IsEnableJoinCallButton());
        AppLog("EXIT");
 }
 
 void
-ActiveCallForm::UpdateMultipleCallScreen(Tizen::Base::Collection::IListT<CallInfo>& activeCallsList)
+ActiveCallForm::OnContactsChanged(const Tizen::Base::Collection::IList& contactChangeInfoList)
+{
+       AppLog("Enter");
+       switch (__formType)
+       {
+
+       case FORMTYPE_OUTGOINGCALL:
+       case FORMTYPE_ACTIVECALL:
+       {
+               String pContactNumber;
+               pContactNumber.Append(__pActiveCallInfo->GetContactNumber());
+               Contact* pContact = __pCallPresentor->GetContactN(__pActiveCallInfo->GetContactNumber());
+               if(pContact == null)
+               {
+                       __pActiveCallInfo->ResetContactNumber(null);
+                       __pActiveCallInfo->ResetContactInfo(null);
+
+               }
+               else
+               {
+                       __pActiveCallInfo->SetContactNumber(pContactNumber);
+                       __pActiveCallInfo->SetContactInfo(*pContact);
+               }
+               if(pContact != null)
+               {
+                       delete pContact;
+                       pContact = null;
+               }
+               ShowPersonDetails(pContactNumber, IDC_NUMBER1_LABEL, IDC_CALLER1_LABEL, false,__pActiveCallInfo);
+       }
+       break;
+
+       case FORMTYPE_EMERGENCYACTIVECALL:
+       {
+       }
+       break;
+
+       case FORMTYPE_MULTIPLECALLS:
+       {
+
+               IListT<AppCallInfo>* pCallsList = __pCallPresentor->GetCallListN();
+               if(pCallsList != null)
+               {
+                       int listCount = pCallsList->GetCount();
+                       for(int index = 0; index < listCount; index++)
+                       {
+                               AppCallInfo callInfo;
+                               Contact* pContact;
+                               pCallsList->GetAt(index, callInfo);
+                               if(__pActiveCallInfo == null)
+                               {
+                                       __pActiveCallInfo = new (std::nothrow) AppCallInfo();
+                               }
+                               *__pActiveCallInfo =  callInfo;
+                               String contactNumber;
+                               contactNumber.Append(__pActiveCallInfo->GetContactNumber());
+                               pContact = __pCallPresentor->GetContactN(__pActiveCallInfo->GetContactNumber());
+                               if(pContact == null)
+                               {
+                                       __pActiveCallInfo->ResetContactNumber(null);
+                                       __pActiveCallInfo->ResetContactInfo(null);
+
+                               }
+                               else
+                               {
+                                       __pActiveCallInfo->SetContactNumber(contactNumber);
+                                       __pActiveCallInfo->SetContactInfo(*pContact);
+                               }
+                               if(pContact != null)
+                               {
+                                       delete pContact;
+                                       pContact = null;
+                               }
+                               if(callInfo.IsOnHold() == false)
+                               {
+                                       ShowPersonDetails(contactNumber, IDC_NUMBER1_LABEL, IDC_CALLER1_LABEL, false,__pActiveCallInfo);
+                               }
+                               else
+                               {
+                                       ShowPersonDetails(contactNumber, IDC_NUMBER2_LABEL, IDC_CALLER2_LABEL, true,__pActiveCallInfo);
+                               }
+
+                       }
+
+                       delete pCallsList;
+                       pCallsList = null;
+               }
+       }
+       break;
+       default:
+               break;
+       }
+       AppLog("Exit");
+}
+
+void
+ActiveCallForm::OnCategoriesChanged(const Tizen::Base::Collection::IList& categoryChangeInfoList)
+{
+       //No implementation
+}
+
+
+void
+ActiveCallForm::UpdateMultipleCallScreen(Tizen::Base::Collection::IListT<AppCallInfo>& activeCallsList)
 {
        AppLog("ENTER");
        if(__pActiveCallInfo != null)
@@ -1144,7 +1324,7 @@ ActiveCallForm::UpdateMultipleCallScreen(Tizen::Base::Collection::IListT<CallInf
        for (int index = 0; index < activeCallsList.GetCount(); index++)
        {
                //Fetch call info
-               CallInfo callInfo;
+               AppCallInfo callInfo;
                activeCallsList.GetAt(index, callInfo);
 
                String contactNo;
@@ -1159,7 +1339,7 @@ ActiveCallForm::UpdateMultipleCallScreen(Tizen::Base::Collection::IListT<CallInf
 
                if (callInfo.IsOnHold() == false)
                {
-                       __pActiveCallInfo = new (std::nothrow) CallInfo();
+                       __pActiveCallInfo = new (std::nothrow) AppCallInfo();
                        *__pActiveCallInfo =  callInfo;
 
                        if (__pActiveCallInfo->IsConferenceCall() == false)
@@ -1174,6 +1354,10 @@ ActiveCallForm::UpdateMultipleCallScreen(Tizen::Base::Collection::IListT<CallInf
                                        pMoreBtn->SetShowState(false);
                                }
                                ShowPersonDetails(contactNo, IDC_NUMBER1_LABEL, IDC_CALLER1_LABEL, false,__pActiveCallInfo);
+                               if(__pMoreOptionsListAnchor != null && __pMoreOptionsListAnchor->GetShowState() == true)
+                               {
+                                       CreateMoreOptionsMenuList();
+                               }
                        }
                        else
                        {
@@ -1220,7 +1404,7 @@ ActiveCallForm::UpdateMultipleCallScreen(Tizen::Base::Collection::IListT<CallInf
                }
                else
                {
-                       __pHeldCallInfo = new (std::nothrow) CallInfo();
+                       __pHeldCallInfo = new (std::nothrow) AppCallInfo();
                        *__pHeldCallInfo = callInfo;
 
                        if (__pHeldCallInfo->IsConferenceCall() == false)
@@ -1263,30 +1447,24 @@ ActiveCallForm::UpdateMultipleCallScreen(Tizen::Base::Collection::IListT<CallInf
        }
 
        //update JoinCall button status
-       bool isEnableJoinCall = true;
-       CallInfo* pConfCallInfo = __pCallPresentor->GetConferenceCallInfoN();
-       if(pConfCallInfo != null && pConfCallInfo->GetCallerListCount() >= IDI_MAX_CONF_CALL_PARTICIPANTS)
-       {
-               isEnableJoinCall = false;
-       }
-       __pCallButtonsPanel->EnableJoinCallButton(isEnableJoinCall);
-       delete pConfCallInfo;
-       pConfCallInfo = null;
+       __pCallButtonsPanel->EnableJoinCallButton(__pCallPresentor->IsEnableJoinCallButton());
        Invalidate(true);
        AppLog("EXIT");
 }
 
 void
-ActiveCallForm::ShowPersonDetails(const String& phoneNumber, const String& contactLblName, const String& nameLblName, bool isSecondCaller, CallInfo* pCallInfo)
+ActiveCallForm::ShowPersonDetails(const String& phoneNumber, const String& contactLblName, const String& nameLblName, bool isSecondCaller, AppCallInfo* pCallInfo)
 {
+       result r = E_FAILURE;
+
        //call individual methods to show contact number, caller name & photo
        ShowPhoneNumber(phoneNumber, contactLblName);
 
        //fetch contact details based on phone number
-       String* pDisplayName = pCallInfo->FetchCallerNameN();
+       String* pDisplayName = pCallInfo->FetchLatestCallerNameN(phoneNumber);
        ShowCallerName(*pDisplayName, nameLblName);
 
-       Bitmap* pPhotoBitmap = pCallInfo->FetchCallerPhotoN();
+       Bitmap* pPhotoBitmap = pCallInfo->FetchLatestCallerPhotoN(phoneNumber);
        ShowCallerPhoto(pPhotoBitmap, isSecondCaller);
 
        //free resources
@@ -1406,7 +1584,7 @@ ActiveCallForm::ShowCallerPhoto(Bitmap* pPhotoId, bool isSecondCaller)
        //Remove small photo label
        if (__pSmallPhotoLabel != null)
        {
-               RemoveControl(*__pSmallPhotoLabel);
+               RemoveControl(__pSmallPhotoLabel);
                __pSmallPhotoLabel = null;
        }
 
@@ -1464,6 +1642,7 @@ ActiveCallForm::ShowCallerPhoto(Bitmap* pPhotoId, bool isSecondCaller)
                        if (pPhotoLbl)
                        {
                                pPhotoLbl->SetBackgroundBitmap(*pDefaultPhoto);
+                               pPhotoLbl->Invalidate(true);
                        }
                        delete pDefaultPhoto;
                }
@@ -1508,7 +1687,7 @@ ActiveCallForm::ShowCallersPhotoThumbnail(const Bitmap& pPhotoId)
 {
        if (__pSmallPhotoLabel != null)
        {
-               RemoveControl(*__pSmallPhotoLabel);
+               RemoveControl(__pSmallPhotoLabel);
                __pSmallPhotoLabel = null;
        }
        //Draw Small Photo and show on small photo label
@@ -1517,7 +1696,7 @@ ActiveCallForm::ShowCallersPhotoThumbnail(const Bitmap& pPhotoId)
        __pSmallPhotoLabel->SetBackgroundColor(Color(0,0,0));
        __pSmallPhotoLabel->SetBackgroundBitmap(pPhotoId);
        // Add a Label to the Form
-       AddControl(*__pSmallPhotoLabel);
+       AddControl(__pSmallPhotoLabel);
        __pSmallPhotoLabel->Invalidate(true);
 }
 
@@ -1583,6 +1762,21 @@ ActiveCallForm::ShowTimerInfo(const String& timerLblName, bool isOnHold, long lo
 }
 
 void
+ActiveCallForm::SetHoldButtonShowState(bool showState)
+{
+       Label* pLblControl = static_cast<Label*>(GetControl(IDC_HOLD_LABEL));
+       if(pLblControl != null)
+       {
+               pLblControl->SetShowState(showState);
+       }
+       Button* pButtonControl = static_cast<Button*>(GetControl(IDC_HOLD_BUTTON));
+       if(pButtonControl != null)
+       {
+               pButtonControl->SetShowState(showState);
+       }
+}
+
+void
 ActiveCallForm::SetShowStateOnKeypad(bool showState)
 {
        Label* pLblControl = static_cast<Label*>(GetControl(IDC_CALLER1_LABEL));
@@ -1604,10 +1798,7 @@ ActiveCallForm::SetShowStateOnKeypad(bool showState)
                pLblControl->SetShowState(showState);
                pLblControl = static_cast<Label*>(GetControl(IDC_VOICE_CALL_ICON_LABEL));
                pLblControl->SetShowState(showState);
-               pLblControl = static_cast<Label*>(GetControl(IDC_HOLD_LABEL));
-               pLblControl->SetShowState(showState);
-               Button* pButtonControl = static_cast<Button*>(GetControl(IDC_HOLD_BUTTON));
-               pButtonControl->SetShowState(showState);
+               SetHoldButtonShowState(showState);
        }
        break;
 
@@ -1644,11 +1835,8 @@ ActiveCallForm::SetShowStateOnKeypad(bool showState)
        {
                pLblControl = static_cast<Label*>(GetControl(IDC_PARTICIPANTS_LABEL));
                pLblControl->SetShowState(showState);
-               pLblControl = static_cast<Label*>(GetControl(IDC_HOLD_LABEL));
-               pLblControl->SetShowState(showState);
-               Button* pButtonControl = static_cast<Button*>(GetControl(IDC_HOLD_BUTTON));
-               pButtonControl->SetShowState(showState);
-               pButtonControl = static_cast<Button*>(GetControl(IDC_CONF_CALL_MORE_BUTTON));
+               SetHoldButtonShowState(showState);
+               Button* pButtonControl = static_cast<Button*>(GetControl(IDC_CONF_CALL_MORE_BUTTON));
                pButtonControl->SetShowState(showState);
        }
        break;
@@ -1749,7 +1937,8 @@ ActiveCallForm::OnListViewItemStateChanged(ListView& listView, int index, int el
 {
        //Goto conference call list form
        SceneManager* pSceneManager = SceneManager::GetInstance();
-       pSceneManager->GoForward(ForwardSceneTransition(IDSCN_SCENE_CONFCALLLIST), null);
+       pSceneManager->GoForward(ForwardSceneTransition(IDSCN_SCENE_CONFCALLLIST, SCENE_TRANSITION_ANIMATION_TYPE_NONE,
+                        SCENE_HISTORY_OPTION_NO_HISTORY, SCENE_DESTROY_OPTION_KEEP), null);
 }
 
 void
@@ -1810,7 +1999,7 @@ ActiveCallForm::CreateItem(int index, int itemWidth)
        pTextElement->SetFont(font);
        //construct Enriched text
        EnrichedText* pEnrichedText = new (std::nothrow) EnrichedText();
-       Dimension textDimension;
+       FloatDimension textDimension;
        font.GetTextExtent(confCallName, confCallName.GetLength(), textDimension);
        textDimension.height = textDimension.height + font.GetDescender();
        pEnrichedText->Construct(textDimension);
@@ -1818,8 +2007,8 @@ ActiveCallForm::CreateItem(int index, int itemWidth)
        pEnrichedText->Add(*pTextElement);
 
        //Add Enriched text to pItem
-       Point textPos(((2 * IDI_OPTIONMENU_ITEM_SPACING) + W_MGR_CONFCALL_BITMAP), ((IDI_OPTIONMENU_DIMEN.height - textDimension.height) / 2));
-       pItem->AddElement(Rectangle(textPos, textDimension), 2, *pEnrichedText);
+       FloatPoint textPos(((2 * IDI_OPTIONMENU_ITEM_SPACING) + W_MGR_CONFCALL_BITMAP), ((IDI_OPTIONMENU_DIMEN.height - textDimension.height) / 2));
+       pItem->AddElement(FloatRectangle(textPos, textDimension), 2, *pEnrichedText);
        // Cleans up
        pEnrichedText->RemoveAll(true);
        delete pEnrichedText;
@@ -1832,3 +2021,10 @@ ActiveCallForm::DeleteItem(int index, ListItemBase* pItem, int itemWidth)
        delete pItem;
        return true;
 }
+
+void
+ActiveCallForm::OnForeground(void)
+{
+       AppLogDebug("Enter");
+       __pCallPresentor->OnAppForeground();
+}