Crash fix on receiving second call , Group ringtone playing
[apps/osp/Call.git] / src / CallIncomingCallForm.cpp
index 67eb1fb..fa067b7 100644 (file)
@@ -83,6 +83,7 @@ const int H_LIST_TEXT_ITEM = 111;
 const int X_SEND_TEXT_ITEM = 484;
 const int Y_SEND_TEXT_ITEM = 20;
 const int W_SEND_TEXT_ITEM = 220;
+const int W_SEND_BUTTON_MARGIN = 14;
 const int H_SEND_TEXT_ITEM = 72;
 const int X_PHOTO_LBL = 166;
 const int Y_PHOTO_LBL = 232;
@@ -217,17 +218,6 @@ IncomingCallForm::OnInitializing(void)
        }
        HideRejectPanel();
 
-       Button* pButtonRejectMessage = static_cast<Button*>(GetControl(IDC_REJECT_MESSAGE_BUTTON));
-       if (pButtonRejectMessage)
-       {
-               SetBitmapToRejectMessageButton(IDS_REJECT_MESSAGE_BTN,IDB_REJECT_MESSAGE_BG,
-                                                                          IDB_REJECT_MESSAGE_UP_ARROW, IDB_REJECT_MESSAGE_ICON, false, false);
-               SetBitmapToRejectMessageButton(IDS_REJECT_MESSAGE_BTN,IDB_REJECT_MESSAGE_BG,
-                                                                          IDB_REJECT_MESSAGE_UP_ARROW, IDB_REJECT_MESSAGE_ICON, false, true);
-               pButtonRejectMessage->SetActionId(IDA_SHOW_REJECT_CALL_MESSAGE_PANEL);
-               pButtonRejectMessage->AddActionEventListener(*this);
-       }
-
        //Get Reject list from Settings Manager
        IMapT<int,String>* pMsgMap = SettingsManager::GetInstance()->GetRejectMessageListN();
        if(pMsgMap != null)
@@ -582,11 +572,7 @@ IncomingCallForm::OnTerminating(void)
 }
 
 void
-IncomingCallForm::OnActionPerformed(const Control& source, int actionId)
-{
-       switch (actionId)
-       {
-       case IDA_SHOW_REJECT_CALL_MESSAGE_PANEL: // applicable in all form states
+IncomingCallForm::ShowRejectMessagePanel(void)
        {
                Panel* pKeysPanel = static_cast<Panel*>(GetControl(IDC_REJECT_PANEL));
                if (pKeysPanel)
@@ -608,6 +594,7 @@ IncomingCallForm::OnActionPerformed(const Control& source, int actionId)
                        }
 
                        pMessageList->SetBounds(tmpRect.x, tmpRect.y, tmpRect.width, listHeight);
+                       pMessageList->UpdateTableView();
                        tmpRect = pKeysPanel->GetBounds();
                        pKeysPanel->SetBounds(tmpRect.x, tmpRect.y, tmpRect.width, H_MESSAGE_BG_BITMAP /*+ H_REJECT_VIEW_FOOTER*/ + listHeight);
 
@@ -619,17 +606,6 @@ IncomingCallForm::OnActionPerformed(const Control& source, int actionId)
 
                        ShowRejectMessageFooter();
 
-               /*      pButtonReject = static_cast<Button*>(pKeysPanel->GetControl(IDC_BACK_BUTTON));
-                       pButtonReject->SetActionId(IDA_CANCEL_REJECT_CALL_MESSAGE_PANEL);
-                       pButtonReject->AddActionEventListener(*this);
-                       pButtonReject->SetEnabled(true);
-                       pButtonReject->SetFocus();
-
-                       Button* pButtonCreate = static_cast<Button*>(pKeysPanel->GetControl(IDC_CREATE_BUTTON));
-                       pButtonCreate->SetActionId(IDA_CREATE_REJECT_CALL_MESSAGE);
-                       pButtonCreate->AddActionEventListener(*this);
-                       pButtonCreate->SetEnabled(true);
-                       pButtonCreate->SetFocus();*/
 
                        pKeysPanel->SetFocus();
                        pKeysPanel->Draw();
@@ -642,12 +618,39 @@ IncomingCallForm::OnActionPerformed(const Control& source, int actionId)
                        pButtonRejectMessage->Draw();
                }
        }
+void
+IncomingCallForm::HideRejectMessagePanel(void)
+{
+       HideRejectPanel();
+       Button* pButtonRejectMessage = static_cast<Button*>(GetControl(IDC_REJECT_MESSAGE_BUTTON));
+       if (pButtonRejectMessage)
+       {
+               pButtonRejectMessage->SetShowState(true);
+               RelativeLayout* pRelativeLayout = dynamic_cast<RelativeLayout*>(GetLandscapeLayoutN());
+               if (pRelativeLayout != null)
+               {
+                       pRelativeLayout->SetRelation(*pButtonRejectMessage,*this,RECT_EDGE_RELATION_BOTTOM_TO_BOTTOM);
+                       pRelativeLayout->Update();
+                       delete pRelativeLayout;
+               }
+       }
+}
+
+void
+IncomingCallForm::OnActionPerformed(const Control& source, int actionId)
+{
+       switch (actionId)
+       {
+       case IDA_SHOW_REJECT_CALL_MESSAGE_PANEL: // applicable in all form states
+       {
+               ShowRejectMessagePanel();
+       }
        break;
 
        case IDA_CREATE_REJECT_CALL_MESSAGE:
        {
                __pCallPresentor->RejectCall(__incomingCallHandle, true,*__pActiveContactNo);
-               ArrayListT<CallInfo>* pCallList  = static_cast<ArrayListT<CallInfo>*>(__pCallPresentor->GetCallListN());
+               ArrayListT<AppCallInfo>* pCallList  = static_cast<ArrayListT<AppCallInfo>*>(__pCallPresentor->GetCallListN());
                if(pCallList != null && pCallList->GetCount() > 0)
                {
                        __pCallPresentor->HandleCallConnected(*pCallList);
@@ -658,21 +661,7 @@ IncomingCallForm::OnActionPerformed(const Control& source, int actionId)
 
        case IDA_CANCEL_REJECT_CALL_MESSAGE_PANEL:
        {
-               HideRejectPanel();
-               SetFocus();
-               Button* pButtonRejectMessage = static_cast<Button*>(GetControl(IDC_REJECT_MESSAGE_BUTTON));
-               if (pButtonRejectMessage)
-               {
-                       pButtonRejectMessage->SetShowState(true);
-                       RelativeLayout* pRelativeLayout = dynamic_cast<RelativeLayout*>(GetLandscapeLayoutN());
-                       if (pRelativeLayout != null)
-                       {
-                               pRelativeLayout->SetRelation(*pButtonRejectMessage,*this,RECT_EDGE_RELATION_BOTTOM_TO_BOTTOM);
-                               pRelativeLayout->Update();
-                               delete pRelativeLayout;
-                       }
-               }
-
+               HideRejectMessagePanel();
        }
        break;
 
@@ -732,6 +721,9 @@ void
 IncomingCallForm::OnSceneActivatedN(const SceneId& previousSceneId,    const SceneId& currentSceneId, IList* pArgs)
 {
        AddOrientationEventListener(*this);
+       //listen to Foreground events
+       CallApp* pPhoneApp = static_cast<CallApp*>(CallApp::GetInstance());
+       pPhoneApp->AddAppStateChangeListener(*this);
        if(__pCallPresentor == null)
        {
                __pCallPresentor = CallPresentationModel::GetInstance();
@@ -782,7 +774,7 @@ IncomingCallForm::OnSceneActivatedN(const SceneId& previousSceneId, const SceneI
        if (pArgs != null)
        {
                //get Call Info
-               CallInfo* pIncomingCall = static_cast<CallInfo*>(pArgs->GetAt(0));
+               AppCallInfo* pIncomingCall = static_cast<AppCallInfo*>(pArgs->GetAt(0));
                if (pIncomingCall != null)
                {
                        //start alert with contact's custom ringtone
@@ -823,7 +815,16 @@ IncomingCallForm::OnSceneActivatedN(const SceneId& previousSceneId,        const SceneI
        }
        CallApp* pCallApp = static_cast<CallApp*>(CallApp::GetInstance());
        pCallApp->SetTopMostWindow(true);
-
+       Button* pButtonRejectMessage = static_cast<Button*>(GetControl(IDC_REJECT_MESSAGE_BUTTON));
+       if (pButtonRejectMessage)
+       {
+               SetBitmapToRejectMessageButton(IDS_REJECT_MESSAGE_BTN,IDB_REJECT_MESSAGE_BG,
+                                                                          IDB_REJECT_MESSAGE_UP_ARROW, IDB_REJECT_MESSAGE_ICON, false, false);
+               SetBitmapToRejectMessageButton(IDS_REJECT_MESSAGE_BTN,IDB_REJECT_MESSAGE_BG,
+                                                                          IDB_REJECT_MESSAGE_UP_ARROW, IDB_REJECT_MESSAGE_ICON, false, true);
+               pButtonRejectMessage->SetActionId(IDA_SHOW_REJECT_CALL_MESSAGE_PANEL);
+               pButtonRejectMessage->AddActionEventListener(*this);
+       }
 
 }
 
@@ -868,6 +869,7 @@ IncomingCallForm::OnSceneDeactivated(const SceneId& currentSceneId, const SceneI
        }
        CallApp* pCallApp = static_cast<CallApp*>(CallApp::GetInstance());
        pCallApp->SetTopMostWindow(false);
+       pCallApp->RemoveAppStateChangeListener(*this);
 }
 
 result
@@ -976,7 +978,7 @@ IncomingCallForm::CreateItem(int itemIndex, int itemWidth)
        {
                String sendText = AppUtility::GetResourceString(IDS_LIST_SEND_BUTTON);
                Button* pSendButton = new (std::nothrow) Button();
-               pSendButton->Construct(Rectangle(X_SEND_TEXT_ITEM, Y_SEND_TEXT_ITEM, W_SEND_TEXT_ITEM, H_SEND_TEXT_ITEM), sendText);
+               pSendButton->Construct(Rectangle(GetClientAreaBounds().width - W_SEND_BUTTON_MARGIN -W_SEND_TEXT_ITEM, Y_SEND_TEXT_ITEM, W_SEND_TEXT_ITEM, H_SEND_TEXT_ITEM), sendText);
                //set action id and listener
                int actionId = IDA_SEND_REJECT_MSG1;
                switch(itemIndex)
@@ -1028,7 +1030,7 @@ IncomingCallForm::GetDefaultItemHeight(void)
 }
 
 void
-IncomingCallForm::ShowPersonDetails(const String& phoneNumber, const String& contactLblName, const String& nameLblName, CallInfo* pCallInfo)
+IncomingCallForm::ShowPersonDetails(const String& phoneNumber, const String& contactLblName, const String& nameLblName, AppCallInfo* pCallInfo)
 {
        //call individual methods to show contact number, caller name & photo
        SetTextToLabel(phoneNumber, contactLblName);
@@ -1219,7 +1221,7 @@ IncomingCallForm::SetBitmapToRejectMessageButton(const String& btnName, const St
 
        //set button name
        String holdBtnName = AppUtility::GetResourceString(btnName);
-       Dimension textDimension;
+       FloatDimension textDimension;
        if (!holdBtnName.IsEmpty())
        {
                Font font;
@@ -1311,20 +1313,21 @@ IncomingCallForm::OnTouchPressed(const Control& source, const Point& currentPosi
 void
 IncomingCallForm::OnTouchReleased(const Control& source, const Point& currentPosition, const TouchEventInfo& touchInfo)
 {
+       AppLogDebug("%d",currentPosition.x);
        if (__isAnswerCallStarted == true)
        {
-               if (currentPosition.x > REJECT_LABEL_X_OFFSET)
+               if (currentPosition.x > __pRejectLabel->GetBounds().x)
                {
                        //Right reject icon
                        if(__pRejectFinalVisElem == null)
                        {
                                __pRejectFinalVisElem = new (std::nothrow) VisualElement();
+                               __pRejectFinalVisElem->Construct();
+                               __pRejectFinalVisElem->SetName(IDI_REJECT_FINAL_VISUAL_ELE_NAME);
                        }
-                       __pRejectFinalVisElem->Construct();
                        __pRejectFinalVisElem->SetBounds(FloatRectangle(0, 0, W_DIAL_LABEL, H_DIAL_LABEL));
                        __pRejectFinalVisElem->SetShowState(true);
                        __pRejectFinalVisElem->SetOpacity(1.00f);
-                       __pRejectFinalVisElem->SetName(IDI_REJECT_FINAL_VISUAL_ELE_NAME);
                        if(__pRejectLabel->GetVisualElement()->GetChild(IDI_REJECT_FINAL_VISUAL_ELE_NAME,true) == null)
                        {
                                AppLogDebug("AttachChild __pRejectFinalVisElem");
@@ -1342,11 +1345,11 @@ IncomingCallForm::OnTouchReleased(const Control& source, const Point& currentPos
 
                        __pAcceptVisElem->SetOpacity(0.0f);
                        //fetch already active call list
-                       ArrayListT<CallInfo>* pCallList  = static_cast<ArrayListT<CallInfo>*>(__pCallPresentor->GetCallListN());
+                       ArrayListT<AppCallInfo>* pCallList  = static_cast<ArrayListT<AppCallInfo>*>(__pCallPresentor->GetCallListN());
                        if (pCallList != null && pCallList->GetCount() > 0)
                        {
                                //then atleast 1 active call exist.
-                               CallInfo phnCallInfo;
+                               AppCallInfo phnCallInfo;
                                pCallList->GetAt(0,phnCallInfo);
                                //Check if only 1 call exist and it is on Hold
                                if(pCallList->GetCount() == 1 && phnCallInfo.IsOnHold())
@@ -1388,18 +1391,19 @@ IncomingCallForm::OnTouchReleased(const Control& source, const Point& currentPos
        }
        else if (__isRejectCallStarted == true)
        {
-               if (currentPosition.x < ACCEPT_LABEL_RELATIVE_POS)
+               if (currentPosition.x < ((__pAcceptLabel->GetBounds().x + __pAcceptLabel->GetWidth())- __pRejectLabel->GetBounds().x))
                {
                        //left dial icon
                        if(__pAcceptFinalVisElem == null)
                        {
                                __pAcceptFinalVisElem = new (std::nothrow) VisualElement();
+                               __pAcceptFinalVisElem->Construct();
+                               __pAcceptFinalVisElem->SetName(IDI_ACCEPT_FINAL_VISUAL_ELE_NAME);
                        }
-                       __pAcceptFinalVisElem->Construct();
                        __pAcceptFinalVisElem->SetBounds(FloatRectangle(0, 0, W_DIAL_LABEL, H_DIAL_LABEL));
-                       __pAcceptFinalVisElem->SetShowState(true);
                        __pAcceptFinalVisElem->SetOpacity(1.0f);
-                       __pAcceptFinalVisElem->SetName(IDI_ACCEPT_FINAL_VISUAL_ELE_NAME);
+
+
                        if(__pAcceptLabel->GetVisualElement()->GetChild(IDI_ACCEPT_FINAL_VISUAL_ELE_NAME,true) == null)
                        {
                                AppLogDebug("AttachChild __pAcceptFinalVisElem");
@@ -1472,7 +1476,6 @@ IncomingCallForm::OnTouchMoved(const Control& source, const Point& currentPositi
 void
 IncomingCallForm::OnItemSelected(int itemIndex)
 {
-
        ArrayList* pArgs = new (std::nothrow) ArrayList(SingleObjectDeleter);
        pArgs->Construct();
 
@@ -1480,7 +1483,6 @@ IncomingCallForm::OnItemSelected(int itemIndex)
        Integer* argIndex = new (std::nothrow) Integer(itemIndex);
        pArgs->Add(argIndex);
        SendUserEvent(REQUEST_ITEM_SELECTED,pArgs);
-
 }
 
 void
@@ -1498,37 +1500,27 @@ IncomingCallForm::HandleMultipleCallSelection(int itemIndex)
        __pAcceptVisElem->SetOpacity(1.0f);
        __pRejectVisElem->SetOpacity(1.00f);
 
-       for (int i = 0; i < COUNT_ARROW_ELEMENTS; i++)
-       {
-               __pRejectArrowLabel = static_cast<Label*>(__pRejectArrowLabelsList->GetAt(i));
-               String RejectVisualEleName(IDI_REJECT_ARROW_VISUAL_ELE_NAME);
-               RejectVisualEleName.Append(i);
-               __pRejectArrowVisElem = __pRejectArrowLabel->GetVisualElement()->GetChild(RejectVisualEleName,true);
-               __pRejectArrowVisElem->SetOpacity(0.0f);
-               __pAcceptArrowLabel = static_cast<Label*>(__pAcceptArrowLabelsList->GetAt(i));
-               String AcceptVisualEleName(IDI_ACCEPT_ARROW_VISUAL_ELE_NAME);
-               AcceptVisualEleName.Append(i);
-               __pAcceptArrowVisElem = __pAcceptArrowLabel->GetVisualElement()->GetChild(AcceptVisualEleName,true);
-               __pAcceptArrowVisElem->SetOpacity(0.0f);
-       }
        if (__pRejectFinalVisElem != null)
        {
                __pRejectFinalVisElem->Destroy();
                __pRejectFinalVisElem = null;
        }
-
        if (__pAcceptFinalVisElem != null)
        {
                __pAcceptFinalVisElem->Destroy();
                __pAcceptFinalVisElem = null;
        }
+
        if (__pOptionPopup)
        {
                delete __pOptionPopup;
                __pOptionPopup = null;
        }
        //accept call
-       __pCallPresentor->AcceptIncomingCall(CallAnsweringOptions(itemIndex),__incomingCallHandle);
+       if(itemIndex != IDA_BUTTON_CANCEL_OPTIONS_POPUP)
+       {
+               __pCallPresentor->AcceptIncomingCall(CallAnsweringOptions(itemIndex),__incomingCallHandle);
+       }
 }
 
 void
@@ -1571,13 +1563,85 @@ IncomingCallForm::OnFormBackRequested(Tizen::Ui::Controls::Form& source)
 void
 IncomingCallForm::OnOrientationChanged(const Control& source, OrientationStatus orientationStatus)
 {
+       Panel* pKeysPanel = static_cast<Panel*>(GetControl(IDC_REJECT_PANEL));
+       if(pKeysPanel->GetShowState() == true)
+       {
+               HideRejectMessagePanel();
+               ShowRejectMessagePanel();
+       }
+
        Button* pButtonRejectMessage = static_cast<Button*>(GetControl(IDC_REJECT_MESSAGE_BUTTON));
-       if (pButtonRejectMessage)
+       if (pButtonRejectMessage != null)
        {
                SetBitmapToRejectMessageButton(IDS_REJECT_MESSAGE_BTN,IDB_REJECT_MESSAGE_BG,
                                                                           IDB_REJECT_MESSAGE_UP_ARROW, IDB_REJECT_MESSAGE_ICON, false, false);
                SetBitmapToRejectMessageButton(IDS_REJECT_MESSAGE_BTN,IDB_REJECT_MESSAGE_BG,
                                                                           IDB_REJECT_MESSAGE_UP_ARROW, IDB_REJECT_MESSAGE_ICON, false, true);
+               pButtonRejectMessage->Invalidate(true);
        }
 
+       Button* pButtonReject = static_cast<Button*>(pKeysPanel->GetControl(IDC_REJECT_MESSAGE_CANCEL_BUTTON));
+       if (pButtonReject != null)
+       {
+               SetBitmapToRejectMessageButton(IDS_REJECT_MESSAGE_BTN,IDB_REJECT_MESSAGE_BG,
+                                                                          IDB_REJECT_MESSAGE_DOWN_ARROW, IDB_REJECT_MESSAGE_ICON, true, false);
+               SetBitmapToRejectMessageButton(IDS_REJECT_MESSAGE_BTN,IDB_REJECT_MESSAGE_BG,
+                                                                          IDB_REJECT_MESSAGE_DOWN_ARROW, IDB_REJECT_MESSAGE_ICON, true, true);
+               pButtonReject->Invalidate(true);
+       }
+}
+
+void
+IncomingCallForm::OnForeground(void)
+{
+       __pCallPresentor->OnAppForeground();
+}
+
+void
+IncomingCallForm::CallDisconnected(void)
+{
+       //check if no call option popup is shown, then remain on incoming call screen.
+       //As user has neither accepted nor rejected incoming call.
+       if (__pOptionPopup == null)
+       {
+               return;
+       }
+
+       //fetch already active call list and show updated option popup
+       ArrayListT<AppCallInfo>* pCallList  = static_cast<ArrayListT<AppCallInfo>*>(__pCallPresentor->GetCallListN());
+       if (pCallList != null && pCallList->GetCount() > 0)
+       {
+               //then atleast 1 active call exist.
+               AppCallInfo phnCallInfo;
+               pCallList->GetAt(0,phnCallInfo);
+               //Check if only 1 call exist and it is on Hold
+               if(pCallList->GetCount() == 1 && phnCallInfo.IsOnHold())
+               {
+                       //directly accept call
+                       __pCallPresentor->AcceptIncomingCall(ANSERWING_OPTION_ACCEPT_CALL,__incomingCallHandle);
+               }
+               else
+               {
+                       //Either 1 call exist and not "on Hold".
+                       //Or 2 calls exist.
+                       if(__pOptionPopup != null)
+                       {
+                               delete __pOptionPopup;
+                               __pOptionPopup = null;
+                       }
+                       __pOptionPopup = new (std::nothrow) CallOptionPopup(*this,*(__pCallPresentor));
+                       __pOptionPopup->Initialize();
+                       __pOptionPopup->SetShowState(true);
+                       __pOptionPopup->Draw();
+                       __pOptionPopup->Show();
+               }
+               pCallList->RemoveAll();
+       }
+       else
+       {
+               //no active call - Accept the  incoming call
+               __pCallPresentor->AcceptIncomingCall(ANSERWING_OPTION_ACCEPT_CALL,__incomingCallHandle);
+       }
+       delete pCallList;
+       pCallList = null;
 }